springboot应用程序:cpu使用率有时会达到最大值

yb3bgrhw  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(535)

如何解决/优化springboot应用程序中的cpu使用问题。对于一个用户总数约为30万的应用程序,分配的资源是否足够?应用程序一点也不重。它只需调用第三方api并进行必要的检查并给出响应。如何识别可能使用了比通常需要的更多资源的确切代码?我在某个地方发现,从top命令跟踪进程id,到达线程dump并查找对应的processid的十六进制值(可能占用了更多cpu)是一种解决方法。这不容易实现,因为建议的一些命令不起作用。如有任何帮助或建议,我将不胜感激。
提前谢谢。
htop命令输出
正常时停止

erhoui1w

erhoui1w1#

对于spring启动应用程序,线程堆栈的收集过程没有什么不同。在引导应用程序被容器化之前,它仍然是一个jar。如果您怀疑是您的应用程序导致了高cpu,那么运行jar并在其上附加一个探查器,并在加载时跟踪导致高cpu的代码。如果做不到这一点,那么使用正在运行的jar/java进程的线程转储,并使用任何免费或开源工具来分析跟踪。所解释的第二个逻辑也适用于集装箱化应用程序。
按照以下步骤对docker容器中运行的java应用程序/引导应用程序执行线程转储:-

docker exec -it <containerName> jstack > someFile.txt

为它拍摄多张快照,以便更好地查看和比较。

kqqjbcuj

kqqjbcuj2#

如果尚未将jmx enable选项添加到jvm命令行,请首先执行以下操作:

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=10000
-Dcom.sun.management.jmxremote.rmi.port=10000
-Dcom.sun.management.jmxremote.local.only=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false

然后在本地机器上从jdk-bin文件夹启动“jmc”,并连接到spring引导服务器。然后您将能够看到所有线程,并在所有活动线程上启用cpu负载和线程锁。
但是请注意,上面的操作会打开jvm以供未经验证的条目使用,因此请确保端口安全。
接下来,如果jvm死机,发送一个“kill-3”sighup,它将告诉jvm转储内核。然后可以通过EclipseMat插件读取,以便分析jvm的内部行为。
另一种方法是将jolokia安装到服务器中,以便通过其他方法检索相同的信息。

相关问题