天天看点

vmstat:一个标准的报告虚拟内存统计工具

在智能手机世界,我们每一个人都知道 ram。因此,我不想深入介绍,这样我就简要概括下。ram 代表“随机访问内存random access memory”,是一种计算机数据存储,它会存储经常使用的程序来提升系统性能。

<a target="_blank"></a>

虚拟内存是一种内存管理方式,计算机通过临时将最近未使用的程序数据从 ram 转移到硬盘,以平衡或管理内存的短缺。

vmstat 是一个标准的工具,它会报告 linux 系统的虚拟内存统计。vmstat 会报告有关进程、内存、分页、块 io、陷阱(中断)和 cpu 活动的信息。它可以帮助 linux 管理员在解决问题时识别系统瓶颈。

linux 中没有独立的 <code>vmstat</code> 包。它与 <code>sysstat</code> 绑定在一起,并在大多数发行版的默认仓库上都有。如果还没有安装,只要基于你的发行版输入下面的命令。

<code>[在 centos/rhel 中安装 vmstat]</code>

<code>$ sudo yum install sysstat</code>

<code></code>

<code>[在 fedora 中安装 vmstat]</code>

<code>$ sudo dnf install sysstat</code>

<code>[在 debian/ubuntu 中安装 vmstat]</code>

<code>$ sudo apt-get install sysstat</code>

<code>[在 arch linux 中安装 vmstat]</code>

<code>$ sudo pacman -s sysstat</code>

<code>[在 mageia 中安装 vmstat]</code>

<code>$ sudo urpmi sysstat</code>

<code>[在 opensuse 中安装 vmstat]</code>

<code>$ sudo zypper install sysstat</code>

假设你已经成功安装 vmstat,在终端中不带参数运行 <code>vmstat</code>,它会向你展示 vmstat 的默认结果。

<code># vmstat</code>

<code>procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----</code>

<code>r b swpd free buff cache si so bi bo in cs us sy id wa</code>

<code>2 0 79496 1614120 139240 787928 0 0 23 10 0 0 11 1 88 0</code>

当你看到上面的输出,你可能已经大致了解了它是什么以及它的目的。不要担心,我们将深入解释每个参数,以便你可以了解 vmstat 的用途和目的。

<code>r</code>:等待运行的进程数。

<code>b</code>:休眠状态下的进程数。

<code>memory</code>: memory 下有报告内存统计的 <code>swpd</code>、<code>free</code>、<code>buff</code> 和 <code>cache</code> 列。你可以用 <code>free -m</code>命令看到同样的信息。在上面的内存统计中,统计数据以千字节表示,这有点难以理解,最好添加 <code>m</code> 参数来看到以兆字节为单位的统计数据。

<code>swpd</code>:使用的虚拟内存量。

<code>free</code>:空闲内存量。

<code>buff</code>:用作缓冲区的内存量。

<code>cache</code>:用作高速缓存的内存量。

<code>inact</code>:非活动内存的数量。

<code>active</code>:活动内存量。

<code>swap</code>:swap 有 <code>si</code> 和 <code>so</code> 列,用于报告交换内存统计信息。你可以用 <code>free -m</code> 命令看到相同的信息。

<code>si</code>:从磁盘交换的内存量(换入,从 swap 移到实际内存的内存)。

<code>so</code>:交换到磁盘的内存量(换出,从实际内存移动到 swap 的内存)。

<code>bi</code>:从块设备接收的块数。

<code>bo</code>:发送到块设备的块数。

<code>system</code>:system 有 <code>in</code> 和 <code>cs</code> 列,它报告每秒的系统操作。

<code>in</code>:每秒的系统中断数,包括时钟中断。

<code>cs</code>:系统为了处理所以任务而上下文切换的数量。

<code>cpu</code>:cpu 有 <code>us</code>、<code>sy</code>、<code>id</code> 和 <code>wa</code> 列,报告(所用的) cpu 资源占总 cpu 时间的百分比。如果你发现异常,最好使用 <code>top</code> 和 <code>free</code> 命令。

<code>us</code>:处理器在非内核程序消耗的时间。

<code>sy</code>:处理器在内核相关任务上消耗的时间。

<code>id</code>:处理器的空闲时间。

<code>wa</code>:处理器在等待io操作完成以继续处理任务上的时间。

默认情况下,vmstat 以千字节为单位显示内存统计,这是非常难以理解的,最好添加 <code>-s m</code> 参数以获取以兆字节为单位的统计。

<code># vmstat -s m</code>

<code>1 0 103 371 406 2116 0 0 40 15 0 0 11 1 87 0</code>

默认情况下,vmstat 的单次统计信息不足以进一步进行故障排除,因此,添加更新延迟(延迟是更新之间的延迟,以秒为单位)以定期捕获活动。如果你想以 2 秒延迟运行 vmstat ,只需使用下面的命令(如果你想要更长的延迟,你可以根据你的愿望改变)。

