JProfiler Net I/O、Waiting线程CPU负载及CPU使用率差异问询
压力测试问题解答
关于Net I/O、Waiting线程状态的CPU负载特性
- Net I/O线程状态:该状态下线程处于网络数据收发的阻塞等待阶段(比如调用Socket读写方法时进入阻塞),此时线程不会占用CPU时间片,属于低CPU负载操作。
- Waiting线程状态:线程处于等待唤醒的挂起状态(比如执行
Object.wait()、Thread.join()等方法),会主动释放CPU资源,同样属于低CPU负载操作。
为何线程数不同的场景CPU使用率差异显著,但Runnable线程耗时相近
核心原因是单CPU核心下的线程上下文切换开销与调度损耗:
- 单CPU核心只能同时执行1个线程,40线程场景下操作系统需要频繁在大量线程间切换上下文——保存当前线程的寄存器、栈帧状态,加载下一个线程的运行数据,这个过程会消耗额外的CPU资源,直接推高整体CPU使用率;而10线程场景上下文切换频率低,额外开销少。
- 你统计的“Runnable线程耗时”应该仅覆盖了线程执行业务逻辑的时间,并未包含操作系统调度线程、切换上下文的额外CPU消耗。40线程场景中,这些调度和切换的开销被计入了CPU使用率统计,但未体现在业务逻辑耗时里,所以出现了业务耗时相近但CPU使用率差异大的情况。
- 40线程场景下Net I/O耗时增加,意味着更多线程会在I/O阻塞后被唤醒,进一步提升了线程调度的频率,放大了上下文切换带来的CPU开销。
内容的提问来源于stack exchange,提问作者Che ZY
相关产品推荐
相关产品推荐

