## 安装 iostat/mpstat/sar/pidstat
yum install sysstat -y
#########
## CPU ##
#########
## mpstat命令指令主要用于多CPU环境下,它显示各个可用CPU的状态。
## 这些信息存放在/proc/stat文件中。
## 在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。
mpstat [-P {cpu|ALL}] [internal [count]]
## 查看全部CPU及汇总
mpstat -P ALL
Linux 3.10.0-1160.6.1.el7.x86_64 (localhost.localdomain) 2020年12月07日 _x86_64_ (4 CPU)
13时25分52秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
13时25分52秒 all 0.08 0.00 0.20 0.25 0.00 0.03 0.00 0.34 0.00 99.11
13时25分52秒 0 0.07 0.00 0.14 0.21 0.00 0.00 0.00 0.18 0.00 99.39
13时25分52秒 1 0.07 0.00 0.32 0.71 0.00 0.00 0.00 0.65 0.00 98.26
13时25分52秒 2 0.07 0.00 0.18 0.03 0.00 0.00 0.00 0.30 0.00 99.42
13时25分52秒 3 0.10 0.00 0.16 0.05 0.00 0.10 0.00 0.24 0.00 99.36
## 查看指定CPU
mpstat -P 0,1
Linux 3.10.0-1160.6.1.el7.x86_64 (localhost.localdomain) 2020年12月07日 _x86_64_ (4 CPU)
13时26分22秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
13时26分22秒 0 0.07 0.00 0.14 0.21 0.00 0.00 0.00 0.18 0.00 99.39
13时26分22秒 1 0.07 0.00 0.32 0.71 0.00 0.00 0.00 0.65 0.00 98.26
## 间隔1秒,执行2次
mpstat 1 2
Linux 3.10.0-1062.el7.x86_64 (localhost.localdomain) 2019年12月17日 _x86_64_ (1 CPU)
16时15分04秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
16时15分05秒 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
16时15分06秒 all 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00
平均时间: all 0.00 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 99.50
## 指标说明 从/proc/stat获得数据
CPU 处理器ID
%user 在internal时间段里,用户态的CPU时间(%),不包含nice值为负进程 (usr/total)*100
%nice 在internal时间段里,nice值为负进程的CPU时间(%) (nice/total)*100
%sys 在internal时间段里,内核时间(%) (system/total)*100
%iowait 在internal时间段里,硬盘IO等待时间(%) (iowait/total)*100
%irq 在internal时间段里,硬中断时间(%) (irq/total)*100
%soft 在internal时间段里,软中断时间(%) (softirq/total)*100
%idle 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%) (idle/total)*100
## 当软中断耗时占比很高时继续排查是什么造成的
## 需要对比两次查询结果,看增长最快的项目
cat /proc/softirqs
CPU0 CPU1 CPU2 CPU3
HI: 83030 130 12 484
TIMER: 640814 349397 699532 6417126
NET_TX: 1 6634 1 58878 # 网络发送数据造成中断数
NET_RX: 45 54 0 13407550 # 网络接收数据造成中断数
BLOCK: 4557 258850 731 545
BLOCK_IOPOLL: 0 0 0 0
TASKLET: 35536 113 178493 56688
SCHED: 506047 185132 533578 2262479
HRTIMER: 0 0 0 0
RCU: 283809 155003 243688 2908468
如中断主要集中在1个核心上,其他核心很空闲,可以考虑修改配置让其他几个核心参与分担
##########
## 磁盘 ##
##########
iostat [ 选项 ] [ <时间间隔> [ <次数> ] ]
## -x 详细
## -m MB
iostat -x
Linux 3.10.0-1062.el7.x86_64 (localhost.localdomain) 2019年12月17日 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.02 0.00 0.01 0.00 0.00 99.97
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 0.00 0.01 0.03 1.05 1.39 145.29 0.00 59.71 4.37 72.75 0.47 0.00
dm-0 0.00 0.00 0.01 0.02 1.04 1.38 158.04 0.00 68.48 5.95 83.02 9.05 0.03
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 10.84 0.00 520.22 0.11 560.20 3.23 0.00
# 说明
rrqm/s # 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并(当系统调用需要读取数据的 时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge)
wrqm/s # 每秒对该设备的写请求被合并次数
r/s # 每秒完成的读次数
w/s # 每秒完成的写次数
rkB/s # 每秒读数据量(kB为单位)
wkB/s # 每秒写数据量(kB为单位)
avgrq-sz # 平均每次IO操作的数据量(扇区数为单位)
avgqu-sz # 平均等待处理的IO请求队列长度
await # 平均每次IO请求等待时间(包括等待时间和处理时间,单位:毫秒)【一般系统IO响应时间应该低于5ms,如果大于10ms就比较大了】
r_await # 读
w_await # 写
svctm # 平均每次IO请求的处理时间(毫秒为单位)
%util # 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率
##########
## 内存 ##
##########
## 查看具体进程对内存的使用情况
pidstat -l -r -p 9878 1 2
10时57分52秒 UID PID minflt/s majflt/s VSZ RSS %MEM Command
10时57分53秒 27 9878 0.00 0.00 6818380 5521736 71.43 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
10时57分54秒 27 9878 0.00 0.00 6818380 5521736 71.43 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
pidstat -r -p 18442 1 2
10时54分46秒 UID PID minflt/s majflt/s VSZ RSS %MEM Command
10时54分47秒 0 18442 0.00 0.00 115544 2104 0.03 bash
10时54分48秒 0 18442 0.00 0.00 115544 2104 0.03 bash
Minflt/s # 任务每秒发生的次要错误,不需要从磁盘中加载页
Majflt/s # 任务每秒发生的主要错误,需要从磁盘中加载页
VSZ # 虚拟地址大小,虚拟内存的使用KB
RSS # 常驻集合大小,非交换区内存使用KB
%MEM # 进程占用总内存的百分比
##########
## SWAP ##
##########
sar -W 1 2
09时30分51秒 pswpin/s pswpout/s
09时30分52秒 0.00 0.00
09时30分53秒 0.00 0.00
平均时间: 0.00 0.00
# 说明
pswpin/s # 每秒从交换分区到系统的交换页面(swap page)的数量
pswpott/s # 每秒从系统交换到swap的交换页面(swap page)的数量
##########
## 网络 ##
##########
sar [ 选项 ] [ <时间间隔> [ <次数> ] ]
## 查看全部网卡进出正常信息
sar -n DEV 1
16时49分45秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
16时49分46秒 eth0 4.00 2.00 0.48 0.32 0.00 0.00 0.00
16时49分46秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
IFACE # 网络设备名
rxpck/s # 每秒接收的包总数
txpck/s # 每秒传输的包总数
rxKB/S # 每秒钟接受的数据包大小,单位为KB(12000.00(rxkB/s) = 12MB/秒 (百兆网络极限))
txKB/S # 每秒钟发送的数据包大小,单位为KB
rxcmp/s # 每秒接收压缩包的总数
txcmp/s # 每秒传输压缩包的总数
rxmcst/s # 每秒接收的多播(multicast)包的总数
## 查看全部网卡进出错误信息
sar -n EDEV 1
09时37分18秒 IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
09时37分19秒 wlp3s0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
09时37分19秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
09时37分19秒 enp2s0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
IFACE # 网卡名称
rxerr/s # 每秒钟接收到的损坏的数据包
txerr/s # 每秒钟发送的数据包错误数
coll/s # 当发送数据包时候,每秒钟发生的冲撞(collisions)数,这个是在半双工模式下才有
rxdrop/s # 当由于缓冲区满的时候,网卡设备接收端每秒钟丢掉的网络包的数目
txdrop/s # 当由于缓冲区满的时候,网络设备发送端每秒钟丢掉的网络包的数目
txcarr/s # 当发送数据包的时候,每秒钟载波错误发生的次数
rxfram # 在接收数据包的时候,每秒钟发生的帧对其错误的次数
rxfifo # 在接收数据包的时候,每秒钟缓冲区溢出的错误发生的次数
txfifo # 在发生数据包的时候,每秒钟缓冲区溢出的错误发生的次数
##########
## 进程 ##
##########
pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
参数:
-u:默认的参数,显示各个进程的cpu使用统计
-r:显示各个进程的内存使用统计
-d:显示各个进程的IO使用情况
-p:指定进程号
-w:显示每个进程的上下文切换情况
-t:显示选择任务的线程的统计信息外的额外信息
-T { TASK | CHILD | ALL }
TASK 独立的task,
CHILD 进程下所有线程统计信息。
ALL 独立的task和task下面的所有线程。
# 注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。
-h:在一行上显示了所有活动,这样其他程序可以容易解析。
-I:在SMP环境,表示任务的CPU使用率/内核数量
-l:显示命令名和所有参数
示例
# 在一行内显示进程号为 4766 的cpu、内存、磁盘使用情况,没秒1次,共3次
pidstat -d -t -r -u -h -p 4766 1 3
结果示例:(加子线程会变多行)
# Time UID TGID TID %usr %system %guest %CPU CPU minflt/s majflt/s VSZ RSS %MEM kB_rd/s kB_wr/s kB_ccwr/s Command
1607155938 0 4766 0 0.00 0.00 0.00 0.00 0 0.00 0.00 136100 2132 0.21 0.00 0.00 0.00 mysql
1607155938 0 0 4766 0.00 0.00 0.00 0.00 0 0.00 0.00 136100 2132 0.21 0.00 0.00 0.00 |__mysql
剩余2次略
## -u/-t
PID # 进程ID
%usr # 进程在用户空间占用cpu的百分比
%system # 进程在内核空间占用cpu的百分比
%guest # 进程在虚拟机占用cpu的百分比
%CPU # 进程占用cpu的百分比
CPU # 处理进程的cpu编号(CPU核心)
Command # 当前进程对应的命令
## -r
Minflt/s # 任务每秒发生的次要错误,不需要从磁盘中加载页
Majflt/s # 任务每秒发生的主要错误,需要从磁盘中加载页
VSZ # 虚拟地址大小,虚拟内存的使用KB
RSS # 常驻集合大小,非交换区内存使用KB
## -d
kB_rd/s # 每秒从磁盘读取的KB
kB_wr/s # 每秒写入磁盘KB
kB_ccwr/s # 任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生
## -w
Cswch/s # 每秒主动任务上下文切换数量
Nvcswch/s # 每秒被动任务上下文切换数量
## -T ALL -p
Usr-ms # 任务和子线程在用户级别使用的毫秒数
System-ms # 任务和子线程在系统级别使用的毫秒数
Guest-ms # 任务和子线程在虚拟机(running a virtual processor)使用的毫秒数