线程池大小估算

转载自 https://www.cnblogs.com/atomicbomb/p/7692770.html

# 答案:N核服务器,通过日志分析出任务执行过程中,本地计算时间为x,等待时间(网络传输,rpc等待等)为y,则工作线程数(线程池线程数)设置为 N*(x+y)/x

Web-Server通常有个配置,最大工作线程数,后端服务一般也有个配置,工作线程池的线程数量,这个线程数的配置不同的业务架构师有不同的经验值,有些业务设置为CPU核数的2倍,有些业务设置为CPU核数的8倍,有些业务设置为CPU核数的32倍。 “工作线程数”的设置依据是什么,到底设置为多少能够最大化CPU性能,是本文要讨论的问题。

二、共性认知 在进行进一步深入讨论之前,先以提问的方式就一些共性认知达成一致。

问:工作线程数是不是设置的越大越好?

答:肯定不是的 服务器CPU核数有限,能够同时并发的线程数有限,单核CPU设置10000个工作线程没有意义 线程切换是有开销的,如果线程切换过于频繁,反而会使性能降低

问:调用sleep()函数的时候,线程是否一直占用CPU?

答:不占用,等待时会把CPU让出来,给其他需要CPU资源的线程使用。 不止sleep()函数,在进行一些阻塞调用时,例如网络编程中的: 阻塞accept(),等待客户端连接 阻塞recv(),等待下游回包 都不占用CPU资源。

问:单核CPU,设置多线程有意义么,是否能提高并发性能?

答:即使是单核,使用多线程也是有意义的,大多数情况也能提高并发 多线程编码可以让代码更加清晰,例如:IO线程收发包,Worker线程进行任务处理,Timeout线程进行超时检测 如果有一个任务一直占用CPU资源在进行计算,此时增加线程并不能增加并发,例如以下代码会一直占用CPU,并使得CPU占用率达到100%:

  while(1){ i++; }

通常来说,Worker线程一般不会一直占用CPU进行计算,此时即使CPU是单核,增加Worker线程也能够提高并发,因为这个线程在休息的时候,其他的线程可以继续工作

经验

一般来说,非CPU密集型的业务(加解密、压缩解压缩、搜索排序等业务是CPU密集型的业务),瓶颈都在后端数据库访问或者RPC调用,本地CPU计算的时间很少,所以设置几十或者几百个工作线程是能够提升吞吐量的。

六、总结

    • 线程数不是越多越好

    • sleep()不占用CPU

    • 单核设置多线程不但能使得代码清晰,还能提高吞吐量

    • 站点和服务最常用的线程模型是“IO线程与工作现场通过任务队列解耦”,此时设置多工作线程可以提升吞吐量

    • N核服务器,通过日志分析出任务执行过程中,本地计算时间为x等待时间为y,则工作线程数(线程池线程数)设置为 N*(x+y)/x,能让CPU的利用率最大化

原文地址:https://www.cnblogs.com/canda/p/7835853.html