# vmstat 命令

`vmstat` 命令的含义为显示虚拟内存状态（“Viryual Memor Statics”），但是它可以报告关于进程、内存、I/O 等系统整体运行状态。

## 命令用法

```
$ vmstat [options] [delay [count]]
```

其中：

* `delay`：时间间隔，状态信息刷新的时间间隔；
* `count`：次数，显示报告的次数。

## 常用可选参数

| 参数                | 说明                 |
| ----------------- | ------------------ |
| -a, --active      | 显示活动/非活动的内存信息      |
| -f, --forks       | 显示启动后创建的进程总数       |
| -n, --one-headers | 仅显示一次头信息           |
| -m, --slabs       | 显示 slab 信息         |
| -d, --disk        | 显示磁盘的统计信息          |
| -D， --disk-sum    | 显示磁盘的总和信息          |
| -s, --stats       | 以表格的形式显示事件计数器的统计信息 |
| -S, --unit CHAR   | 定义显示信息的单位 `CHAR`   |
| -t, --timestamp   | 显示时间戳              |

## 结果参数解析

```bash
gackle@machine:~$ vmstat
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    320  42188 167332 1534368    0    0     4     7    1    0  0  0 99  0  0
 0  0    320  42188 167332 1534392    0    0     0     0 1002   39  0  0 100  0  0
```

其中

* procs(进程)
  * r 运行队列中进程数量；
  * b 等待 IO 的进程数量；
* memory(内存)
  * swpd 使用虚拟内存大小。如果 swpd 的值不为 0，但是 si，so 的值长期为 0，这种情况不会影响系统性能
  * free 空闲物理内存大小
  * buff 缓冲区的内存大小
  * cache 用作缓存的内存大小。如果 cache 的值大的时候，说明 cache 处的文件数多，如果频繁访问到的文件都能被cache 处，那么磁盘的读IO 的 bi 值会非常小。
* swap(交换区内存)
  * si 每秒从交换区写到内存的大小，由磁盘调入内存。
  * so 每秒写入交换区的内存大小，由内存调入磁盘。
* io(io 系统) —— 下面这 2 个值越大（如超出1024k)，CPU 在 IO 等待的值也会越大
  * bi 每秒读取的块数
  * bo 每秒写入的块数
* system(操作系统) —— 下面这两个值越大，由内核消耗的CPU时间会越大
  * in 每秒中断数，包括时钟中断
  * cs 每秒上下文切换数
* cpu
  * us 用户进程执行时间百分比。us 的值比较高时，说明用户进程消耗的CPU时间多，但是如果长期超 50% 的使用，要考虑优化程序算法或者进行加速。
  * sy 内核系统进程执行时间百分比。sy 的值高时，说明系统内核消耗的CPU资源多，要排查问题
  * wa 等待 IO 时间百分比
  * id 空闲时间百分比
