Linux命令拾遗-硬件资源观测

语言: CN / TW / HK

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。

简介

这是Linux命令拾遗系列的第四篇,本篇主要介绍Linux中观测硬件资源的命令,如top、vmstat、pidstat、iostat、sar等。

本系列文章索引
Linux命令拾遗-入门篇
Linux命令拾遗-文本处理篇
Linux命令拾遗-软件资源观测

CPU与内存观测

vmstat

vmstat全名是虚拟内存统计信息命令,看起来好像是用来观测内存的,实际上cpu、内存、io资源它都能观测。
bash $ vmstat -w 1 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 12531512 102680 274940 0 0 0 3 0 3 0 0 100 0 0 2 0 0 12531512 102680 274940 0 0 0 0 106 55 25 0 75 0 0 2 0 0 12531512 102680 274940 0 0 0 0 105 58 25 0 75 0 0 2 0 0 12531512 102680 274940 0 0 0 0 105 56 25 0 75 0 0 1s显示一次,第一行是系统启动以来的统计信息,一般可忽略不看,从第二行开始看即可。
- r:cpu运行队列长度,即有多少线程等待操作系统调度运行,这可看做是cpu的饱和度指标,长时间处于高值一般都有问题。
- b: 不可中断阻塞的线程数量,一般就是阻塞于io访问的线程数量。
- swpd: 内存交换到磁盘的内存大小,单位kB
- free:剩余内存大小,单位kB
- buff: 用于buff的内存大小,单位kB
- cache:用于文件页面缓存的内存大小,单位kB
- si:磁盘换入到内存的当前速度,单位kB/s
- so:内存换出到磁盘的当前速度,单位kB/s
- bi:每秒读取的磁盘块数量,单位blocks/s
- bo:每秒写入的磁盘块数量,单位blocks/s
- in:每秒中断数量
- cs:每秒线程上下文切换次数
- us:cpu用户态使用率
- sy:cpu内核态使用率
- id:cpu空闲率
- wa:等待I/O,线程被阻塞等待磁盘I/O时的CPU空闲时间占总时间的比例
- st:steal偷取,CPU在虚拟化环境下在其他租户上的开销

mpstat

mpstat是用来查看cpu上各个核的cpu使用率的,如下:
```bash $ mpstat -P ALL 1 Linux 4.19.128-microsoft-standard (DESKTOP-GC9LLHC) 10/24/21 x86_64 (8 CPU)

12:39:37 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 12:39:38 all 24.57 0.00 0.00 0.00 0.00 1.72 0.00 0.00 0.00 73.71 12:39:38 0 0.00 0.00 0.00 0.00 0.00 12.28 0.00 0.00 0.00 87.72 12:39:38 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 12:39:38 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 12:39:38 3 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:39:38 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 12:39:38 5 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:39:38 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 12:39:38 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 如上,可见3、5号核的cpu使用率基本满载,而其它核非常空闲,这一般是由于程序多线程设计上有问题,导致某部分线程非常忙,另一部分线程没事干,而mpstat就是用来观测是否有这种cpu核负载不均的问题的。 上面之所以cpu不均衡,是因为我使用stress命令,让2个核满载了,如下:bash $ stress -c 2 另外,如果你使用了Linux中的绑核机制,将程序固定在某些核上运行,但绑核配置不合理,也会出现这种现象,如下,我将已在运行的stree进程绑定到1,2号核上运行:bash

查询stress进程号

$ pgrep stress 5477 5478 5479

使用taskset绑核

$ taskset -pc 1,2 5478 pid 5478 current affinity list: 0-7 pid 5478 new affinity list: 1,2 $ taskset -pc 1,2 5479 pid 5479 current affinity list: 0-7 pid 5479 new affinity list: 1,2

查看绑核情况

$ taskset -pc 5479 pid 5479 current affinity list: 1,2

用mpstat查看cpu使用率,现在发现1,2号核都100%了

$ mpstat -P ALL 1 1 Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle Average: all 24.78 0.00 0.00 0.00 0.00 0.99 0.00 0.00 0.00 74.23 Average: 0 0.00 0.00 0.00 0.00 0.00 7.48 0.00 0.00 0.00 92.52 Average: 1 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: 2 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 Average: 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 Average: 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 Average: 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 Average: 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 ```

