1

一、引言

二、常用命令

#CentOS安装系统状态命令,以下性能指标命令没有的可以尝试安装
yum install -y sysstat

整机性能指标命令

1、top命令

#查看整机系统性能命令
top -H

# -H 可以查看由某个进程启动的所有线程 ,p指定要看的进程
top -Hp 6106 

image.png

  • load average:三组数字分别表示为1分钟、5分钟、15分钟CPU负载的情况。以一个单核的机器为例,load=0.5表示CPU还有一半的资源可以处理其他的线程请求,load=1表示CPU所有的资源都在处理请求,没有剩余的资源可以利用了,而load=2则表示CPU已经超负荷运作,另外还有一倍的线程正在等待处理。多核处理器中,你的load average不应该高于处理器核心的总数量。

说明:该命令用来从全局的角度查看整机系统性能。

2、uptime命令

#top命令的简化版
[root@localhost home]# uptime
 22:43:42 up  1:06,  2 users,  load average: 0.97, 0.74, 0.40

CPU性能指标命令

1、vmstat命令

#每两秒采样一次,共采样3次
[root@localhost home]# vmstat -n 2 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 427172   2116 342488    0    0    23     4  494  564  3  7 91  0  0
 1  0      0 427172   2116 342520    0    0     0    65 4586 4940 20 26 54  0  0
 2  0      0 427172   2116 342524    0    0     0     0 4589 4940 20 25 54  0  0
  • procs
项目含义
r运行和等待cpu时间片的进程数,原则上1核的cpu的运行队列不要超过2,整个系统的运行队列不要超过总核数的2倍
b等待资源的进程数,比如正在等待磁盘I/O、网络I/O等
  • cpu
项目含义
us用户进程消耗cpu时间百分比,us值高,代表用户进程消耗cpu时间多,如果长期大于50%,需要优化程序
sy内核进程消耗的cpu时间百分比,us+sy参考值为80%,超过此阈值表明cpu负荷过大
id处于空闲的cpu百分比
wa系统等待IO的cpu时间百分比
st来自于一个虚拟机窃取的cpu时间百分比

说明:该命令主要用来查看cpu的一些指标(包含但不限于)。

2、mpstat(Multiprocessor Statistics)命令

#查看所有cpu核心的信息,2秒采样一次共三次,-P {|ALL} 表示监控哪个CPU, cpu在[0,cpu个数-1]中取值
mpstat -P ALL 2 3

image.png

说明:查看所有cpu核信息,其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。

3、pidstat命令

#查看cpu的信息,每秒钟采样1次共采样5次,-p指定具体进程编号
pidstat -u 1 5 -p 1796

#查看内存信息,每秒钟采样1次共采样5次,-p指定具体进程编号
pidstat -r 1 5 -p 1796

#查看磁盘信息,每秒钟采样1次共采样5次,-p指定具体进程编号
pidstat -d 1 5 -p 1796

image.png

image.png

image.png

说明:查看某个具体的进程使用cpu的信息。

内存指标命令

1、free命令

#默认单位kb
free

#指定单位mb
free -m

#指定单位gb
free -g

image.png

磁盘指标命令

1、df命令

#查看磁盘剩余空间
df -h

image.png

IO指标命令

1、iostat命令(磁盘IO)

#查看磁盘IO状况,2秒采样一次共三次
iostat -xdk 2 3

image.png

项目含义
rkB/s每秒读取数据量kb
wkB/s每秒写入数据量kb
svctmIO请求的平均服务时间,单位毫秒
awaitIO请求的平均等待时间,单位毫秒,值越小越好
util一秒中有百分之几的时间用于IO操作,接近100%时,表示磁盘带宽盘满,需要优化程序或增加磁盘

说明:rkB/s、wkB/s长期超大的数据读写,肯定不是正常现象;svctm与await值很接近,表示几乎没有IO等待,磁盘性能好,如果await值远高于svctm的值,表示IO等待时间太长,待优化。

1、ifstat命令(网络IO)

#查看网络IO状况
ifstat 1

三、服务器异常分析与定位

1、JAVA程序CPU占用过高的分析思路与定位

制造一个简单的CPU密集计算的java程序,然后再服务器上跑起来,以此实例来模拟生产环境CPU占用过高的场景。
image.png

#编译
javac WhileTrueDemo.java -d

#运行示例程序,造成CPU密集计算
nohup java com.jayway.WhileTrueDemo &

具体步骤

  • 先用整机性能命令top找出CPU占比最好的进程

image.png

说明:通过top命令基本可以看出PID为6106的进程CPU占用过大。

  • 利用ps后者jps进一步定位
#采用ps命令进一步查看搞事的java程序
[root@localhost home]# ps -ef | grep java | grep -v grep
root       6106   1460 99 22:09 pts/0    00:52:15 java com.jayway.WhileTrueDemo

#采用java自带命令查看
[root@localhost home]# jps -l
6106 com.jayway.WhileTrueDemo
6238 sun.tools.jps.Jps
  • 定位到具体线程或者代码
#-m 显示所有的线程
#-p pid进程使用CPU的时间
#-o 该参数后是用户自定义格式
ps -mp 6106 -o THREAD,tid,time

image.png

说明:从上图可知6107这个线程占用的CPU最多并且占用CPU时间也最多,从它下手继续分析。

  • 将需要的线程ID转换为16进制英文小写格式
#转换线程号6107为16进制英文小写,结果为:17db
printf "%x\n" 6107
  • java程序采用jstack命令查看java堆栈信息,定位具体问题
# 进程号为6106,查找问题线程号17db(16进制英文小写)
jstack 6106 | grep 17db -C10

image.png

说明:从上图就可以看出WhileTrueDemo文件的第八行代码是问题的根源。


neojayway
52 声望10 粉丝

学无止境,每天进步一点点