作者:空无
来源链接:https://juejin.cn/post/6948034657321484318
可能很多人都看到过一个线程数设置的理论:
- CPU 密集型的程序 - 核心数 + 1
- I/O 密集型的程序 - 核心数 * 2
不会吧,不会吧,真的有人按照这个理论规划线程数?
线程数和CPU利用率的小测试
抛开一些操作系统,计算机原理不谈,说一个基本的理论(不用纠结是否严谨,只为好理解): 一个CPU核心,单位时间内只能执行一个线程的指令 ** 那么理论上,我一个线程只需要不停的执行指令,就可以跑满一个核心的利用率。
来写个死循环空跑的例子验证一下:
测试环境:AMD Ryzen 5 3600, 6 - Core, 12 - Threads
public class CPUUtilizationTest {
public static void main(String[] args) {
//死循环,什么都不做
while (true){
}
}
}
复制代码
运行这个例子后,来看看现在CPU的利用率: 从图上可以看到,我的3号核心利用率已经被跑满了
那基于上面的理论,我多开几个线程试试呢?
public class CPUUtilizationTest {
public static void main(String[] args) {
for (int j = 0; j < 6; j++) {
new Thread(new Runnable() {
@Override
public void run() {
while (true){
}
}
}).start();
}
}
}
复制代码
此时再看CPU利用率,1/2/5/7/9/11 几个核心的利用率已经被跑满: 那如果开12个线程呢,是不是会把所有核心的利用率都跑满?答案一定是会的: 如果此时我把上面例子的线程数继续增加到24个线程,会出现什么结果呢? 从上图可以看到,CPU利用率和上一步一样,还是所有核心100%,不过此时负载已经从11.x增加到了22.x(load average解释参考scoutapm.com/blog/unders…),说明