持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
生产环境cpu飙高产生的原因?
cpu运行--线程
a、CAS自旋、CAS修改值得内容,缺点:CAS修改值失败,会一直不断的重试 运行状态,非常消耗cpu资源,乐观锁、sychronized升级锁的过程,多次后会阻塞,需要限制重试次数。
b、云服务器上安装redis,黑客攻击reids 6379端口号注入挖矿程序,不要reids端口号外网连接,要在一个局域网(内网)下。
c、并发量 tomcat 单独线程处理业务请求 线程池 最大线程数 最小线程数
d、服务器端被ddos攻击、限流、黑名单、图形验证码
e、死循环,控制循环次数
linux命令
top -c,查询哪个进程cup占比
window环境:java visualvm.exe工具查询哪个线程cup占比,代码中创建线程需要创建线程名称、线程池名称,这样容易定位到哪块代码有问题。
linux环境:Arthas(阿尔萨斯)工具查询哪个线程cup占比
可以在官方 Github 上进行下载,有时打不开。 curl -O alibaba.github.io/arthas/arth… 如果速度较慢,可以尝试国内的码云 Gitee 下载。 curl -O arthas.gitee.io/arthas-boot…
java -jar arthas-boot.jar
Arthas用thread命令列出线程的信息,这个命令会把所有线程按照cpu占用率从高到低列出来,如果线程太多,可以通过-n参数指定输出的行数。输出结果可以看到id为某个数字的这个线程cpu占用率很过,然后再通过thread加线程id输出改线程的栈信息。 用dashboard命令来动态查看内存情况,ctrl+c可以停止刷新。
总结:
- dashboard命令,仪表盘显示当前进程相关信息。以上已介绍,分析内存的。
- thread命令(查看具体线程信息使用),id 线程id,-n 指定最忙的的前n个线程并打印堆栈,b找出当前阻塞其他线程的线程,-i 指定cpu占比统计的采样时间间隔,单位为毫秒。
- watch命令(查看类里某个方法的返回值和入参)命令+类完全限定名+监测方法+表达式。
- trace命令(方法调用路径、耗时解析)方法内部调用路径,并输出方法路径上的每个节点上耗时。
- quit命令 退出当前 Arthas 客户端,其他 Arthas 客户端不受影响。
- shutdown命令 关闭 Arthas 服务端,所有 Arthas 客户端全部退出 & 重置所有增强过的类,就不用单独调用reset。