1
niuhf0452 2014-10-03 21:28:37 +08:00
处理IO的时候cpu确实会释放出来,当然就可以执行其他线程了。
|
2
chocotan 2014-10-03 21:34:00 +08:00
之前看某java并发的书时看到
线程数=CPU核心数量/(1-阻塞系数) 阻塞系数=系统在IO上消耗的时间/CPU密集任务消耗时间 |
3
nezhazheng OP @niuhf0452 那也就是说,在cpu处于iowait状态时,它同时还能调度出来跑其他的?
如果这样子,下面这三种状态是怎么计算的呢,处理IO的时候属于iowait,如果调度其他线程是不是还会算usr呢? %usr %sys %iowait |
4
nezhazheng OP @chocotan 挺有意思,也就是说IO的比重越大,线程数越高是吧
|
5
tonychin 2014-10-03 23:19:43 +08:00
首先要根据任务执行的CPU周期考虑任务类型,是CPU计算密集型还是IO处理(或是其他阻塞)密集型。
CPU计算密集型的线程池大小一般设置为CPU数+1。 IO处理(或是其他阻塞)型任务就要考虑 @chocotan 说的阻塞系数来确定。 其次还应该考虑其他因素比如说可用资源(内存大小,数据库连接池大小等)对任务数量的约束。 |
6
nezhazheng OP @tonychin
谢谢,我还是不太明白在IO Block的时候,如果还会调度其他thread运行,CPU使用是计算在下面的哪一种,是iowait吗,如果又调度了其他thread运行,是不是usr或者sys也要把时间计算上去? %usr %sys %iowait |
7
niuhf0452 2014-10-04 07:53:23 +08:00
@nezhazheng 不知道算作哪类,没研究过。另外,那个公式不知道什么原理。但是实际情况中,一个应用往往是重IO或者重cpu,所以IO比重越大线程数量越多的说法应该说不通。或者说,只有将重IO任务和重cpu任务放在同一个线程池里,这个公式才能说通。这样的应用恐怕不多,比如压缩解压工具?
|