生产上遇见linux异常变慢如何排查?
基本上出现慢的问题,90%的可能都是cpu或者内存出现了问题。使用命令查看定位机器的性能细节。
1、查看整体机器性能
使用top命令。
1.1 cpu
1.2 mem
1.3 id=idle 机器空闲率,越高越好
1.4 load average:系统负载。后面 三个值,分别是系统1分钟,5分钟,15分钟的系统平均负载率。通过计算算出平均负载率。
1.5 command
top命令如何退出,使用q,这里不要使用ctrl+c强行中断退出。
2、乞丐版本uptime(低配版的top)
3、内存
free free -g free -m(一般使用free -m)
4、硬盘
df 或者df -h (df:disk free)磁盘剩余空间 h:human人类看的懂方式
5、cpu 包含但不限于
vmstat -n 2 3(n :代表数字 2:每2秒刷一次 3:3条记录)
6、磁盘I/O
磁盘I/O高 读写慢 八成是大sql导致系统慢了。
iostat - xdk 2 3
就看一个参数,%util%。如果长期高于>80%,要对sql进行调优处理。r/s w/s 代表读写数据。
排查linux慢的问题基本就是以上操作,是不是不难呢。但是用过逼格就有点上去了。
接下来看看一次生产环境CPU占用过高问题的排查
(结合Linux和JDK命令一块分析)
1、先用top命令找出CPU占比最高的
看到一个叫做id=3928 名称为java的进程CPU占用贼高,不知道搞鸡毛。
2、ps -ef或者jps进一步定位,得知是一个怎么样的一个后台程序
3、定位到具体线程或者代码
ps -mp 进程 -o THREAD,tid,time
上图我们就可以根据进程查看到真正占用CPU资源就是id=3929的线程
4、将需要的线程ID转换为16进制格式(英文小写格式)
printf “%x\n” 有问题的线程ID或者使用计算器计算得到
将id=3929 转换为二进制。 f59
5、 jstack 进程ID | grep tid(16进制线程ID小写英文) -A60
jstack 3928 | grep F59 -A60(打印60行记录)
这里由于记录文章时之前的异常没有找到 ,自己手写了一个while(true)死循环来占用,截图为我的测试代码。方法没问题。
====================================================