以下命令将每 2 秒运行一次,直到退出。

<code># vmstat 2</code>

<code>1 0 105500 325776 416016 2166912 0 0 40 15 0 0 11 1 87 0</code>

<code>0 0 105500 325644 416016 2166920 0 0 0 13 1083 1174 11 1 87 0</code>

<code>0 0 105500 308648 416024 2166928 0 0 1 16 1559 1453 16 2 82 0</code>

<code>0 0 105500 285948 416032 2166932 0 0 0 12 934 1003 9 1 90 0</code>

<code>0 0 105500 326620 416040 2166940 0 0 1 27 922 1068 9 1 90 0</code>

<code>0 0 105500 366704 416048 2166944 0 0 0 17 835 955 9 1 90 0</code>

<code>0 0 105500 366456 416056 2166948 0 0 1 22 859 918 9 1 90 0</code>

<code>0 0 105500 366456 416056 2166948 0 0 0 15 1539 1504 17 2 81 0</code>

<code>0 0 105500 365224 416060 2166996 0 0 1 19 984 1097 11 1 88 0</code>

或者,你可以带延迟和特定计数运行 vmstat,一旦达到给定的计数,然后自动退出。

以下命令将每 2 秒运行一次,10 次后自动退出。

<code># vmstat 2 10</code>

<code>1 0 79496 1581916 157380 810412 0 0 23 10 0 1 11 1 88 0</code>

<code>2 0 79496 1559464 157380 810416 0 0 1 1 1821 1749 21 2 77 0</code>

<code>0 0 79496 1583768 157384 810416 0 0 1 46 681 799 9 1 90 0</code>

<code>2 0 79496 1556364 157384 810428 0 0 1 1 1392 1545 15 2 83 0</code>

<code>0 0 79496 1583272 157384 810428 0 0 1 0 1307 1448 14 2 84 0</code>

<code>2 0 79496 1582032 157384 810428 0 0 1 41 424 605 4 1 96 0</code>

<code>1 0 79496 1575848 157384 810428 0 0 1 0 1912 2407 26 2 71 0</code>

<code>0 0 79496 1582884 157384 810436 0 0 1 69 678 825 9 1 90 0</code>

<code>2 0 79496 1569368 157392 810432 0 0 11 26 920 969 9 1 90 0</code>

<code>1 0 79496 1583612 157400 810444 0 0 7 39 2001 2530 20 2 77 0</code>

默认情况下,vmstat 会显示除活动和非活动内存之外的内存统计信息。如果要查看活动和非活动内存统计信息,请在 vmstat 后添加 <code>-a</code> 参数。

<code># vmstat -a</code>

<code>r b swpd free inact active si so bi bo in cs us sy id wa</code>

<code>1 0 105500 2387592 415148 584112 0 0 40 15 0 1 11 1 87 0</code>

在 vmstat 后面添加 <code>-d</code> 参数会以每个磁盘一行的方式显示统计(包含读、写和 io)。

<code># vmstat -d</code>

<code>disk- ------------reads------------ ------------writes----------- -----io------</code>

<code>total merged sectors ms total merged sectors ms cur sec</code>

<code>ram0 0 0 0 0 0 0 0 0 0 0</code>

<code>ram1 0 0 0 0 0 0 0 0 0 0</code>

<code>ram2 0 0 0 0 0 0 0 0 0 0</code>

<code>ram3 0 0 0 0 0 0 0 0 0 0</code>

<code>ram4 0 0 0 0 0 0 0 0 0 0</code>

<code>ram5 0 0 0 0 0 0 0 0 0 0</code>

<code>ram6 0 0 0 0 0 0 0 0 0 0</code>

<code>ram7 0 0 0 0 0 0 0 0 0 0</code>

<code>ram8 0 0 0 0 0 0 0 0 0 0</code>

<code>ram9 0 0 0 0 0 0 0 0 0 0</code>

<code>ram10 0 0 0 0 0 0 0 0 0 0</code>

<code>ram11 0 0 0 0 0 0 0 0 0 0</code>

<code>ram12 0 0 0 0 0 0 0 0 0 0</code>

<code>ram13 0 0 0 0 0 0 0 0 0 0</code>

<code>ram14 0 0 0 0 0 0 0 0 0 0</code>

<code>ram15 0 0 0 0 0 0 0 0 0 0</code>

<code>loop0 0 0 0 0 0 0 0 0 0 0</code>

<code>loop1 0 0 0 0 0 0 0 0 0 0</code>

<code>loop2 0 0 0 0 0 0 0 0 0 0</code>

<code>loop3 0 0 0 0 0 0 0 0 0 0</code>

<code>loop4 0 0 0 0 0 0 0 0 0 0</code>

<code>loop5 0 0 0 0 0 0 0 0 0 0</code>

<code>loop6 0 0 0 0 0 0 0 0 0 0</code>

<code>loop7 0 0 0 0 0 0 0 0 0 0</code>

