了解系统资源, 哪十条命令?
- uptime
- dmesg | tail
- vmstat 1
- mpstat -P ALL 1
- pidstat 1
- iostat -xz 1
- free -m
- sar -n DEV 1
- sar -n TCP,ETCP 1
- top
详细说说它们
uptime
可以快速查看机器的负载情况
- [root@aliyun ~]# uptime
- 17:17:19 up 135 days, 5:33, 2 users, load average: 0.00, 0.01, 0.05
如果 1 分钟平均负载很高, 而 15 分钟平均负载很低, 说明服务器正在命令高负载情况, 需要进一步排查 CPU 资源都消耗在了哪里. 反之, 如果 15 分钟平均负载很高, 1 分钟平均负载较低, 则有可能是 CPU 资源紧张时刻已经过去.
dmesg | tail
输出系统日志的最后 10 行
- [root@aliyun ~]# dmesg | tail
- [12525885.819331] docker0: port 1(vethc57a88d) entered forwarding state
- [12525885.820817] docker0: port 1(vethc57a88d) entered disabled state
- [12525886.011388] IPv6: ADDRCONF(NETDEV_CHANGE): vethc57a88d: link becomes ready
- [12525886.012158] docker0: port 1(vethc57a88d) entered forwar
可以看见一次内核的 oom kill 和一次 TCP 丢包. 这些日志可以帮助排查性能问题. 千万不要忘了这一步
vmstat 1
每秒输出一些系统核心指标, 持续输出
- [root@aliyun ~]# vmstat 1
- 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 221824 149968 785120 0 0 0 3 3 0 1 0 99 0 0
- 0 0 0 221824 149968 785104 0 0 0 0 197 432 1 1 98 0 0
每秒统计 1 次, 总共统计 10 次
- [root@aliyun ~]# vmstat 1 10
- procs -----------memory---------- ---swap-- -----io---- -system-- ------CPU-----
- r b swpd free buff cache si so bi bo in cs us sy id wa st
- 4 0 0 221840 149980 785104 0 0 0 3 3 0 1 0 99 0 0
- 0 0 0 221824 149980 785104 0 0 0 0 161 404 0 0 100 0 0```
介绍一些和性能调优相关的列
r:
等待在 CPU 资源的进程数. 这个数据比平均负载更加能够体现 CPU 负载情况, 数据中不包含等待 IO 的进程. 如果这个数值大于机器 CPU 核数, 那么机器的 CPU 资源已经饱和.
free:
系统可用内存数(以千字节为单位), 如果剩余内存不足, 也会导致系统性能问题. 下文介绍到的 free 命令, 可以更详细的了解系统内存的使用情况.
si, so:
交换区写入和读取的数量. 如果这个数据不为 0, 说明系统已经在使用交换区(swap), 机器物理内存已经不足.
us, sy, id, wa, st:
这些都代表了 CPU 时间的消耗, 它们分别表示用户时间 (user), 系统(内核) 时间 (sys), 空闲时间(idle),IO 等待时间(wait) 和被偷走的时间(stolen, 一般被其他虚拟机消耗).
上述这些 CPU 时间, 可以让我们很快了解 CPU 是否出于繁忙状态. 一般情况下, 如果用户时间和系统时间相加非常大, CPU 出于忙于执行指令. 如果 IO 等待时间很长, 那么系统的瓶颈可能在磁盘 IO.
4. mpstat -P ALL 1
该命令可以显示每个逻辑 CPU 的占用情况, 如果有一个 CPU 占用率特别高, 那么有可能是一个单线程应用程序引起的.
- $ mpstat -P ALL 1
- 5. pidstat 1
- [root@aliyun ~]# pidstat 1
- Linux 3.10.0-514.26.2.el7.x86_64 (aliyun.com) 01/09/2019 x86_64 (1 CPU)
- 10:01:57 AM UID PID %usr %system %guest %CPU CPU Command
- 10:01:58 AM 0 18862 1.00 0.00 0.00 1.00 0 AliYunDun
- 10:01:58 AM UID PID %usr %system %guest %CPU CPU Command
- 6. iostat -xz 1
iostat 命令主要用于查看机器磁盘 IO 情况
- $ iostat -xz 1
- Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 x86_64 (32 CPU)
- avg-CPU: %user %nice %system %iowait %steal %idle
- 73.96 0.00 3.73 0.03 0.06 22.21
- Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
- xvda 0.00 0.23 0.21 0.18 4.52 2.08 34.37 0.00 9.98 13.80 5.42 2.44 0.09
- xvdb 0.01 0.00 1.02 8.94 127.97 598.53 145.79 0.00 0.43 1.78 0.28 0.25 0.25
- xvdc 0.01 0.00 1.02 8.86 127.79 595.94 146.50 0.00 0.45 1.82 0.30 0.27 0.26
- dm-0 0.00 0.00 0.69 2.32 10.47 31.69 28.01 0.01 3.23 0.71 3.98 0.13 0.04
- dm-1 0.00 0.00 0.00 0.94 0.01 3.78 8.00 0.33 345.84 0.04 346.81 0.01 0.00
- dm-2 0.00 0.00 0.09 0.07 1.35 0.36 22.50 0.00 2.55 0.23 5.62 1.78 0.03
该命令输出的列, 主要含义是:
r/s, w/s, rkB/s, wkB/s:
分别表示每秒读写次数和每秒读写数据量(千字节). 读写量过大, 可能会引起性能问题.
await:
IO 操作的平均等待时间, 单位是毫秒. 这是应用程序在和磁盘交互时, 需要消耗的时间, 包括 IO 等待和实际操作的耗时. 如果这个数值过大, 可能是硬件设备遇到了瓶颈或者出现故障.
avgqu-sz:
向设备发出的请求平均数量. 如果这个数值大于 1, 可能是硬件设备已经饱和(部分前端硬件设备支持并行写入).
%util:
设备利用率. 这个数值表示设备的繁忙程度, 经验值是如果超过 60, 可能会影响 IO 性能(可以参照 IO 操作平均等待时间). 如果到达 100%, 说明硬件设备已经饱和.
如果显示的是逻辑设备的数据, 那么设备利用率不代表后端实际的硬件设备已经饱和. 值得注意的是, 即使 IO 性能不理想, 也不一定意味这应用程序性能会不好, 可以利用诸如预读取, 写缓存等策略提升应用性能.
7. free -m
可以查看系统内存的使用情况, -m 参数表示按照兆字节展示
- $ free -m
- total used free shared buffers cached
- Mem: 245998 24545 221453 83 59 541
- -/+ buffers/cache: 23944 222053
- Swap: 0 0 0
最后两列分别表示用于 IO 缓存的内存数, 和用于文件系统页缓存的内存数. 需要注意的是, 第二行 -/+ buffers/cache, 看上去缓存占用了大量内存空间. 这是 Linux 系统的内存使用策略, 尽可能的利用内存, 如果应用程序需要内存, 这部分内存会立即被回收并分配给应用程序. 因此, 这部分内存一般也被当成是可用内存.
如果可用内存非常少, 系统可能会动用交换区(如果配置了的话), 这样会增加 IO 开销(可以在 iostat 命令中提现), 降低系统性能
8. sar -n DEV 1
sar 命令在这里用于查看 TCP 连接状态
- $ sar -n TCP,ETCP 1
- Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 x86_64 (32 CPU)
- 12:17:19 AM active/s passive/s iseg/s oseg/s
- 12:17:20 AM 1.00 0.00 10233.00 18846.00
- 12:17:19 AM atmptf/s estres/s retrans/s isegerr/s orsts/s
- 12:17:20 AM 0.00 0.00 0.00 0.00 0.00
- 12:17:20 AM active/s passive/s iseg/s oseg/s
- 12:17:21 AM 1.00 0.00 8359.00 6039.00
- 12:17:20 AM atmptf/s estres/s retrans/s isegerr/s orsts/s
- 12:17:21 AM 0.00 0.00 0.00 0.00 0.00
字段含义:
active/s:
每秒本地发起的 TCP 连接数, 既通过 connect 调用创建的 TCP 连接;
passive/s:
每秒远程发起的 TCP 连接数, 即通过 accept 调用创建的 TCP 连接;
retrans/s:
每秒 TCP 重传数量;
TCP 连接数可以用来判断性能问题是否由于建立了过多的连接, 进一步可以判断是主动发起的连接, 还是被动接受的连接. TCP 重传可能是因为网络环境恶劣, 或者服务器压力过大导致丢包.
- 9. sar -n TCP,ETCP 1
- [root@aliyun ~]# sar -n TCP,ETCP 1
- Linux 3.10.0-514.26.2.el7.x86_64 (aliyun.com) 01/09/2019 x86_64 (1 CPU)
- 10:15:37 AM active/s passive/s iseg/s oseg/s
- 10:15:38 AM 0.00 0.00 1.01 1.01
- 10:15:37 AM atmptf/s estres/s retrans/s isegerr/s orsts/s
- 10:15:38 AM 0.00 0.00 0.00 0.00 0.00
- 10. top
命令包含了前面好几个命令的检查的内容.
比如系统负载情况 (uptime), 系统内存使用情况(free), 系统 CPU 使用情况(vmstat) 等.
因此通过这个命令, 可以相对全面的查看系统负载的来源.
同时, top 命令支持排序, 可以按照不同的列排序, 方便查找出诸如内存占用最多的进程, CPU 占用率最高的进程等.
Processes: 319 total, 2 running, 317 sleeping, 1163 threads 20:19:01
Load Avg: 2.28, 2.05, 1.99 CPU usage: 4.55% user, 6.23% sys, 89.20% idle
SharedLibs: 176M resident, 46M data, 19M linkedit.
MemRegions: 46532 total, 2652M resident, 126M private, 839M shared.
PhysMem: 7048M used (1197M wired), 1141M unused.
VM: 857G vsize, 627M framework vsize, 108522(0) swapins, 131439(0) swapouts.
Networks: packets: 1105387/1215M in, 785149/77M out.
- Disks: 479919/31G read, 404844/49G written.
- PID COMMAND %CPU TIME #TH #WQ #PORT MEM PURG CMPRS PGRP PPID
- 56978 top 4.0 00:00.53 1/1 0 20 2544K 0B 0B 56978 51030
- 56975 quicklookd 0.0 00:00.09 4 1 88 4256K 32K 0B 56975 1
- 56720 mdworker 0.0 00:00.07 3 1 49 3032K 0B 0B 56720 1
- 56719 mdworker 0.0 00:00.06 3 1 49 2936K 0B 0B 56719 1
- 56677 Google Chrom 0.2 01:17.58 20 2 162 99M 0B 0B 435 435
- 56664 ocspd 0.0 00:00.02 2 1 35 1612K 0B 0B 56664 1
- 56340 com.apple.Co 0.0 00:00.06 2 2 38 400K 0B 2464K 56340 1
- 56317 netbiosd 0.0 00:00.06 2 2 30 1036K 0B 1480K 56317 1
- 56147 com.apple.sp 0.0 00:00.04 2 1 48 336K 0B 2032K 56147 1
- 56107 mdworker 0.0 00:00.18 3 1 58 3216K 0B 1876K 56107 1
- 56093 MTLCompilerS 0.0 00:00.09 2 2 32 11M 0B 8192B 56093 1
- 56072 mdworker 0.0 00:02.51 4 1 47 12M 0B 676K 56072 1
来源: https://yq.aliyun.com/articles/685447