V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
nezhazheng
V2EX  ›  程序员

线程池大小的设置

  •  
  •   nezhazheng · 2014-10-03 21:02:32 +08:00 · 4042 次点击
    这是一个创建于 3736 天前的主题,其中的信息可能已经有所发展或是发生改变。
    按照我的理解,一个processor在同一时间点只会处理一个线程,那么为什么我们还有设置超过核数的线程大小,这不是额外增加上下文切换的开销吗?

    还是我的理解不对,比如线程在处理IO Event的时候(read,write),processor可以同时调度其他的线程并行执行。
    7 条回复    2014-10-04 07:53:23 +08:00
    niuhf0452
        1
    niuhf0452  
       2014-10-03 21:28:37 +08:00
    处理IO的时候cpu确实会释放出来,当然就可以执行其他线程了。
    chocotan
        2
    chocotan  
       2014-10-03 21:34:00 +08:00
    之前看某java并发的书时看到
    线程数=CPU核心数量/(1-阻塞系数)
    阻塞系数=系统在IO上消耗的时间/CPU密集任务消耗时间
    nezhazheng
        3
    nezhazheng  
    OP
       2014-10-03 21:56:48 +08:00
    @niuhf0452 那也就是说,在cpu处于iowait状态时,它同时还能调度出来跑其他的?
    如果这样子,下面这三种状态是怎么计算的呢,处理IO的时候属于iowait,如果调度其他线程是不是还会算usr呢?

    %usr %sys %iowait
    nezhazheng
        4
    nezhazheng  
    OP
       2014-10-03 22:00:27 +08:00
    @chocotan 挺有意思,也就是说IO的比重越大,线程数越高是吧
    tonychin
        5
    tonychin  
       2014-10-03 23:19:43 +08:00
    首先要根据任务执行的CPU周期考虑任务类型,是CPU计算密集型还是IO处理(或是其他阻塞)密集型。
    CPU计算密集型的线程池大小一般设置为CPU数+1。
    IO处理(或是其他阻塞)型任务就要考虑 @chocotan 说的阻塞系数来确定。
    其次还应该考虑其他因素比如说可用资源(内存大小,数据库连接池大小等)对任务数量的约束。
    nezhazheng
        6
    nezhazheng  
    OP
       2014-10-03 23:38:14 +08:00
    @tonychin
    谢谢,我还是不太明白在IO Block的时候,如果还会调度其他thread运行,CPU使用是计算在下面的哪一种,是iowait吗,如果又调度了其他thread运行,是不是usr或者sys也要把时间计算上去?
    %usr %sys %iowait
    niuhf0452
        7
    niuhf0452  
       2014-10-04 07:53:23 +08:00
    @nezhazheng 不知道算作哪类,没研究过。另外,那个公式不知道什么原理。但是实际情况中,一个应用往往是重IO或者重cpu,所以IO比重越大线程数量越多的说法应该说不通。或者说,只有将重IO任务和重cpu任务放在同一个线程池里,这个公式才能说通。这样的应用恐怕不多,比如压缩解压工具?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3010 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 13:58 · PVG 21:58 · LAX 05:58 · JFK 08:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.