将队列大小从默认的100000增加到500000有什么影响?
是否有经验法则来计算合理的最大数量 使用可用资源(例如RAM,CPU内核和其他任何资源)的队列大小。
任何建议将不胜感激。
答案 0 :(得分:2)
它不会影响CPU,但是对内存的影响有限。队列保留在内存中(例如,在服务器重启后将无法生存),并且需要跟踪您正在馈入队列中每个任务的所有参数。如果您向他们每个人提供100万个ID的列表,那将比只给每个10或1个ID花费更多。
还请记住,任务服务器只有有限的线程(通常为16个)来处理队列。增加确实会影响CPU,并且与增加队列大小相比,对内存的影响可能更大。通常,将队列大小数字加零是相当安全的。
HTH!
答案 1 :(得分:1)
一旦队列大小超过线程并发性,影响主要是延迟与早期错误。队列越大,插入“作业”与到达“ 开始”之间的等待时间就越大。队列大小的“上限”越大,在您主动注意到潜在的巨大延迟之前,时间越长。在某些工作负载中,巨大的缓冲和延迟是可以的,而在其他工作负载中则是灾难。由于它不是优先级队列(这是一个fifo),因此要想将“紧急工作”带到生产线的顶部并不是一件容易的事-您必须等待它或开始编写专门的调度和队列管理来满足您的业务需求。 “痛点”通常是相反的-问自己,在将作业输入队列与开始运行之间的最大时间是多少。取该数字,再除以作业的平均执行时间,再除以队列线程大小(只要它的大小小于实际的硬件并发数即可),这就是最大队列大小。
Time to Start Job = Current Length of queue * Time per job / Number of (real) threads.
Maximum (or average working) queue size == (Maximum Latency * threads ) / Time per job
餐巾数学:假设以下球形元素:
Jobs = 100ms/each Thread Count = 16 (real cores) Max acceptable latency = 10 seconds
----------------------------- Queue Size Limit = 10*16/.1 = 1600
If your max latency is 10000 seconds then q=1600000
If your max latency is 1 sec then q=160
对于二阶因素-当您推动并发性和加载时,锁争用的机会会增加-非线性(取决于您的代码详细信息)-请注意这一点。密切关注锁争用,io等待等的监视历史记录。 在这种情况下,减少线程数可能比减少队列大小更好。