1、先top -c查看资源使用情况
第一行tasks表示第一行: 系统时间 + 系统运行时间 + 几个用户 + 1/5/15分钟系统平均负载
第二行:进程总数(total) + 正在运行进程数(running) + 睡眠进程数(sleeping) + 停止的进程数(stopped)+ 僵尸进程数(zombie)
第三行:用户空间CPU占比(us) + 内核空间CPU占比(sy)+ CPU空置率(id)
第4行第5行表示内存和虚拟内存使用情况:
下面代表的是进程,
PID :进程ID,USER :用户名,PR :优先级,NI :负值表示高优先级,正值表示低优先级。,VIRT :虚拟内存,
RES : 真实内存,SHR :共享内存,S :进程状态 D=不可中断的睡眠状态; R=运行; S=睡眠 ;T=跟踪/停止; Z=僵尸进程
2、线上cpu使用率很高如何排查
- 输入top -c 就可以显示进程列表,然后输入P,按照cpu使用率排序,你会看到类似下面的东西
- 然后根据最耗费cpu的进程定位该进程下耗费cpu的线程,top -Hp pid(进程id),然后输入P按照cpu使用率对线程排序
- 因为liunx中打印出的线程id是10进制的所以,先转换成为16进制的,用命令 printf "%x\n" tid(22828)
- 然后用jstack查看高cpu的线程的堆栈信息,可以打印出代码里是哪个类的那个方法导致cpu较高的。
- jstack pid(22772) | grep 592c -C5 --color
总结下来共分为4步:
1、top 或者top -c 查看进程(输入大写P按进程按耗时倒序)
2、top -Hp pid 查看该进程下的现成(输入大写P按进程按耗时倒序)
3、print '%x\n' tid(线程id,该步骤是将线程ID转换为16进制)
4、jstack pid | grep tid(第3步转换为16进制的id) -C 50 (或者是-C --color)
缺点:如果一个机器的cpu使用率飙升,通过上面方式排查比较麻烦,对于步骤二如果top之后发现有多个线程的cpu占有率比较高,并且cpu只是短暂的飙升,那么这个方法耗时比较久。可能找到所有的线程之后打出堆栈,cpu使用率飙升现场已经没有了。所以才给出了方法二进行排查,方法比较简单。
方案二
安装arthas:curl -L http://start.alibaba-inc.com/install.sh | sh
通过使用arthas对应的命令thread -n 找到cpu使用率top n的线程,并且打印出堆栈。通过arthas,我们可以使用一个命令就完成上面四个步骤的工作,比较简单方便