注:绑核其实有利有弊的,程序绑定在某些核上运行,可以避免线程在核间迁移,从而提高CPU缓存的利用率,但一般来说,现在的大多数程序其实是不推荐使用绑核机制的,这应该交给Docker等基础设施来管理。

top

上面的vmstat、mpstat命令只能看整个系统的情况,而top、pidstat则可以看各个进程的情况,如下:
``` $ top top - 13:14:07 up 2 days, 6:38, 0 users, load average: 1.65, 0.59, 0.27 Tasks: 17 total, 3 running, 14 sleeping, 0 stopped, 0 zombie %Cpu(s): 25.0 us, 0.0 sy, 0.0 ni, 74.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 12693.4 total, 12052.8 free, 271.6 used, 368.9 buff/cache MiB Swap: 4096.0 total, 4096.0 free, 0.0 used. 12171.8 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3174 work 20 0 3860 104 0 R 100.0 0.0 1:40.75 stress 3175 work 20 0 3860 104 0 R 100.0 0.0 1:40.76 stress 1 root 20 0 900 492 428 S 0.0 0.0 0:00.11 init 10 work 20 0 10044 5140 3424 S 0.0 0.0 0:00.12 bash 3051 work 20 0 6393208 204364 20116 S 0.0 1.6 0:07.51 java 3173 work 20 0 3860 980 896 S 0.0 0.0 0:00.00 stress 3176 work 20 0 10888 3932 3348 R 0.0 0.0 0:00.02 top ``` - 第一行是系统概要:当前时间,系统启动时长,系统用户数,系统负载1min/5min/15min
- 第二行是任务概要:总任务数,正在运行/睡眠/暂停/僵尸任务数
- 第三行cpu使用率:
us:非niced进程花费的cpu时间占比
sy:内核进程花费的cpu时间占比
ni:niced进程花费的cpu时间占比
id:内核空闲进程花费的cpu时间占比,一般来说CPU是无法空闲的,CPU空闲着,指的是在运行一个空闲程序的代码。
wa:等待磁盘io完成花费的cpu时间占比
hi:处理硬件中断花费的cpu时间占比
si:处理软件中断花费的cpu时间占比
st:被其它虚拟机偷取的cpu时间占比
- 第四行是内存使用率:
total:总内存大小(MB)
free:空闲内存大小(MB)
used:使用中的内存大小(MB)
buff/cache:用于文件缓存与系统缓存的内存大小(MB)
- 第五行是swap情况:
total:总swap文件大小
free:swap空闲大小
used:swap使用大小
avail Mem:可用内存大小,和swap无关,约等于上一行中free+buff/cache

下面的列表显示的就是各进程情况了,除此之外,top还是个交互式命令,可直接在这个界面输入指令使用其更多功能,如下:
|指令|功能描述| |-|-| |1|查看1号cpu各核的cpu使用情况,类似mpstat| |M|进程按内存使用率倒序,同时按shift + m| |P|进程按cpu使用率倒序,同时按shift + p| |H|查看线程情况,同时按shift + h| |c|查看进程的完整命令行| |k|杀死指定pid的进程| |h|查看帮助| |q|退出top|

注意,这里面的指令,很多都是开关式的,比如按1显示cpu各核使用率,再按1就显示整体cpu使用率了。
另外,如果你的电脑是8核的,top中进程的CPU%最高可以到800%,初次看到这种现象时,还很容易吓一跳呢!

pidstat

