一、环境说明
闲暇之余,做个小测试,笔记以加深印象,仅学习使用
操作系统:CentOS 7.9
CPU:2个CPU,每个CPU 5核,共10核
二、代码说明
起一个线程,死循环不中断,那这个线程会占用这个一个CPU核心,并将其打满100%。由此,我们要将整个操作系统的CPU吃满就很简单了,起10个线程即可。
1、新建一个线程池
2、写一个Controller,没一次请求,起一个线程
三、开始测试看效果
1、启动SpringBoot服务,空闲状态下,可以看到基本上CPU很空闲
2、先来一个请求,尝试让一个CPU核忙起来
可以看到,该java进程已经CPU100%了。并且看上面圈起来的地方,占用了整个服务器10%的CPU算力。
3、再来一个请求,尝试让两个CPU核忙起来
基本上符合预期,java进程占用了200%的CPU,且占用了整个服务器20%的CPU算力。
4、现在让我们把整个服务器的CPU打满
经过前两步的尝试,基本可以确认,一个死循环无限计算,基本上就会一直占用一个CPU核数。我们的服务器有10个核,所以,我们需要起10个线程,就让会服务器的CPU忙起来。
Java进程占用了1000%的CPU,10个核,整个服务器的CPU也基本上打满100%了。
四、分析
1、top - H -p 查看
先用
top
命令查看占用了1000%进程的Java进程PID为80761。然后用top -H -p 80761
命令可以看到这个Java进程下的线程情况,前10个WebCommonOperateSerivice
线程,每一个都占用了100%的CPU。其中WebCommonOperateSerivice
是我们在定义线程池的时候给这个线程命的名字,所以这里看起来就很方便。由此可见,在实际编码中,给每一个线程池命一个有意义的名字,将会很方便后期分析问题。
2、jstack 查看
由于截图篇幅,只能截几个线程,不过也可以看出来,每个线程都是处于RUNNABLE
状态,并且从堆栈信息也能看出是TestController
里的一个线程。
以上!
感谢阅读!