0 前言
在系统安全检查中,通常要收集进程、内存、IO等信息。Linux提供了功能众多的命令来获取这些信息。今天我们先研究vmstat命令。
1.vmstat命令的功能、用法、选项说明和注意事项
1.1 vmstat命令的功能
vmstat是 Virtual Meomory Statistics(虚拟内存统计)的缩写,可以对系统的进程情况、内存使用情况、交换页和 I/O 块使用情况、中断以及 CPU 使用情况进行统计并报告相应的信息。
我们可以使用命令vmstat --help 来查看 vmstat命令的帮助信息。
[purpleendurer @ bah /w] vmstat --helpUsage:vmstat [options] [delay [count]]Options:-a, --active active/inactive memory-f, --forks number of forks since boot-m, --slabs slabinfo-n, --one-header do not redisplay header-s, --stats event counter statistics-d, --disk disk statistics-D, --disk-sum summarize disk statistics-p, --partition <dev> partition specific statistics-S, --unit <char> define display unit-w, --wide wide output-t, --timestamp show timestamp-h, --help display this help and exit-V, --version output version information and exitFor more details see vmstat(8).
[purpleendurer @ bah /w]
1.2 vmstat命令的用法
vmstat [选项] [刷新延时 [刷新次数]]
1.3 vmstat命令的选项说明
选项 | 说明 |
---|---|
-a --active | 活动/非活动内存 |
-f --forks | 显示自启动以来的 fork 数量 fork是任何在保持活动状态的同时生成另一个进程的进程。 这里的 fork 数量包括 fork、vfork 以及 clone 等系统调用! |
-m --slabs | slabinfo |
-n --one-header | 不重新显示标头 |
-s --stats | 事件计数器统计 |
-d ---disk | 磁盘统计信息 |
-D --disk-sum | 汇总磁盘统计信息 |
-p --partition <dev> | 分区特定统计信息 |
-S --unit <char> | 定义输出的结果中的显示单位, 内存数据的单位默认是 KB,可以通过 -S 选项调整显示的单位,有下面几种单位可供选择:
注意:-S 选项对 si、 so 字段无效 |
-w --wide | 宽输出 vmstat 结果中的某些字段的数字有时会比较长,而且跟字段名的位置有偏差, 不太适合人类的观看习惯, |
-t --timestamp | 显示时间戳 |
-h --help | 显示此帮助并退出 |
-V --version | 输出版本信息并退出 |
1.4 注意事项
- 运行 vmstat 不须要特别的使用权限
- 这些系统信息是用来向用户提供分析系统瓶颈问题信息的。
- linux在计算进程情况时不将正在运行的 vmstat 自己计算进去。
- 当前所在的 linux 块的大小都是 1K,而 CD-ROM 文件系统的块大小为 2K。
- 对于 slabinfo,需要使用 -m 命令行选项。请注意,您的 Linux 发行版内核需要支持 slabinfo 才能使用此选项。如果支持,则您需要使用 sudo 权限运行该命令。
2 vmstat命令实例
2.1 vmstat : 显示当前进程、内存、虚拟内存、读写、系统、cpu 信息
[purpleendurer @ bash ~] vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st3 0 0 2014768 39912 1532180 0 0 347 1611 443 752 2 1 96 1 0
[purpleendurer @ bash ~]
命令执行后返回的信息包括 procs(进程)、memory(内存)、swap(交换分区 或 虚拟内存)、io(磁盘读/写)、system(系统)、cpu 共6个部分内容。
每个部分的含义如下:
字段 | 含义 |
---|---|
procs |
此数由 linux 计算得出,但 linux 并不耗尽交换空间 这里的不可中断是指 一个进程在执行某些系统调用时进入的状态,在这种状态下,进程被阻塞,并且不能被中断,直到完成系统调用! |
memory |
|
swap |
|
io |
|
system |
|
cpu |
|
2.2 vmstat -a : 显示活动/非活动内存
[purpleendurer @ bash ~] vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st3 0 0 2014768 39912 1532180 0 0 347 1611 443 752 2 1 96 1 0
[purpleendurer @ bash ~] vmstat -a
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free inact active si so bi bo in cs us sy id wa st4 0 0 2014440 1557064 89764 0 0 309 1436 431 742 2 1 96 1 0
[purpleendurer @ bash ~]
我们对比执行vmstat 和 vmstat -a 命令返回的信息,可以看到, vmstat -a 命令返回的memory部分中,原来属于buff和cache的位置 显示了 inact 和 active 两个信息。
2.3 vmstat -d:显示磁盘统计信息
[purpleendurer @ bash ~] vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------total merged sectors ms total merged sectors ms cur sec
vda 5730 2258 678968 7095 10127 44510 3156280 206114 0 10
zram0 0 0 0 0 0 0 0 0 0 0
[purpleendurer @ bash ~]
命令返回信息包括 disk(磁盘名称)、reads(读)、writes(写)、IO(输入输出)四部分内容,具体说明如下:
字段 | 含义 |
disk |
|
reads |
|
writes |
|
IO |
|
2.4 vmstat -D:汇总磁盘统计信息
[purpleendurer @ bash ~] vmstat -D2 disks 5 partitions 5720 total reads2258 merged reads678240 read sectors7088 milli reading9303 writes43535 merged writes3141200 written sectors205722 milli writing0 inprogress IO10 milli spent IO
[purpleendurer @ bash ~]
信息 | 说明 |
2 disks | 磁盘数 |
5 partitions | 分区数 |
5720 total reads | 读取数据块数 |
2258 merged reads | 分组读取(产生一个 IO)数 |
678240 read sectors | 读取的扇区个数 |
7088 milli reading | 读取时间,毫秒 |
9303 writes | 写入的数据块数 |
43535 merged writes | 分组写入(产生一个 IO)数 |
3141200 written sectors | 已写的扇区个数 |
205722 milli writing | 写入时间,毫秒 |
0 inprogress IO | 进行中的IO个数 |
10 milli spent IO | IO花费的时间,毫秒 |
2.5 vmstat -f:显示自启动以来的 fork 数量
[purpleendurer @ bash ~] vmstat -f1391 forks
[purpleendurer @ bash ~]
可见,自启动以来的 fork 数量为1391。
2.6 vmstat -p /dev/vda1: 查看分区/dev/vda1的信息
[purpleendurer @ bash ~] lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 40G 0 disk
├─vda4 253:4 0 9.5G 0 part
├─vda2 253:2 0 127M 0 part
├─vda5 253:5 0 30G 0 part /dev/termination-log
├─vda3 253:3 0 384M 0 part
└─vda1 253:1 0 1M 0 part
[purpleendurer @ bash ~] vmstat -p /dev/vda1
vda1 reads read sectors writes requested writes14 112 0 0
[purpleendurer @ bash ~]
我们先使用lsblk命令查看当 前系统中的分区信息,然后指定查看分区/dev/vda1的信息。
命令返回的分区/dev/vda1的信息含义如下:
信息 | 含义 |
vda1 | 分区名称 |
reads 14 | 读取的数据块数 |
read sectors 112 | 读取的扇区数 |
writes 0 | 写入的数据块数 |
requested writes 0 | 请求写入的数据块数 |
2.7 vmstat -s:显示事件计数器统计信息
[purpleendurer @ bash ~] vmstat -s3855940 K total memory277356 K used memory88576 K active memory1567116 K inactive memory2004888 K free memory40140 K buffer memory1533556 K swap cache0 K total swap0 K used swap0 K free swap2455 non-nice user cpu ticks0 nice user cpu ticks1125 system cpu ticks122725 idle cpu ticks949 IO-wait cpu ticks142 IRQ cpu ticks69 softirq cpu ticks0 stolen cpu ticks340856 pages paged in1580340 pages paged out0 pages swapped in0 pages swapped out534656 interrupts930534 CPU context switches1721145727 boot time1272 forks
[purpleendurer @ bash ~]
返回信息的含义如下:
信息 | 含义 |
3855940 K total memory | 内存总数 |
277356 K used memory | 已使用内存数 |
88576 K active memory | 活跃内存数 |
1567116 K inactive memory | 非活跃内存数 |
2004888 K free memory | 未分配使用内存数 |
40140 K buffer memory | 缓存I/O操作的内存容数 |
1533556 K swap cache | 缓存文件系统数据块的内存数 |
0 K total swap | 虚拟内存总数 |
0 K used swap | 已使用虚拟内存数 |
0 K free swap | 未分配使用虚拟内存数 |
2455 non-nice user cpu ticks | 非友好用户占用的CPU时间 |
0 nice user cpu ticks | 友好用户占用的CPU时间 |
1125 system cpu ticks | 系统占用的CPU时间 |
122725 idle cpu ticks | 空闲的CPU时间 |
949 IO-wait cpu ticks | 等待IO操作的占用的CPU时间 |
142 IRQ cpu ticks | (来自设备的)硬中断请求占用的CPU时间 |
69 softirq cpu ticks | 软中断请求占用的CPU时间 |
0 stolen cpu ticks | 虚拟机盗用的 CPU 百分比 |
340856 pages paged in | 块设备数据的读入内存的页数 |
1580340 pages paged out | 写入块设备的内存页数 |
0 pages swapped in | 从块设备swap区中读入的页数 |
0 pages swapped out | 从块设备swap区中读出的页数 |
534656 interrupts | 中断数 |
930534 CPU context switches | CPU上下文切换次数 |
1721145727 boot time | 系统运行时间 |
1272 forks | fork数 |
2.8 vmstat -t -w:宽行显示时间戳
[purpleendurer @ bash ~] vmstat -t
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- -----timestamp-----r b swpd free buff cache si so bi bo in cs us sy id wa st CST2 0 0 2012752 40516 1532440 0 0 197 919 386 696 2 1 97 0 0 2024-07-16 23:38:12
[purpleendurer @ bash ~] vmstat -t -w
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu-------- -----timestamp-----r b swpd free buff cache si so bi bo in cs us sy id wa st CST3 0 0 2013128 40676 1532556 0 0 183 855 381 691 2 1 97 0 0 2024-07-16 23:39:17
[purpleendurer @ bash ~]
返回的命令执行结果中增加了timestamp的内容。
我们也可以从对比中看到-w选项的作用。
2.9 vmstat -S M -t 1 3 :以M为单位,延迟1秒输出3次,带时间戳
[purpleendurer @ bash ~] vmstat -S M -t 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- -----timestamp-----r b swpd free buff cache si so bi bo in cs us sy id wa st CST2 0 0 1955 39 1497 0 0 170 791 386 703 1 1 97 0 0 2024-07-17 00:18:500 0 0 1955 39 1497 0 0 0 0 632 1200 0 1 99 0 0 2024-07-17 00:18:510 0 0 1955 39 1497 0 0 0 16 839 1801 2 0 98 1 0 2024-07-17 00:18:52
[purpleendurer @ bash ~]
从时间戳可以看出来,命令每隔1秒钟显示一次信息。