pidstat基本和top功能是类似的,不过它是非交互式的命令,一般作为top的补充使用,如下:
```bash

默认查看活动进程的cpu使用情况,加-t可以查看线程的

$ pidstat 1 13:32:45 UID PID %usr %system %guest %wait %CPU CPU Command 13:32:46 1000 3051 0.00 1.00 0.00 0.00 1.00 1 java 13:32:46 1000 3241 100.00 0.00 0.00 0.00 100.00 7 stress 13:32:46 1000 3242 100.00 0.00 0.00 0.00 100.00 5 stress

Average: UID PID %usr %system %guest %wait %CPU CPU Command Average: 1000 3051 0.00 0.33 0.00 0.00 0.33 - java Average: 1000 3241 100.00 0.00 0.00 0.00 100.00 - stress Average: 1000 3242 100.00 0.00 0.00 0.00 100.00 - stress

-w可以看线程上下文切换情况

cswch/s:自愿上下文切换,比如等待io或锁

nvcswch/s:非自愿上下文切换,比如分给自己时间片用完了,一般需要关注这个,因为现在的程序大多是io密集型的,用完时间片的机会很少

$ pidstat -w 1 13:37:57 UID PID cswch/s nvcswch/s Command 13:37:58 1000 3299 1.00 0.00 pidstat

13:37:58 UID PID cswch/s nvcswch/s Command 13:37:59 0 8 1.00 0.00 init 13:37:59 1000 9 1.00 0.00 wsltermd 13:37:59 1000 3299 1.00 0.00 pidstat

-v可以看运行进程的线程数与文件描述符数量

$ pidstat -v 1 01:41:34 PM UID PID threads fd-nr Command 01:41:35 PM 1000 876 95 177 java

-r可以看运行进程的内存使用情况以及缺页情况

minflt/s:轻微缺页,一般不用太关注

majflt/s:严重缺页,一般意味着发生了swrap,量较大时需要关注

$ pidstat -r 1 02:07:24 PM UID PID minflt/s majflt/s VSZ RSS %MEM Command 02:07:25 PM 999 2786 2.00 0.00 52792 3140 0.08 redis-server 02:07:25 PM 1000 601098 1.00 0.00 13976 6296 0.16 sshd

-d可以看某个进程的io使用情况

$ pidstat -d 1 14:12:06 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command 14:12:07 1000 3051 0.00 80.00 0.00 0 java 14:12:07 1000 3404 0.00 0.00 0.00 79 stress ```

free

其实上面的vmstat、top已经可以看到内存使用情况了,free命令更纯粹一点,如下:
```bash

查看内存使用情况,-m以MB为单位,-g可以使其以GB为单位

$ free -m total used free shared buff/cache available Mem: 3907 1117 778 3 2012 2503 Swap: 1897 708 1189 `` 要特别注意里面的free、buff/cache以及available,如下: - free:系统空闲内存,一般来说,随着使用时间越来越长,Linux中free会越来越小,原因是Linux会把访问的文件数据尽可能地缓存在内存中,以便下次读取时能快速返回 - buff/cache:就是文件缓存到内存中所占内存的大小 - available:系统真正的可用内存,约等于free+buff/cache`,所以系统内存是否足够,你应该看available的值。

slabtop

slab是Linux操作系统的一种内存分配机制。slab分配器是基于对象进行管理,相同类型的对象归为一类(如进程描述符就是一类),每申请这样一个对象,slab分配器就从一个slab列表中分配一个这样大小的单元出去,而释放时,将其重新保存在该列表中,当以后又要请求新的对象时,就可以从列表中直接获取而不用重复初始化。

其实你可以直接把它理解为内核实现对象池的一种机制,它包含在buff/cache列中,如下可以观测它的内存占用情况:
``` $ sudo slabtop Active / Total Objects (% used) : 1641750 / 1772440 (92.6%) Active / Total Slabs (% used) : 35906 / 35906 (100.0%) Active / Total Caches (% used) : 107 / 158 (67.7%) Active / Total Size (% used) : 512123.18K / 553465.83K (92.5%) Minimum / Average / Maximum Object : 0.01K / 0.31K / 16.75K

OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME 282324 246579 87% 0.19K 6722 42 53776K dentry 173824 159910 91% 0.03K 1358 128 5432K kmalloc-32 173784 164054 94% 0.10K 4456 39 17824K buffer_head 167580 159572 95% 0.13K 2793 60 22344K kernfs_node_cache 100839 89862 89% 1.07K 3479 29 111328K ext4_inode_cache 91260 86183 94% 0.81K 2340 39 74880K fuse_inode 65084 62708 96% 0.59K 1228 53 39296K inode_cache 64576 64401 99% 0.50K 1009 64 32288K kmalloc-512 53120 51516 96% 0.06K 830 64 3320K anon_vma_chain ```

