linux 命令
top
top主要关注CPU、MEM、load average的数值,其中load average后面的三个值表示过去1、5、15分钟系统的平均负载情况,如果三个值的平均值大于0.6则系统负载稍微偏高。按数字1可以切换CPU;uptime命令可作为精简版的top命令
vmstat
vmstat主要用于查CPU的使用情况。一般使用vmstat -n 2 3
这表示没两秒采样一次,一共采样3次。主要的观察项为procs和CPU
procs
r :表示runtime,运行和等待CPU时间片的进程数,原则上1核CPU的运行队列不要超过2,整个系统的运行队列不能超过总核数的2倍,超过了则代表系统压力过大
b:表示block(阻塞),等待资源的进行数,比如正在等待磁盘IO、网络IO等
CPU
us:用户进程消耗CPU时间百分比,us值高则表示用户进程消耗CPU时间多,如果长期大于50%,需要优化程序
sy:内核进行消耗的CPU时间百分比,us+sy的参考值为80%,如果大于80%说明可能存在CPU不足的情况
id:表示处于空间的CPU百分比,即CPU空闲率,正常情况下越大越好
wa:系统等待IO的CPU时间白笨比
st:来自于一个虚拟机偷取的CPU时间的百分比
mpstat
mpstat表示查看所有CPU(多核)的运行信息。mpstat -P all 2
表示每两秒采集一次,结果中的iddle表示空闲率
pidstat
pidstat表示查看指定PID进程的CPU使用情况,pidstat -u 2 -p 2321
表示每隔2秒采样一次进程id为2231的CPU使用情况
free
free查看系统运行内存的大小
free -h
free -m
查看制定进程暂用内存命令 pidstat -r 2 -p 28347
表示每个两秒采样一次内存使用情况
df
df查看磁盘使用情况 df -h
iostat
iostat查看磁盘IO情况,iostat -xdk 2 3
每隔两秒采集ICI,采样三次
rkB/s:每秒读取数据量KB
wkB/s:每秒写入数据量KB
svctm:IO请求的平均服务时间,单位毫秒
await:IO请求中的平均等待时间,单位毫秒:值越小性能越好;
rkB/s和wkB/s:rkB/s、wkB/s根据系统应用不同会有不同的值,但有规律遵循:长期、超大数据读写肯定不正常,需要优化程序读取
%util:一秒中有百分之几的时间用于IO操作。接近100%时表示磁盘IO满负载,需要优化程序或者增加磁盘容量
如果svctm的值与await的值接近,表示几乎没有IO等待,磁盘性能好;如果await值远大于svctm的值,则表示IO队列等待时间太长,需要优化程序或者更好磁盘
查看指定进程磁盘IO情况pidstat -d 2 -p 28347
表示查看进程28347的磁盘IO情况,每个两秒采样一次
ifstat
查看网络负载情况
程序CPU占用过高排查思路
-
top命令查看哪个进程占用高
top查看cpu占用高的进程 -
根据top得到高的进程之后,通过ps -ef |grep xxx查询xxx进程的详情
根据进程id查看:ps -ef |grep 22231
根据应用名模糊查:ps -ef |grep java
根据应用名模糊查:ps -ef |grep java |grep -v grep
查询java进程命令: jps -l -
根据进程id查看进程里线程的CPU占用情况,也就可以定位到出问题的线程
ps -mp 进程id -o THREAD,tid,time
-m:显示所有线程;
-p:进程使用CPU的时间;
-o:该参数后面的是云呼自定义的格式;
THREAD:线程;
tid:线程id——10进制;
time:为时间
例子:ps -mp 22231 -o THREAD,tid,time得到进程22231里面所有线程的CPU占用情况; -
根据第三步得到的线程id,用
printf "%x\n"
把十进制的线程id转成16进制的线程id(英文小写格式,%x表示转成16进制,\n表示换行),再通过jstack查看线程详情,可查出线程里对应java代码的位置,可针对此结果进行分析;jstack 进程id |grep tid -A50
tid为16进制程id;-A60位输出50行
例如:printf "%x\n" 22233 得到16进制的线程id:56d9
例如:jstack 22231 |grep 56d9 -A50得到线程56d9高占用CPU的代码