<code>fd0 0 0 0 0 0 0 0 0 0 0</code>

<code>sda 16604050 904497 2594882190 57455732 30037054 28093770 2160032056 118189160 0 40915</code>

<code>sdb 257357577 479985 3124712204 577235320 8502519 1283237 36645890 11250948 0 182336</code>

在 vmstat 后面添加 <code>-d</code> 会显示全局统计(包括全部的磁盘、分区、全部读、合并的读、读取的扇区、写、合并的写、写入的扇区和 io)。

<code>27 disks</code>

<code>3 partitions</code>

<code>275754028 total reads</code>

<code>1388030 merged reads</code>

<code>5751195976 read sectors</code>

<code>638710116 milli reading</code>

<code>38795040 writes</code>

<code>29520659 merged writes</code>

<code>2209820333 written sectors</code>

<code>130210652 milli writing</code>

<code>0 inprogress io</code>

<code>224704 milli spent io</code>

vmstat 添加 <code>-p</code> 参数后面跟上设备名会显示指定分区统计(包括读、读取的扇区、写以及请求的写)。

<code># vmstat -p /dev/sdb1</code>

<code>sdb1 reads read sectors writes requested writes</code>

<code>3115 27890 839453 206728016</code>

当你想在特定时间区间内找到内存尖峰时,用 vmstat 命令添加 <code>-t</code> 参数,后跟延迟和计数。

注意:此组合不适用于基于 debian 的系统。

<code># vmstat -t 1 5</code>

<code>procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp---</code>

<code>r b swpd free buff cache si so bi bo in cs us sy id wa st</code>

<code>0 0 0 6981416 181324 24588604 0 0 0 1 0 0 0 0 100 0 0 2017-01-11 15:42:15 mst</code>

<code>2 0 0 6981276 181324 24588604 0 0 0 0 91 40 0 0 100 0 0 2017-01-11 15:42:16 mst</code>

<code>0 0 0 6982016 181324 24588604 0 0 0 0 75 116 0 0 100 0 0 2017-01-11 15:42:17 mst</code>

<code>0 0 0 6982016 181324 24588604 0 0 0 0 43 39 0 0 100 0 0 2017-01-11 15:42:18 mst</code>

<code>0 0 0 6982280 181324 24588604 0 0 0 0 113 185 0 0 100 0 0 2017-01-11 15:42:19 mst</code>

vmstat 后面跟上 <code>-s</code> 参数会显示不同统计的总结。

<code># vmstat -s</code>

<code>32849392 total memory</code>

<code>25864128 used memory</code>

<code>16468180 active memory</code>

<code>8320888 inactive memory</code>

<code>6985264 free memory</code>

<code>181324 buffer memory</code>

<code>24588612 swap cache</code>

<code>20970492 total swap</code>

<code>0 used swap</code>

<code>20970492 free swap</code>

<code>891075 non-nice user cpu ticks</code>

<code>6532 nice user cpu ticks</code>

<code>1507099 system cpu ticks</code>

<code>18925265601 idle cpu ticks</code>

<code>113043 io-wait cpu ticks</code>

<code>108 irq cpu ticks</code>

<code>4185 softirq cpu ticks</code>

<code>0 stolen cpu ticks</code>

<code>4071862 pages paged in</code>

<code>216759718 pages paged out</code>

<code>0 pages swapped in</code>

<code>0 pages swapped out</code>

<code>369611221 interrupts</code>

<code>477861261 cpu context switches</code>

<code>1478258826 boot time</code>

<code>2196121 forks</code>

vmstat 后面跟上 <code>-m</code> 参数会显示 slab 信息。

<code># vmstat -m</code>

<code>cache num total size pages</code>

<code>nf_conntrack_expect 0 0 240 16</code>

<code>nf_conntrack_ffffffff81b2a920 18 60 312 12</code>

<code>fib6_nodes 24 59 64 59</code>

<code>ip6_dst_cache 16 30 384 10</code>

<code>ndisc_cache 7 30 256 15</code>

<code>ip6_mrt_cache 0 0 128 30</code>

<code>rawv6 35 35 1088 7</code>

<code>udplitev6 0 0 1024 4</code>

<code>udpv6 4 12 1024 4</code>

<code>tw_sock_tcpv6 0 0 320 12</code>

<code>request_sock_tcpv6 0 0 192 20</code>

<code>tcpv6 4 6 1920 2</code>

<code>fat_inode_cache 5 6 672 6</code>

<code>fat_cache 0 0 32 112</code>

<code>ioat2 4096 4140 128 30</code>

<code>ext4_inode_cache 34322 34364 1000 4</code>

<code>ext4_xattr 0 0 88 44</code>

<code>.</code>

如果你想了解关于 vmstat 的更多选项,请阅读手册。

<code># vmstat --help</code>

<code>或者</code>

<code># man vmstat</code>

原文发布时间为:2017-01-29

本文来自云栖社区合作伙伴“linux中国”

继续阅读