使用 vmstat 监控虚拟内存

作者:Brian K. Tanaka

Linux 新手常常觉得虚拟内存很神秘,但只要掌握基本概念,就很容易理解。有了这些知识,您可以使用 vmstat 监控系统的内存利用率,并检测可能对系统性能产生不利影响的问题。

虚拟内存的工作原理

物理内存——实际安装的 RAM——是任何系统上的有限资源。 Linux 内存处理程序通过在可能的情况下释放部分物理内存来管理这种有限资源的分配。

当然,所有进程都使用内存,但每个进程并不总是需要其所有已分配的内存。内核利用这一事实,通过将进程的部分或全部内存写入磁盘,直到再次需要时,来释放物理内存。

内核使用分页和交换来执行此内存管理。分页是指将进程内存的部分(称为页)写入磁盘。严格来说,交换是指将整个进程(而不仅仅是部分)写入磁盘。在 Linux 中,真正的交换极其罕见,但术语“分页”和“交换”通常可以互换使用。

当页面写入磁盘时,该事件称为换出(page-out),当页面返回到物理内存时,该事件称为换入(page-in)。当内核需要一个页面,但发现它在物理内存中不存在(因为它已被换出),并从磁盘重新读取它时,就会发生页错误(page fault)。

换入是常见且正常的,无需担心。例如,当应用程序首次启动时,其可执行映像和数据会被换入。这是正常行为。

然而,换出可能是出现问题的迹象。当内核检测到内存不足时,它会尝试通过换出来释放内存。尽管这种情况可能会不时短暂发生,但如果换出频繁且持续,内核可能会达到一个临界点,即它实际上花费更多时间来管理分页活动,而不是运行应用程序,并且系统性能会受到影响。这种糟糕的状态被称为抖动(thrashing)。

使用交换空间本身并不是坏事。相反,有问题的是密集的页面活动。例如,如果内存密集型应用程序处于空闲状态,则当另一个大型作业处于活动状态时,可以将其部分内容搁置。属于空闲应用程序的内存页面最好被搁置,以便内核可以将物理内存用于磁盘缓冲。

使用 vmstat

vmstat,顾名思义,报告虚拟内存统计信息。它显示有多少虚拟内存,有多少是空闲的以及分页活动。最重要的是,您可以观察换入和换出的发生。这非常有用。

要监控系统上的虚拟内存活动,最好使用带有延迟的 vmstat。延迟是更新之间的时间间隔(秒)。如果您不提供延迟,vmstat 会报告自上次启动以来的平均值并退出。建议的延迟间隔为五秒。

要以五秒延迟运行 vmstat,请输入

vmstat 5

您还可以指定计数,指示您希望在 vmstat 退出之前看到的更新次数。如果您不指定计数,则计数默认为无限大,但您可以使用 Ctrl-C 停止输出。

要以五秒间隔运行 vmstat 十次更新,请输入

vmstat 5 10

这是一个没有分页活动的系统示例

  procs                     memory    swap        io     system cpu
r  b  w   swpd   free  buff  cache  si so   bi  bo   in    cs us sy  id
0  0  0  29232 116972  4524 244900   0  0    0   0    0     0 0   0   0
0  0  0  29232 116972  4524 244900   0  0    0   0 2560     6 0   1  99
0  0  0  29232 116972  4524 244900   0  0    0   0 2574    10 0   2  98

所有字段都在 vmstat 手册页中进行了解释,但本文最重要的列是 free、si 和 so。 free 列显示可用内存量,si 显示换入,so 显示换出。在此示例中,so 列始终为零,表示没有换出。

由于历史原因,使用缩写 so 和 si 而不是更准确的 po 和 pi。

这是一个具有分页活动的系统示例

  procs                      memory    swap          io     system cpu
r  b  w   swpd   free  buff cache  si  so   bi   bo   in    cs us  sy  id
. . .
1  0  0  13344   1444  1308 19692   0 168  129   42 1505   713 20  11  69
1  0  0  13856   1640  1308 18524  64 516  379  129 4341   646 24  34  42
3  0  0  13856   1084  1308 18316  56  64   14    0  320  1022 84   9   8

请注意非零的 so 值,表示物理内存不足,内核正在换出。您可以使用 top 和 ps 来识别占用最多内存的进程。

您还可以使用 top 来显示内存和交换统计信息。以下是典型 top 报告的最上面部分的示例

14:23:19 up 348 days,  3:02,  1 user,  load average: 0.00, 0.00, 0.00
55 processes: 54 sleeping, 1 running, 0 zombie, 0 stopped
CPU states:   0.0% user,   2.4% system,   0.0% nice,  97.6% idle
Mem:    481076K total,   367508K used,   113568K free,     4712K buffers
Swap:  1004052K total,    29852K used,   974200K free,   244396K cached

有关 top 的更多信息,请参阅 top 手册页。

结论

您的系统使用一些交换空间不一定是坏事。但是,如果您发现系统经常物理内存不足,并且分页导致性能下降,请添加更多内存。如果您无法添加更多内存,请在一天中的不同时间运行内存密集型作业,避免在内存需求较高时运行非必要作业,或者尽可能将作业分配到多个系统。

本文资源: /article/8535

Brian K. Tanaka 自 1994 年以来一直担任 UNIX 系统管理员,曾就职于 SGI、Intuit 和 RealNetworks 等公司。他是 Martingale-Oak, LLC 的联合创始人。您可以通过 btanaka@martingale-oak.com 与他联系。

加载 Disqus 评论