磁盘观测

df

df命令可以很容易的看到文件系统的空间使用情况,如下:
bash $ df -h Filesystem Size Used Avail Use% Mounted on udev 1.9G 0 1.9G 0% /dev tmpfs 391M 2.7M 389M 1% /run /dev/sda1 276G 150G 115G 57% / tmpfs 2.0G 0 2.0G 0% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock /dev/sda1Use%这一列可以看到磁盘使用了57%了。

iostat

iostat命令可以很方便的查看磁盘当前的IO情况,如下:
```bash $ iostat -xz 1 avg-cpu: %user %nice %system %iowait %steal %idle 0.06 0.00 0.00 0.00 0.00 99.94

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 1.87 17854.96 3799.10 14930.26 42642.19 208548.03 26.82 7.10 0.37 1.04 0.20 0.28 522.73

avg-cpu: %user %nice %system %iowait %steal %idle 4.36 0.00 0.00 0.00 0.00 95.64

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 0.00 606.00 0.00 2616.00 8.63 0.04 0.06 0.00 0.06 0.06 3.40 ``` 注意,和vmstat一样,第一次的输出结果是历史以来的统计值,一般可以忽略不计,如下:
- %util :磁盘使用率,Linux认为磁盘只能处理一个并发,但SSD或raid实际可以超过一个,所以100%也不一定代表满载。
- avgqu-sz:磁盘任务队列长度,大于磁盘的并发任务数则磁盘处于饱和状态。
- svctm:平均服务时间,不包括在磁盘队列中的等待时间。
- r_await,w_await:读写延迟时间(ms),磁盘队列等待时间+svctm,太大则磁盘饱和。
- r/s + w/s: 就是当前的IOPS。
- avgrq-sz:就是当前每秒平均吞吐量 单位是扇区(512b)。

注:上面的命令输出结果是centos中的,ubuntu中iostat命令输出结果稍有不同。

iotop

iotop以进程的角度查看io情况,如下:
```bash

-P表示只看进程整体的,不然iotop看的是每个线程的

-o表示只看有io操作的进程,不然iotop会列出所有进程

$ sudo iotop -P -o Total DISK READ: 3.84 K/s | Total DISK WRITE: 138.97 M/s Current DISK READ: 3.84 K/s | Current DISK WRITE: 80.63 M/s PID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 737183 be/4 root 3.84 K/s 0.00 B/s 0.00 % 88.89 % [kworker/u256:1+flush-8:0] 761496 be/4 work 0.00 B/s 138.96 M/s 0.00 % 79.09 % stress -d 1 876 be/4 work 0.00 B/s 7.68 K/s 0.00 % 0.00 % java -Xms256m -Xmx1g -Xss1m -XX:MaxMetaspaceSize=1g ... ``` 可以看到整个磁盘的当前读写速率,以及各个进程占用的比例。

hcache与vmtouch

当我们访问一个文件时,内核会帮我们将文件数据缓存到内存中,就是上面free命令中buff/cache这一项,而hcache与vmtouch则可以查看文件缓存的详细信息,如下:
```bash

查看前6个文件的pagecache大户

$ sudo ./hcache -top 6 +---------------------------------------------------------------------+----------------+------------+-----------+---------+ | Name | Size (bytes) | Pages | Cached | Percent | |---------------------------------------------------------------------+----------------+------------+-----------+---------| | /var/log/journal/ae4a8a4eec6f418a9596826e2f4f6891/system.journal | 33554432 | 8192 | 7415 | 090.515 | | /snap/core/11993/usr/lib/snapd/snapd | 24113872 | 5888 | 3777 | 064.147 | | /usr/bin/dockerd | 104770064 | 25579 | 2692 | 010.524 | | /usr/local/mysql/bin/mysqld | 227306584 | 55495 | 1774 | 003.197 | | /var/log/journal/ae4a8a4eec6f418a9596826e2f4f6891/user-1000.journal | 8388608 | 2048 | 1590 | 077.637 | | /usr/bin/python3.8 | 5482296 | 1339 | 1072 | 080.060 | +---------------------------------------------------------------------+----------------+------------+-----------+---------+

查看指定文件的pagecache详细信息

$ vmtouch -v /usr/local/mysql/bin/mysqld /usr/local/mysql/bin/mysqld [OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 55495/55495

       Files: 1
 Directories: 0

Resident Pages: 55495/55495 216M/216M 100% Elapsed: 0.000275 seconds

清除指定文件的pagecache

$ vmtouch -ve /var/log/journal/ae4a8a4eec6f418a9596826e2f4f6891/system.journal Evicting /var/log/journal/ae4a8a4eec6f418a9596826e2f4f6891/system.journal

       Files: 1
 Directories: 0

Evicted Pages: 8192 (32M) Elapsed: 0.008735 seconds

清除pagecache与slab,一般没必要这么做,除非很清楚自己在做什么

$ sync # 将修改过的pagecache(脏页),写回到磁盘 $ echo 1 > /proc/sys/vm/drop_caches # 清除pagecache $ echo 2 > /proc/sys/vm/drop_caches # 清除slab $ echo 3 > /proc/sys/vm/drop_caches # 清除pagecache与slab ``` hcache下载地址:https://github.com/silenceshell/hcache

