生产环境CPU飙高问题原因
0. CPU上运行的是线程, 所以就是说有线程一直在忙碌,一直在运行
-
线程中有CAS一直获取锁失败,并不断的通过自旋重试,这是CAS的缺点,因此大量线程在自旋重试,会空耗CPU。比如代码中运用了AtmicXXX这些原子类 或 ConcurrentHashMap 或 乐观锁重试这些东西都可能导致CPU飙高
解决方案:使用这些原子类,或者乐观锁时要注意一下,并且自己写乐观锁自旋重试要注意配置重试次数
-
云服务器安装了Redis, 黑客利用6379端口注入挖矿程序,导致占用CPU资源
解决方案:尽量不要让Redis在外网访问,不要暴漏ip,并把端口号 或 ip设置访问权限,所以云服务器尽量买一家的
-
服务端接口被DDOS恶意攻击,当然要做大量的DDOS攻击,要花大量的钱,不是深仇大恨一般不会
解决方案:可以买高仿服务器,但是价格高。或者对接口做限流,图形验证码,ip黑名单等,对接口做限流可以防止服务器崩溃,但依然会把正常的良性请求也给拒绝了
-
代码出现了死循环打印,导致线程无法结束。
解决方案:要合理做一些退出循环的操作, 比如做一些循环次数限制,或者循环时间限制
Windows如何去排查CPU是什么原因飙高
- 打开任务管理器 ctrl + alt + del
-
看一下cpu百分比最高的对应哪个进程
Linux如何去排查CPU是什么原因飙高
-
通过命令top -c,找到占比高的进程id,即–>pid
- 再根据进程pid去找具体哪个线程
-
注意:一定要配置【线程池名称】,否则很难找
- 更推荐使用Arthas(阿尔萨斯)这个工具
1. 下载方式:curl -O https://arthas.aliyun.com/arthas-boot.jar
2. 启动: java -jar arthas-boot.jar
3. 选择指定进程 启动arthas之后会自动列出所有jvm的java进程,前面有对应序号,输入对应序号, 然后回车 即可进入指定进程
4. 输入thread -n 3 回车 表示查看本进程占用CPU最高的3个线程
生产环境如何去排查CPU是什么原因飙高
- 服务器监控系统:比如阿里云CPU飙高的告警提示
- 运维先知道那台服务器节点CPU飙高,通知开发人员配合该服务器,进程中哪个线程导致cpu飙高
- 这些问题需要运维查,生产环境一般开发人员一定是碰不到的
- 或者通过第三方监控软件的平台查询。
版权声明:本文为a645293829原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。