整机:top
查看整机信息:top命令+uptime命令
CPU:vmstat
查看CPU:vmstat
每2秒采样一次 一共采样3次
procs进程信息:
- r 是运行和等待CPU时间片的进程数,原则上1核CPU的运行队列不要超过2,整个系统的运行队列不能超过综合书的2倍。否则系统压力过大。
- b 是等待资源的进程数,比如正在等待的磁盘IO、网络IO等。
cpu信息:
- us 是用户进程消耗CPU时间百分比,us值高,用户进程消耗CPU时间多,如果长期大于50%,需要优化程序
- sy 是内核进程消耗的CPU时间百分比。
- 如果us + sy > 80%说明CPU可能存在不足。
- id 是处于空闲的CPU百分比
- wa 是系统等待IO的CPU时间百分比
- st 是来自于一个虚拟机偷取的CPU时间的百分比
查看所有CPU核的信息:mpstat -P ALL 【多少秒采样一次】
查看每个进程使用的CPU的用量信息:pidstat -u 【多少秒采样一次】 -p 【进程号】
ps -ef|grep java 查看java进程的进程号
内存:free
查看系统的内存:free -g / free -m / free (-单位)
- 应用程序可用内存/系统物理内存 > 70 % 内存充足
- 应用程序可用内存/系统物理内存 < 20 % 内存不足需要增加内存
- 两者之间,基本够用
查看进程内存额外信息:pidstat -p 【进程号】 -r 【采样间隔时间】
硬盘df
查看磁盘剩余空间数:df / df -h(换算后的结果)
磁盘IO:iostat
磁盘性能评估:iostat -xdk 2 3 (2秒采样一次 共采样3次)
rkB/s 每秒读取数据量kB
wkB/s 每秒写入数据量kB
svctm:IO请求的平均服务时间 单位ms
await:IO请求的平均等待时间 单位ms 值越小性能越好
util:一秒钟有百分之几的时间用于IO操作,接近100%时,磁盘带宽跑满,需要优化程序或增加磁盘。
如果读写的数据量长期比较大,一定不正常,需要优化程序的读取。svctm的值和await的值很接近,表示几乎没有IO等待,磁盘性能较好。如果await的值远高于svctm,则表示IO队列等待时间太长,需要优化程序或更换磁盘。
网络IO:ifstat
默认本地没有,下载ifstat
如何处理生产环境中CPU占用过高的问题?
- 先用top命令找出CPU占比最高的
- ps -ef或者jps进一步定位,找到进程编号
- 定位到具体的线程或者代码
- 将需要的线程ID转换为16进制
- jstack 进程ID | grep tid(16进制英文小写的线程ID) -A60
命令:ps -ef|grep java|grep -v grep找到进程
命令:ps -mp 进程编号 -o THREAD,tid,time
参数:
- -m:显式所有的线程
- -p:pid进程使用cpu的时间
- -o:该参数后是用户自定义的想要查询的字段
找到进程5556中的线程5557,5557的十六进制15b5
命令:jstack 线程号 | grep tid(16进制线程号) -A60
-A60 打印出前60行
定位到Demo1.java程序中有问题的行号是6