系统架构

SpringBoot 模拟将CPU打满100%

2022-05-17  本文已影响0人  Sunny旋律

一、环境说明

闲暇之余,做个小测试,笔记以加深印象,仅学习使用

操作系统:CentOS 7.9


操作系统.png

CPU:2个CPU,每个CPU 5核,共10核


image.png

二、代码说明

起一个线程,死循环不中断,那这个线程会占用这个一个CPU核心,并将其打满100%。由此,我们要将整个操作系统的CPU吃满就很简单了,起10个线程即可。

1、新建一个线程池

image.png

2、写一个Controller,没一次请求,起一个线程

image.png

三、开始测试看效果

1、启动SpringBoot服务,空闲状态下,可以看到基本上CPU很空闲

image.png

2、先来一个请求,尝试让一个CPU核忙起来

image.png image.png

可以看到,该java进程已经CPU100%了。并且看上面圈起来的地方,占用了整个服务器10%的CPU算力。

3、再来一个请求,尝试让两个CPU核忙起来

image.png
image.png

基本上符合预期,java进程占用了200%的CPU,且占用了整个服务器20%的CPU算力。

4、现在让我们把整个服务器的CPU打满

经过前两步的尝试,基本可以确认,一个死循环无限计算,基本上就会一直占用一个CPU核数。我们的服务器有10个核,所以,我们需要起10个线程,就让会服务器的CPU忙起来。


image.png image.png

Java进程占用了1000%的CPU,10个核,整个服务器的CPU也基本上打满100%了。

四、分析

1、top - H -p 查看

image.png
先用top命令查看占用了1000%进程的Java进程PID为80761。然后用top -H -p 80761命令可以看到这个Java进程下的线程情况,前10个WebCommonOperateSerivice线程,每一个都占用了100%的CPU。其中WebCommonOperateSerivice是我们在定义线程池的时候给这个线程命的名字,所以这里看起来就很方便。由此可见,在实际编码中,给每一个线程池命一个有意义的名字,将会很方便后期分析问题。

2、jstack 查看

由于截图篇幅,只能截几个线程,不过也可以看出来,每个线程都是处于RUNNABLE状态,并且从堆栈信息也能看出是TestController里的一个线程。

image.png

以上!
感谢阅读!

上一篇下一篇

猜你喜欢

热点阅读