生产环境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 /arthas-boot.jar2. 启动: java -jar arthas-boot.jar3. 选择指定进程 启动arthas之后会自动列出所有jvm的java进程,前面有对应序号,输入对应序号, 然后回车 即可进入指定进程4. 输入thread -n 3 回车 表示查看本进程占用CPU最高的3个线程