网络观测

nicstat

nicstat可以查看整个网卡的使用情况,如下:
bash $ nicstat -z 1 Time Int rKB/s wKB/s rPk/s wPk/s rAvs wAvs %Util Sat 22:35:22 ens33 38.09 7.13 32.03 6.77 1217.8 1078.4 0.03 0.00 22:35:22 lo 0.07 0.07 0.36 0.36 207.6 207.6 0.00 0.00 Time Int rKB/s wKB/s rPk/s wPk/s rAvs wAvs %Util Sat 22:35:23 ens33 0.27 0.56 3.99 4.99 69.50 114.0 0.00 0.00 Time Int rKB/s wKB/s rPk/s wPk/s rAvs wAvs %Util Sat 22:35:24 ens33 0.21 0.34 3.00 3.00 72.67 116.7 0.00 0.00 Time Int rKB/s wKB/s rPk/s wPk/s rAvs wAvs %Util Sat 22:35:25 ens33 0.28 0.33 4.00 3.00 70.50 111.3 0.00 0.00 Time Int rKB/s wKB/s rPk/s wPk/s rAvs wAvs %Util Sat 22:35:26 ens33 0.34 0.34 5.00 3.00 69.20 116.7 0.00 0.00 Time Int rKB/s wKB/s rPk/s wPk/s rAvs wAvs %Util Sat 22:35:27 ens33 0.28 0.33 4.00 3.00 70.50 111.3 0.00 0.00 其中%Util就是网卡带宽的使用率了。

iftop

iftop可以用来查看整个网卡以及各个连接的当前网速,如下:
bash $ sudo iftop -B -nNP 244KB 488KB 732KB 977KB 1.19MB └──────────────────────────────┴──────────────────────────────┴───────────────────────────────┴──────────────────────────────┴─────────────────────────────── 10.134.60.10:10100 => 10.134.92.10:29318 85.8KB 103KB 94.3KB <= 2.95KB 3.54KB 3.25KB 10.134.60.10:10100 => 10.134.93.9:30981 170KB 103KB 94.3KB <= 5.41KB 3.49KB 3.21KB 10.134.60.10:35172 => 10.134.24.54:3961 13.3KB 9.88KB 5.25KB <= 58.6KB 60.6KB 32.4KB 10.134.60.10:43240 => 10.134.24.55:3960 9.83KB 5.52KB 3.09KB <= 101KB 53.6KB 31.1KB 10.134.60.10:60932 => 10.134.24.55:3961 4.45KB 5.07KB 6.04KB <= 35.0KB 39.8KB 47.4KB 10.134.60.10:58990 => 10.134.24.5:80 22.0KB 19.2KB 22.5KB ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── TX: cum: 10.9MB peak: 1.75MB rates: 611KB 438KB 557KB RX: 6.49MB 453KB 360KB 296KB 332KB TOTAL: 17.4MB 2.19MB 972KB 735KB 889KB 另外,在nicstat、iftop命令不可用的情况下,也可以使用ifconfig + awk来查看网速,单位B/s,如下:
bash $ while sleep 1;do ifconfig;done|awk -v RS= 'match($0,/^(\w+):.*RX.*bytes ([0-9]+).*TX.*bytes ([0-9]+)/,a){eth=a[1];if(s[eth][1])print a[1],a[2]-s[eth][2],a[3]-s[eth][3];for(k in a)s[eth][k]=a[k]}' eth0 294873 353037 lo 2229 2229 eth0 613730 666086 lo 17981 17981 eth0 317336 544921 lo 5544 5544 eth0 237694 516947 lo 2256 2256

