线程池大小的设置

2014-10-03 21:02:32 +08:00
 nezhazheng
按照我的理解,一个processor在同一时间点只会处理一个线程,那么为什么我们还有设置超过核数的线程大小,这不是额外增加上下文切换的开销吗?

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

%usr %sys %iowait
nezhazheng
2014-10-03 22:00:27 +08:00
@chocotan 挺有意思,也就是说IO的比重越大,线程数越高是吧
tonychin
2014-10-03 23:19:43 +08:00
首先要根据任务执行的CPU周期考虑任务类型,是CPU计算密集型还是IO处理(或是其他阻塞)密集型。
CPU计算密集型的线程池大小一般设置为CPU数+1。
IO处理(或是其他阻塞)型任务就要考虑 @chocotan 说的阻塞系数来确定。
其次还应该考虑其他因素比如说可用资源(内存大小,数据库连接池大小等)对任务数量的约束。
nezhazheng
2014-10-03 23:38:14 +08:00
@tonychin
谢谢,我还是不太明白在IO Block的时候,如果还会调度其他thread运行,CPU使用是计算在下面的哪一种,是iowait吗,如果又调度了其他thread运行,是不是usr或者sys也要把时间计算上去?
%usr %sys %iowait
niuhf0452
2014-10-04 07:53:23 +08:00
@nezhazheng 不知道算作哪类,没研究过。另外,那个公式不知道什么原理。但是实际情况中,一个应用往往是重IO或者重cpu,所以IO比重越大线程数量越多的说法应该说不通。或者说,只有将重IO任务和重cpu任务放在同一个线程池里,这个公式才能说通。这样的应用恐怕不多,比如压缩解压工具?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/136933

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX