Linux性能监控
常用监控命令
查看机器重启的时间
$ date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S"
2017-10-19 22:33:51
top
查看CPU、进程相关
top - 19:19:27 up 3:47, 2 users, load average: 0.08, 0.21, 0.25
Tasks: 625 total, 1 running, 624 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.3 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 26351737+total, 25943582+free, 2268316 used, 1813224 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 25959619+avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8994 root 20 0 408120 8848 4036 S 11.3 0.0 24:37.84 nv-hostengine
1663 root 20 0 6105524 115296 58616 S 4.6 0.0 11:21.27 kubelet
4167 root 20 0 3082492 113180 40736 S 4.0 0.0 4:56.84 dockerd
6371 root 10 -10 4235844 477552 8632 S 1.0 0.2 2:27.79 ovs-vswitchd
358915 hzwengz+ 20 0 43640 4164 3020 R 0.7 0.0 0:00.16 top
8 root 20 0 0 0 0 S 0.3 0.0 0:08.89 rcu_sched
402 root 20 0 0 0 0 S 0.3 0.0 0:00.25 kworker/2:1
1236 root 20 0 206252 130096 126352 S 0.3 0.0 0:11.29 systemd-journal
1616 root 20 0 254324 4356 2536 S 0.3 0.0 0:06.58 rsyslogd
8995 root 20 0 2557228 13080 8928 S 0.3 0.0 0:27.75 pod-gpu-metrics
第1行任务队列信息:top - 05:43:27 up 4:52, 2 users, load average: 0.58, 0.41, 0.30
内容 | 含义 |
---|---|
05:43:27 | 表示当前时间 |
up 4:52 | 系统运行时间 格式为时:分 |
2 users | 当前登录用户数 |
load average: 0.58, 0.41, 0.30 | 系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。Load Average的值应该小于CPU个数*核数*0.7 |
第2行:Tasks: 159 total, 1 running, 158 sleeping, 0 stopped, 0 zombie
内容 | 含义 |
---|---|
159 total | 进程总数 |
1 running | 正在运行的进程数 |
158 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
第3行:%Cpu(s): 37.0 us, 3.7 sy, 0.0 ni, 59.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
内容 | 含义 |
---|---|
37.0 us | user用户空间占用CPU百分比。正常情况下只要服务器不是很闲,那么大部分的 CPU 时间应该都在此执行这类程序。 |
3.7 sy | system内核空间占用CPU百分比。通常情况下该值会比较小,但是当服务器执行的 IO 比较密集的时候,该值会比较大。 |
0.0 ni | 用户进程空间内改变过优先级的进程占用CPU百分比 |
59.3 id | idle空闲状态(执行 kernel idle handler)CPU百分比 |
0.0 wa | iowait等待io输入输出的CPU时间百分比 |
0.0 hi | 硬中断(Hardware IRQ)占用CPU的百分比 |
0.0 si | 软中断(Software Interrupts)占用CPU的百分比 |
0.0 st | steal管理程序维护另一个虚拟处理器时,虚拟机等待 hypervisor 调度 CPU 的时间百分比 |
异常排查
us的值过高,表示某些用户的进程占用了大量的 CPU
system的值过高,可能有较多的IO操作
iowait的值过高,意味着某些程序的 IO 操作效率很低,表示硬盘存在I/O瓶颈
idle值高,表示CPU较空闲
idle值高但系统响应慢时,可能是CPU等待分配内存,应加大内存容量。
idle值持续低于10,表明CPU处理能力相对较低,系统中最需要解决的资源是CPU。
steal值过高,表示虚拟机超售了
第4行:KiB Mem: 1530752 total, 1481968 used, 48784 free, 70988 buffers
内容 | 含义 |
---|---|
KiB Mem: 1530752 total | 物理内存总量 |
1481968 used | 使用的物理内存总量 |
48784 free | 空闲内存总量 |
70988 buffers(buff/cache) | 用作内核缓存的内存量 |
第5行:KiB Swap: 3905532 total, 267544 used, 3637988 free. 617312 cached Mem
内容 | 含义 |
---|---|
KiB Swap: 3905532 total | 交换区总量 |
267544 used | 使用的交换区总量 |
3637988 free | 空闲交换区总量 |
617312 cached Mem | 缓冲的交换区总量。 |
3156100 avail Mem | 代表可用于进程下一次分配的物理内存数量 |
可用内存 = 第四行的free + 第四行的buffers + 第五行的cached
vmstat
查看CPU、内存、IO相关
vmstat,sar和iostat命令都包含在sysstat(系统监控工具)软件包中
# Virtual Meomory Statistics
$ vmstat 1 5 -S M # k, K, m or M (default is KiB)
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 235 2728 269 2152 0 0 0 9 0 0 3 1 96 0 0
0 0 235 2728 269 2152 0 0 0 104 394 735 3 2 96 0 0
0 0 235 2727 269 2152 0 0 0 4 377 690 3 0 97 0 0
0 0 235 2727 269 2152 0 0 0 0 351 715 3 1 96 0 0
0 0 235 2727 269 2152 0 0 0 0 461 788 2 1 96 0 0
###
r:处在 runnable 状态的任务,包括正在运行的任务和等待运行的任务。这个值比平均负载能更好地看出 CPU 是否饱和。这个值不包含等待 io 相关的任务。当 r 的值比当前 CPU 个数要大的时候,系统就处于饱和状态了。
free:以 KB 计算的空闲内存大小。
si,so:换入换出的内存页。如果这两个值非零,表示内存不够了。
us,sy,id,wa,st:CPU 时间的各项指标(对所有 CPU 取均值),分别表示:用户态时间,内核态时间,空闲时间,等待 io,偷取时间(在虚拟化环境下系统在其它租户上的开销)
###
mpstat
查看CPU相关
$ mpstat -P ALL
Linux 3.16.0-6-amd64 (tel-jumpserver) 11/14/2020 _x86_64_ (4 CPU)
10:58:28 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
10:58:28 AM all 3.61 0.00 0.91 0.06 0.00 0.02 0.06 0.00 0.00 95.33
10:58:28 AM 0 3.74 0.00 0.94 0.07 0.00 0.03 0.08 0.00 0.00 95.15
10:58:28 AM 1 3.68 0.00 0.93 0.06 0.00 0.02 0.07 0.00 0.00 95.24
10:58:28 AM 2 3.58 0.00 0.89 0.06 0.00 0.02 0.05 0.00 0.00 95.40
10:58:28 AM 3 3.46 0.00 0.89 0.06 0.00 0.02 0.05 0.00 0.00 95.51
iostat
查看磁盘IO相关
$ iostat 1 2
$ iostat -p sdb
Linux 4.9.65-netease (pubt2-ceph2.dg.163.org) 06/16/2020 _x86_64_ (56 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.21 0.00 0.17 0.01 0.00 99.60
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sdb 4.44 7.41 8.34 798848 898840
$ iostat -d -x -k 1 2
Linux 4.9.65-netease (pubt2-ceph2.dg.163.org) 06/16/2020 _x86_64_ (56 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdt 0.01 8.49 0.27 13.76 16.87 631.68 92.44 0.01 0.96 4.42 0.89 0.06 0.08
sdd 0.00 0.00 0.55 4.04 8.68 8.32 7.40 0.00 0.05 0.16 0.04 0.05 0.02
sda 0.00 0.00 0.53 4.04 9.04 8.28 7.58 0.00 0.06 0.17 0.04 0.05 0.02
虚拟机在线不重启添加硬盘 for i in /sys/class/scsi_host/host*/scan;do echo "- - -" >$i;done
# 运行状态
uptime
# 日志
dmesg -T| tail
# pid
pidstat 1
# io
iostat -xz 1
# 内存
free -m
# 网卡
sar -n DEV 1
# 进程
sar -n TCP,ETCP 1
===
active/s:每秒钟本地主动开启的 TCP 连接,也就是本地程序使用 connect() 系统调用
passive/s:每秒钟从源端发起的 TCP 连接,也就是本地程序使用 accept() 所接受的连接
retrans/s:每秒钟的 TCP 重传次数
atctive 和 passive 的数目通常可以用来衡量服务器的负载:接受连接的个数(passive),下游连接的个数(active)。可以简单认为 active 为出主机的连接,passive 为入主机的连接;但这个不是很严格的说法,比如 loalhost 和 localhost 之间的连接。
===
dstat
查看CPU、内存、IO、网卡相关信息
与sysstat
相比,dstat
是一个python编写的相对全能的工具,拥有彩色界面。
# cpu、disk、net、paging、system -cdngy
$ dstat
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
3 2 95 0 0 0|1504B 1405k| 0 0 | 0 0 |8706 58k
2 2 96 0 0 0| 0 120k| 387k 419k| 0 0 | 16k 54k
# net、cpu、disk、mem、tcp
$ dstat -ntcdm --tcp
-net/total- ----system---- ----total-cpu-usage---- -dsk/total- ------memory-usage----- ----tcp-sockets----
recv send| time |usr sys idl wai hiq siq| read writ| used buff cach free|lis act syn tim clo
0 0 |14-04 15:04:09| 3 2 95 0 0 0|1504B 1405k|38.2G 4197M 131G 206G| 52 4 2 18 0
361k 456k|14-04 15:04:10| 1 2 96 0 0 0| 0 64k|38.2G 4197M 131G 206G| 52 4 2 18 0
336k 367k|14-04 15:04:11| 2 2 96 0 0 0| 0 4096B|38.2G 4197M 131G 206G| 52 4 2 18 0
找出占用资源最高的进程和用户
$ dstat --top-mem --top-io --top-cpu
--most-expensive- ----most-expensive---- -most-expensive-
memory process | i/o process | cpu process
PM2 v2.9.1: 121G|bash 0 0 |getty 2.1
PM2 v2.9.1: 121G| |getty 2.1
iftop
查看网卡流量相关
$ iftop -n -i bond0
nload
查看网络带宽相关
nload是一个命令行工具,让用户可以分开来监控入站流量和出站流量。它还可以绘制图表以显示入站流量和出站流量,视图比例可以调整。用起来很简单,不支持许多选项。
# 上、下键可以切换网卡
$ nload -t 200 -i 1024 -o 128 -U M
$ nload -t 200 bond0
nethogs
查看进程流量相关
$ sudo nethogs bond0.3002
sar
查看网卡、CPU、内存、IO相关参数
常用参数
Usage: sar [ options ] [ <interval> [ <count> ] ]
-A:所有报告的总和
-u:输出CPU使用情况的统计信息
-v:输出inode、文件和其他内核表的统计信息
-d:输出每一个块设备的活动信息
-r:输出内存和交换空间的统计信息
-b:显示I/O和传送速率的统计信息
-a:文件读写情况
-c:输出进程统计信息,每秒创建的进程数
-R:输出内存页面的统计信息
-y:终端设备活动情况
-w:输出系统交换活动信息
-n:DEV网络接口信息 | EDEV网络错误的统计数据 | NFS NFS客户端的信息| NFSD NFS服务器的信息 | SOCK套接字信息 | ALL
# 网卡流量,每一秒钟取1次值,取2次
sar -n DEV 1 2
要判断系统瓶颈问题,有时需几个 sar 命令选项结合起来
- 怀疑CPU存在瓶颈,可用
sar -u
和sar -q
等来查看 - 怀疑内存存在瓶颈,可用
sar -B
、sar -r
和sar -W
等来查看 - 怀疑I/O存在瓶颈,可用
sar -b
、sar -u
和sar -d
等来查看
CPU资源监控
$ sar -u 2 3
Linux 4.9.65-netease (pubt2-ceph2.dg.163.org) 06/16/2020 _x86_64_ (56 CPU)
10:39:28 PM CPU %user %nice %system %iowait %steal %idle
10:39:30 PM all 0.27 0.00 0.11 0.00 0.00 99.62
10:39:32 PM all 0.13 0.00 0.15 0.00 0.00 99.72
10:39:34 PM all 0.21 0.00 0.19 0.00 0.00 99.61
Average: all 0.20 0.00 0.15 0.00 0.00 99.65
CPU:all 表示统计信息为所有 CPU 的平均值。
%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。
%nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。
%system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。
%iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。
%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。
1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈
2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量
3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。
inode、文件和其他内核表监控
$ sar -v 2 3
Linux 4.9.65-netease (pubt2-ceph2.dg.163.org) 06/16/2020 _x86_64_ (56 CPU)
10:40:42 PM dentunusd file-nr inode-nr pty-nr
10:40:44 PM 361579 6832 163416 3
10:40:46 PM 361457 6720 163306 3
10:40:48 PM 361448 6608 163287 3
Average: 361495 6720 163336 3
dentunusd:目录高速缓存中未被使用的条目数量
file-nr:文件句柄(file handle)的使用数量
inode-nr:索引节点句柄(inode handle)的使用数量
pty-nr:使用的pty数量
内存和交换空间监控
$ sar -r 2 3
Linux 4.9.65-netease (pubt2-ceph2.dg.163.org) 06/16/2020 _x86_64_ (56 CPU)
10:41:40 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
10:41:42 PM 251128964 12406412 4.71 1214024 2808424 30464568 11.56 8922432 1882688 168
10:41:44 PM 251125204 12410172 4.71 1214024 2808508 30432984 11.55 8925864 1882764 180
10:41:46 PM 251127356 12408020 4.71 1214024 2808548 30414880 11.54 8923240 1882808 196
Average: 251127175 12408201 4.71 1214024 2808493 30437477 11.55 8923845 1882753 181
kbmemfree:这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间.
kbmemused:这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间.
%memused:这个值是kbmemused和内存总量(不包括swap)的一个百分比.
kbbuffers和kbcached:这两个值就是free命令中的buffer和cache.
kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).
%commit:这个值是kbcommit与内存总量(包括swap)的一个百分比.
$ sar -B 2 3
Linux 4.9.65-netease (pubt2-ceph2.dg.163.org) 06/16/2020 _x86_64_ (56 CPU)
10:42:27 PM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
10:42:29 PM 0.00 312.00 5656.00 0.00 7310.50 0.00 0.00 0.00 0.00
10:42:31 PM 0.00 196.00 8574.00 0.00 14734.00 0.00 0.00 0.00 0.00
10:42:33 PM 0.00 232.00 3498.00 0.00 8107.00 0.00 0.00 0.00 0.00
Average: 0.00 246.67 5909.33 0.00 10050.50 0.00 0.00 0.00 0.00
pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB)
pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)
fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)
majflt/s:每秒钟产生的主缺页数.
pgfree/s:每秒被放入空闲队列中的页个数
pgscank/s:每秒被kswapd扫描的页个数
pgscand/s:每秒直接被扫描的页个数
pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数
%vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比
I/O和传送速率监控
$ sar -b 2 3
Linux 4.9.65-netease (pubt2-ceph2.dg.163.org) 06/16/2020 _x86_64_ (56 CPU)
10:43:04 PM tps rtps wtps bread/s bwrtn/s
10:43:06 PM 81.00 0.00 81.00 0.00 476.00
10:43:08 PM 84.00 0.00 84.00 0.00 544.00
10:43:10 PM 88.50 0.00 88.50 0.00 620.00
Average: 84.50 0.00 84.50 0.00 546.67
tps:每秒钟物理设备的 I/O 传输总量
rtps:每秒钟从物理设备读入的数据总量
wtps:每秒钟向物理设备写入的数据总量
bread/s:每秒钟从物理设备读入的数据量,单位为 块/s
bwrtn/s:每秒钟向物理设备写入的数据量,单位为 块/s
设备使用情况监控
$ sar -d 2 1 -p
Linux 4.9.65-netease (pubbeta2-curve3.dg.163.org) 06/16/2020 _x86_64_ (56 CPU)
10:45:43 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
10:45:45 PM sda 49.00 0.00 732.00 14.94 0.01 0.20 0.20 1.00
10:45:45 PM nbd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
10:45:45 PM nbd1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
10:45:45 PM nbd2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
10:45:45 PM nbd3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
10:45:45 PM nbd4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
10:45:45 PM nbd5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
Average: sda 49.00 0.00 732.00 14.94 0.01 0.20 0.20 1.00
Average: nbd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: nbd1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: nbd2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: nbd3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: nbd4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: nbd5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
参数-p可以打印出sda,hdc等磁盘设备名称,如果不用参数-p,设备节点则有可能是dev8-0,dev22-0
tps:每秒从物理磁盘I/O的次数.多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不确定的.
rd_sec/s:每秒读扇区的次数.
wr_sec/s:每秒写扇区的次数.
avgrq-sz:平均每次设备I/O操作的数据大小(扇区).
avgqu-sz:磁盘请求队列的平均长度.
await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒=1000毫秒).
svctm:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间.
%util:I/O请求占CPU的百分比,比率越大,说明越饱和.