全能观测工具sar

sar是一个几乎全能的观测工具,它可以观测CPU、内存、磁盘、网络等等,不像上面的命令,只是侧重某一方面,正因为它如此强大,掌握起来也要难得多,它的常见用法如下:
```bash

cpu使用率

sar -u ALL 1

运行队列与负载

sar -q 1

中断次数

sar -I SUM 1

进程创建次数与线程上下文切换次数

sar -w 1

内存使用、脏页与slab

sar -r ALL 1

缺页与内存页扫描

sar -B 1

内存swap使用

sar -S 1 1 sar -W 1

磁盘IOPS

sar -dp 1

文件描述符与打开终端数

sar -v 1 1

网卡层使用率

sar -n DEV 1

tcp层收包发包情况

sar -n TCP,ETCP 1

socket使用情况

sar -n SOCK 1 `` 这只是列出了sar的一部分用法,实际上sar可以观测到非常多的内容,具体可以man sar`查看。

USE法

从上面介绍的命令来看,能观测到的指标非常多,让人眼花缭乱,一时抓不住重点,好在性能优化大师Brendan Gregg为我们总结了USE法,告诉了我们应该重点关注硬件资源的哪些指标,如下:
1. 使用率(utilization):即资源使用的百分比,如CPU使用率,内存使用率。
2. 饱和度(saturation):即资源的饱和情况,如大多数资源都有使用排队机制,饱和度代表队列中有多少任务等待处理。
3. 错误(errors):即访问资源时发生的错误。

注:使用率与使用率是不同的,比如CPU使用率一般代表时间占用比例,如1s中有800ms在执行真正的代码,CPU使用率就是80%,而内存使用率50%,指的是容量使用了一半,所以使用率可细分为基于容量的使用率与基于时间的使用率。

可以用Java中的线程池来理解这3个指标,如下:
1. 线程池是一个软件资源。
2. 线程池的使用率:目前正在运行任务线程数占线程池总线程数的百分比。
3. 线程池的饱和度:目前正在线程池任务队列中排队的任务数量。
4. 线程池的错误:触发线程池拒绝策略的次数。

对于CPU、内存、磁盘、网络这4个常见资源,并结合上面介绍的命令,可得出如下的表格:
|资源|使用率(utilization)|饱和度(saturation)|错误(errors)| |-|-|-|-| |CPU|vmstat 1中"us" + "sy" + "st"

sar -u同理|vmstat 1r列大于虚拟cpu数量

sar -q同理|-| |内存|free -m的available

vmstat 1的"free"与"swap"

sar -r的"%memused"|vmstat 1的"si"与"so"

sar -B的"pgscank"与"pgscand"

dmesg \| grep killed|-| |磁盘|iostat -xz 1的"%util"

sar -d 1的"%util"|iostat -xz 1的"avgqu-sz" > 1或"await"居高不下

sar -d 1同理|-| |网络|iftop的rates

nicstat的"%Util"

sar -n DEV 1的"rxKB/s"与"txKB/s"|ifconfig的"overruns"与"dropped"

netstat -s\|grep "segments retransmited"

sar -n EDEV 1drop and fifo|ifconfig的 "errors"与"dropped"

sar -n EDEV 1的"rxerr/s"与"txerr/s"|

全能监控工具

还有很多类似sar的全能观测工具,大多都比较炫酷,在个人笔记本上使用较多,服务器上采用较少,如下:

dstat

dstat

bpytop

bpytop

glances

glances

nmon

nmon

往期内容

Linux命令拾遗-入门篇
原来awk真是神器啊
Linux文本命令技巧(上)
Linux文本命令技巧(下)
字符编码解惑