Linux常用性能监控命令

CPU

  • user(通常缩写为us),代表用户态CPU时间。不包括下面的nice时间,但包括了guest时间
  • nice(通常缩写为ni),代表低优先级用户态CPU时间,也就是进程的nice值被调整为1-19之间时的CPU时间。nice可取值范围是-20 到19,数值越大,优先级反而越低
  • system(通常缩写为 sys),代表内核态CPU时间
  • idle(通常缩写为 id),代表空闲时间。它不包括等待I/O 的时间(iowait)
  • iowait(通常缩写为 wa),代表等待I/O的CPU时间
  • irq(通常缩写为 hi),代表处理硬中断的CPU时间
  • softirq(通常缩写为 si),代表处理软中断的CPU时间
  • steal(通常缩写为st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的CPU时间
  • guest(通常缩写为guest),代表通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的CPU时间
  • guest_nice(通常缩写为gnice),代表以低优先级运行虚拟机的时间

CPU使用率

mpstat

CPU使用率实时统计

1
mpstat 1
1
2
3
4
5
Linux 3.10.0-693.2.2.el7.x86_64 (lingxi-test) 	2020年08月16日 	_x86_64_	(4 CPU)

15时36分16秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
15时36分17秒 all 3.34 0.00 1.80 0.00 0.00 0.00 0.00 0.00 0.00 94.86
15时36分18秒 all 3.34 0.00 1.80 0.00 0.00 0.26 0.00 0.00 0.00 94.6

pidstat

指定进程的CPU使用率变化

1
pidstat -p 2245 1
1
2
3
4
5
6
Linux 3.10.0-693.2.2.el7.x86_64 (lingxi-test) 	2020年08月16日 	_x86_64_	(4 CPU)

15时42分37秒 UID PID %usr %system %guest %CPU CPU Command
15时42分38秒 10006 2245 1.00 0.00 0.00 1.00 1 java
15时42分39秒 10006 2245 1.00 1.00 0.00 2.00 1 java
15时42分40秒 10006 2245 3.00 0.00 0.00 3.00 1 java

各进程的CPU使用率变化

1
pidstat -u 1
1
2
3
4
5
6
Linux 3.10.0-693.2.2.el7.x86_64 (lingxi-test) 	2020年08月16日 	_x86_64_	(4 CPU)

15时45分42秒 UID PID %usr %system %guest %CPU CPU Command
15时45分43秒 10006 2245 1.98 0.99 0.00 2.97 1 java
15时45分43秒 10006 6742 0.99 0.99 0.00 1.98 3 java
15时45分43秒 10006 9982 0.99 0.00 0.00 0.99 3 java

dstat

CPU/磁盘IO/网络数据实时监控

1
dstat 1
1
2
3
4
5
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
3 1 95 0 0 0| 0 84k| 53k 59k| 0 0 |9017 12k
3 2 94 0 0 0| 0 0 | 54k 43k| 0 0 |9468 13k
5 2 93 0 0 0| 0 0 | 50k 60k| 0 0 |9294 12k

CPU上下文切换

pidstat

各进程CPU上下文切换统计

1
pidstat -w 1
1
2
3
4
平均时间:   UID       PID   cswch/s nvcswch/s  Command
平均时间: 10006 13621 5.33 0.00 nginx
平均时间: 10006 13622 8.44 0.00 nginx
平均时间: 10006 13623 11.54 0.00 nginx
  • cswch 表示每秒自愿上下文切换(voluntary context switches)的次数
  • nvcswch表示每秒非自愿上下文切换(non voluntary context switches)的次数

指定进程CPU上下文切换统计

pidstat默认显示进程的指标数据,加上-t参数后,才会输出线程的指标。

1
pidstat -w -p 2245 -t 1
1
2
3
4
5
6
7
Linux 3.10.0-693.2.2.el7.x86_64 (lingxi-test) 	2020年08月16日 	_x86_64_	(4 CPU)

16时05分46秒 UID TGID TID cswch/s nvcswch/s Command
16时05分47秒 10006 2245 - 0.00 0.00 java
16时05分47秒 10006 - 2245 0.00 0.00 |__java
16时05分47秒 10006 - 2255 1.00 0.00 |__java
16时05分47秒 10006 - 2263 20.00 0.00 |__java

vmstat

CPU上下文切换计数

1
vmstat 1
1
2
3
4
5
procs -----------memory----------- --swap----- --io----- --system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 176612 114152 5818372 0 0 0 4 8561 11181 2 2 95 0 0
0 0 0 176304 114152 5818372 0 0 0 4 8550 11118 2 2 96 0 0
0 0 0 176792 114152 5818396 0 0 0 0 8767 11367 3 1 96 0 0
  • cs(context switch)是每秒上下文切换的次数
  • in(interrupt)则是每秒中断的次数
  • r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程
  • b(Blocked)则是处于不可中断睡眠状态的进程数

CPU中断

softirqs

CPU软中断计数

1
watch -n 1 'cat /proc/softirqs'
1
2
3
4
5
6
7
8
9
10
11
                    CPU0       CPU1       CPU2       CPU3       
HI: 9 4 6 3
TIMER: 2214338633 4121419965 2762914647 2138523262
NET_TX: 861743 808676 915818 651005
NET_RX: 3037620031 2545651729 3057664107 1391391372
BLOCK: 0 0 0 0
BLOCK_IOPOLL: 0 0 0 0
TASKLET: 313223 305907 313136 282939
SCHED: 3189449832 2466757727 3115282943 2507068099
HRTIMER: 0 0 0 0
RCU: 2053967698 2003167979 2116164634 1891079850
  • TIMER: 定时产生的软中断
  • NET_RX: 网络接收产生的软中断
  • NET_TX: 网络发送产生的软中断
  • SCHED: 内核调度产生的软中断
  • RCU: RCU产生的软中断

CPU监控采样统计

perf

arthas

Arthas 用户文档

指定JVM进程生成CPU热点火焰图

  1. 启动arthas

    1
    2
    wget https://alibaba.github.io/arthas/arthas-boot.jar
    java -jar arthas-boot.jar
  2. 启动profiler

    1
    2
    $ profiler start
    Started [cpu] profiling
  3. 获取已采集的sample的数量

    1
    2
    $ profiler getSamples
    23
  4. 查看profiler状态

    1
    2
    $ profiler status
    [cpu] profiling is running for 4 seconds
  5. 生成svg格式火焰图

    1
    2
    3
    $ profiler stop
    profiler output file: /tmp/demo/arthas-output/20191125-135546.svg
    OK
  6. 正确退出

    1
    $ shutdown

async-profiler

async-profiler

指定JVM进程生成CPU热点火焰图

1
./profiler.sh -d 30 -f ./flamegraph.svg 17616
  • -d: 分析持续时间,单位秒

内存

  • VIRT是进程虚拟内存的大小,只要是进程申请过的内存,即便还没有真正分配物理内存,也会计算在内
  • RES是常驻内存的大小,也就是进程实际使用的物理内存大小但不包括Swap和共享内存
  • SHR是共享内存的大小,比如与其他进程共同使用的共享内存、加载的动态链接库以及程序的代码段等
  • %MEM是进程使用物理内存占系统总内存的百分比

内存占用统计

free

内存占用统计

1
free -h
1
2
3
              total        used        free      shared  buff/cache   available
Mem: 15G 9.7G 156M 2.4M 5.7G 5.4G
Swap: 0B 0B 0B
  • total: 总内存大小
  • used: 已使用内存的大小,包含了共享内存
  • free: 未使用内存的大小
  • shared: 共享内存的大小
  • buff/cache: 缓存和缓冲区的大小
  • available: 新进程可用内存的大小

vmstat

内存占用实时统计

1
vmstat 1
1
2
3
4
5
procs -----------memory----------- --swap----- --io----- --system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 176612 114152 5818372 0 0 0 4 8561 11181 2 2 95 0 0
0 0 0 176304 114152 5818372 0 0 0 4 8550 11118 2 2 96 0 0
0 0 0 176792 114152 5818396 0 0 0 0 8767 11367 3 1 96 0 0

ps

各进程按物理内存排序

1
ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' --sort -rsz
1
2
3
4
  PID COMMAND         COMMAND                     %CPU   RSZ    VSZ STIME USER       UID
6742 java java -jar -server -Xms1024M 2.1 1026192 6085356 8月13 webapp 10006
9982 java java -jar -server -Xmx1024M 0.8 951572 5192560 8月10 webapp 10006
13289 java java -jar -server -Xms1024M 0.3 747960 4994932 8月05 webapp 10006

文件缓存

pcstat

文件缓存命中率

安装脚本

1
2
3
4
5
6
7
#!/bin/bash
if [ $(uname -m) == "x86_64" ] ; then
curl -L -o pcstat https://github.com/tobert/pcstat/raw/2014-05-02-01/pcstat.x86_64
else
curl -L -o pcstat https://github.com/tobert/pcstat/raw/2014-05-02-01/pcstat.x86_32
fi
chmod 755 pcstat
1
./pcstat ./logs/*
1
2
3
4
5
6
7
8
|---------------------------------+----------------+------------+-----------+---------|
| Name | Size | Pages | Cached | Percent |
|---------------------------------+----------------+------------+-----------+---------|
| ./logs/member-wx.20200814.log | 373896477 | 91284 | 15881 | 017.397 |
| ./logs/member-wx.20200815.log | 317053634 | 77406 | 74450 | 096.181 |
| ./logs/member-wx.20200816.log | 293448138 | 71643 | 71157 | 099.322 |
| ./logs/member-wx.log | 89022207 | 21734 | 21734 | 100.000 |
|---------------------------------+----------------+------------+-----------+---------|

磁盘IO

磁盘IO读写统计

pidstat

各进程的IO读写

1
pidstat -d 1
1
2
3
4
5
Linux 3.10.0-693.2.2.el7.x86_64 (lingxi-test) 	2020年08月16日 	_x86_64_	(4 CPU)

16时22分28秒 UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
16时22分29秒 10006 2245 0.00 7.92 0.00 java
16时22分29秒 10006 13621 0.00 3.96 0.00 nginx

iostat

各磁盘IO实时读写统计

1
iostat -x 1
1
2
3
4
5
6
7
8
9
Linux 3.10.0-693.2.2.el7.x86_64 (lingxi-test) 	2020年08月17日 	_x86_64_	(4 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
11.31 0.00 1.99 0.05 0.00 86.65

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.92 0.06 1.78 4.00 14.95 20.58 0.01 4.95 16.35 4.56 0.46 0.08
vdb 0.00 0.05 0.43 0.95 27.82 40.99 99.55 0.03 23.05 24.75 22.28 1.68 0.23
dm-0 0.00 0.00 0.43 0.96 27.82 40.99 98.82 0.03 24.16 27.92 22.48 1.67 0.23

iotop

各线程IO读写排序

1
iotop -o
1
2
3
4
5
6
Total DISK READ :       0.00 B/s | Total DISK WRITE :      24.89 K/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
10821 be/4 webapp 0.00 B/s 3.56 K/s 0.00 % 0.00 % java
10832 be/4 webapp 0.00 B/s 7.11 K/s 0.00 % 0.00 % java
10833 be/4 webapp 0.00 B/s 3.56 K/s 0.00 % 0.00 % java

各进程IO读写排序

1
iotop -P -o
1
2
3
4
5
6
7
FTotal DISK READ :       0.00 B/s | Total DISK WRITE :      25.29 K/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s
PID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
10758 be/4 webapp 0.00 B/s 14.45 K/s 0.00 % 0.00 % java
19976 be/4 webapp 0.00 B/s 3.61 K/s 0.00 % 0.00 % java
32501 be/4 webapp 0.00 B/s 3.61 K/s 0.00 % 0.00 % ./service
13623 be/4 webapp 0.00 B/s 3.61 K/s 0.00 % 0.00 % nginx: worker process

进程打开的文件

lsof

进程打开的文件

1
lsof -p 10893
1
2
3
4
COMMAND   PID   USER   FD      TYPE             DEVICE  SIZE/OFF      NODE NAME
java 10893 webapp rtd DIR 253,1 4096 2 /
java 10893 webapp txt REG 252,0 7734 201451573 /opt/jdk1.8.0_131/bin/java
java 10893 webapp mem REG 252,0 256766 134407539 /opt/jdk1.8.0_131/jre/lib/amd64/libsunec.so

网络

网络数据读写监控

sar

网络数据包实时发送情况

1
sar -n DEV 1
1
2
3
4
5
Linux 3.10.0-693.2.2.el7.x86_64 (lingxi-test) 	2020年08月17日 	_x86_64_	(4 CPU)

15时17分39秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
15时17分40秒 eth0 655.00 408.00 145.84 83.68 0.00 0.00 0.00
15时17分40秒 lo 79.00 79.00 18.35 18.35 0.00 0.00 0.00
  • rxpck/s,txpck/s: 每秒接收发送的网络帧数
  • rxKB/s,txKB/s: 每秒接收发送的千字节数

iftop

按IP网络流速排行

1
iftop -B

image

按IP:端口号网络流速排行

1
iftop -B -P

image

  • TX:发送
  • RX:接收
  • TOTAL:总和
  • cum:运行iftop到目前时间的总流量
  • peak:流量峰值
  • rates:分别表示过去2s,10s,40s的平均流速

nethogs

按进程网络流速排行

1
nethogs
1
2
3
4
5
  PID USER     PROGRAM            DEV        SENT      RECEIVED       
17664 webapp ./tasty eth0 3.395 6.446 KB/sec
10893 webapp java eth0 3.913 6.036 KB/sec
32501 webapp ./service eth0 2.284 5.843 KB/sec
TOTAL 33.957 40.722 KB/sec

socket连接

netstat

TCP连接展示

1
netstat -natp
1
2
3
4
5
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 871/sshd
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 13541/nginx: master
tcp 0 52 172.x.x.x:22 220.x.x.x:21889 ESTABLISHED 22577/sshd: root@pt

TCP连接状态统计

1
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
1
2
3
4
SYN_RECV 1
CLOSE_WAIT 39
ESTABLISHED 680
TIME_WAIT 261

ss

TCP连接状态统计

1
ss -s
1
2
3
4
5
6
7
8
9
10
Total: 1015 (kernel 0)
TCP: 914 (estab 595, closed 222, orphaned 0, synrecv 0, timewait 210/0), ports 0

Transport Total IP IPv6
* 0 - -
RAW 0 0 0
UDP 14 13 1
TCP 692 644 48
INET 706 657 49
FRAG 0 0 0

监听端口展示

1
ss -lnt
1
2
3
4
5
6
7
State       Recv-Q Send-Q        Local Address:Port         Peer Address:Port              
LISTEN 0 128 *:111 *:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 *:443 *:*
LISTEN 0 128 :::111 :::*
LISTEN 0 80 :::3316 :::*

网络异常

sar

网络异常包实时监控

1
sar -n ETCP 1
1
2
3
4
5
6
Linux 3.10.0-693.2.2.el7.x86_64 (lingxi-test) 	2020年08月17日 	_x86_64_	(4 CPU)

21时11分09秒 atmptf/s estres/s retrans/s isegerr/s orsts/s
21时11分10秒 2.00 0.00 0.00 0.00 2.00
21时11分11秒 1.00 0.00 1.00 0.00 1.00
21时11分12秒 1.00 8.00 0.00 0.00 9.00
  • atmptf/s: 每秒TCP连接SYN-SENT/SYN-RCVD转换到CLOSED状态,以及SYN-RCVD转换到LISTEN状态数
  • estres/s: 每秒TCP连接从ESTABLISHED/CLOSE-WAIT状态转换到CLOSED状态数
  • retrans/s: 每秒重传包数
  • isegerr/s: 每秒接收错误段数(例如错误的TCP校验和)
  • orsts/s: 每秒发送RST包数

netstat

网络统计

常用于统计网络丢包数量、丢包原因等数据。

1
netstat -s
>