zoukankan      html  css  js  c++  java
  • 线程池大小估算

    转载自 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的利用率最大化

  • 相关阅读:
    Beetl 3中文文档 转载 http://ibeetl.com/guide/
    Beetl模板引擎入门教程
    Spring+Stomp+ActiveMq实现websocket长连接
    5672端口引发的一个大坑
    GeoServer中WMS、WFS的请求规范
    常用网址
    JAVA方法参数传递
    针对开发的缺陷管理
    不同逻辑顺序产生相同的结果编码如何决策
    怎样做一个软件项目经理
  • 原文地址:https://www.cnblogs.com/canda/p/7835853.html
Copyright © 2011-2022 走看看