SpringBoot 模拟将CPU打满100%

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot 模拟将CPU打满100%相关的知识,希望对你有一定的参考价值。

参考技术A 操作系统:CentOS 7.9

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

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

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

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

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

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

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

以上!
感谢阅读!

性能分析之用户登录TPS低以及CPU被打满问题分析

用户登录说起来只是一个很普通的功能,不过它的逻辑一点也不简单。因为登录过程要对个人的信息进行对比验证,验证过程中又要调用相应的加密算法,而加密算法是对性能要求很高的一种功能。复杂的加密算法安全性高,但性能就差;不复杂的加密算法性能好,但安全性高,这是一个取舍的问题。

按照测试方案的基准场景的设计步骤,先压测这个接口的基准场景。

● 问题现象

如上图所示,这现象老明显了。

压测结果中的 TPS 平均才 25平均响应时间达到了 993 ms。

● 分析过程

从性能分析逻辑上来说,针对响应时间长的问题,首先要做的就是拆分时间。由于这个系统已经部署了 SkyWalking,用它看看时间主要消耗在了哪里。

看图中,Tomcat 的 SelfDuration 是最多的,也就是说时间几乎消耗在服务本身。

● 全局监控

首先查看下应用服务器的资源水位情况:

可以看到4C的CPU资源已经被耗光。

这里部署的是容器,先看下各容器资源使用情况:

可以看到资源主要被服务容器消耗了。

● 服务定向分析

首先进入服务容器查看下资源消耗情况:

在 SkyWaking 中又看不到完整的调用栈,考虑直接连到服务 Java 进程中看方法的时间消耗。这里用 Arthas 来跟踪一下。

查看当前最忙的前N个线程并打印堆栈:

这里为程序的业务代码。

于是 trace attemptAuthentication 这个方法。

接着trace authenticate 这个方法。

一层层跟踪下去,最终来到了这里:

既然这个 crypt_raw 方法耗时比较长,那就反编译源代码看看这一段是什么东西。

可以看到这里是一个加密算法 BCrypt,那么结论就很明显了 BCrypt 加密算法虽然安全性高,但性能差。

● demo验证

这里使用 SpringBoot 实现 MD5 加密和 BCrypt 加密的实例。

JMeter 并发20 MD5 加密结果:

JMeter 并发20 BCrypt 加密结果:

● 建议优化方向

这里解释一下,Bcrypt在加密时,每一次HASH出来的值是不同的,所以特别慢!

具体什么是 Bcrypt 算法,可以参考这篇文章:https://www.jianshu.com/p/2b131bfc2f10

分析到这里,优化方案其实比较明确了,那就是用更快的加密方式,或者去掉这个加密算法。

以上是关于SpringBoot 模拟将CPU打满100%的主要内容,如果未能解决你的问题,请参考以下文章

记一次线上故障--HashMap在多线程条件下运行造成CPU 100%

记一次线上故障--HashMap在多线程条件下运行造成CPU 100%

记一次线上故障--HashMap在多线程条件下运行造成CPU 100%

linux模拟cpu占用100%脚本

linux下模拟CPU占用100%小程序

SQLSERVER进程CPU使用率100%