什么在使用我的交换空间(Ubuntu)?

什么在使用我的交换空间(Ubuntu)?

我有一台 Ubuntu 8.04 服务器,它运行着一个数据库和一堆 Java 应用服务器。它的内存配置和使用情况如下:

             total       used       free     shared    buffers     cached
Mem:      16456176   15930028     526148          0      81372    9674196
-/+ buffers/cache:    6174460   10281716
Swap:      1951888     366100    1585788

我注意到,掉期交易每天下午都会上涨,晚上某个时间才会释放。需求每天都不一样,开始的时间也不同。所以,除了模糊的“下午-晚上”界限外,它相当随机。

这台机器的负载在一天中会发生变化。午夜至早上 6-7 点之间负载非常低,到晚上 6-8 点负载会高得多(但很稳定),然后逐渐下降。

现在我有以下问题:

  1. 我如何才能看到哪些进程正在使用交换?
  2. 为什么它宁愿换出内存而不是从缓存中取出一些内存?

答案1

您描述的交换使用模式听起来并不奇怪。它们与某些永久运行的进程具有很少使用的页面的情况一致。在白天,由于活动量大,很少使用的页面几乎总是在交换中。在晚上,RAM 中有更多的空间可以容纳它们。

top您可以在或中大致了解每个进程正在使用的各种内存量htop。默认情况下,两者都不显示交换使用情况,但都可以配置为(top:按下f并打开SWAP列;htop:按下F2,添加列)。您可以使用进程 ID 所在的位置NSWAP获取有关特定进程的更多信息。请注意,“程序正在使用多少交换”并没有完全明确定义,因为一些页面由多个进程共享。cat /proc/12345/vmstat12345

RAM 主要有两种竞争者:进程内存(可以交换出去)和磁盘缓存(可以从文件中重新读取)。没有理由总是优先考虑进程内存而不是磁盘缓存:最好是交换出很少使用的进程内存部分,而不是一遍又一遍地将文件读入内存。您给出的数字是,大约一半(比如说 30%–70%)的内存专用于磁盘缓存,这对于具有合理数量的 RAM 来完成任务的系统来说是典型的。

答案2

在 StackOverflow 上,对您的第一个问题(“哪个进程实际上正在使用交换?”)已经有了一个很好的答案。

https://stackoverflow.com/a/7180078/1442301

简而言之,像top或 这样的工具htop根本不提供有关交换使用情况的准确信息。您应该深入研究/proc文件夹(在伪文件中/proc/$PID/smaps)以获取更准确的信息。

邮政上面提到的包含一个简短的 shell 脚本,以便以一种好的方式回显这些信息。

答案3

使用 时htop v1.01,我按“S”来添加NSWAP列,而不是“F2”(按照 Gilles 的建议),然后按Columns> Available Columns> 和F5添加它。

在此处输入图片描述

答案4

如果不轮询和解析 、和等工具的输出vmstat,最好的查找位置可能是 root 用户或系统上其他用户的 crontab。如果系统的总体负载在某个时间可靠地达到峰值,则很可能 cron 中有一个进程需要资源。否则,您可以随时使用该实用程序创建一个 ghetto 一次性日志记录实用程序,它只记录进入 STDOUT 的所有内容。freetopscript

因此,如果我需要编写一次性脚本来捕获输出以供以后检查,则在一个终端中我会输入:

script /tmp/free.txt

进而

while (true); do date; free; sleep 30; done

在另一个终端

script /tmp/top.txt

进而

while (true); do date; top -n 1; sleep 30; done

然后第二天早上,终止两个调用并匹配和script的输出topfree

再次,这是一个贫民窟的方法,但听起来你只需要一次性的

你可能还想阅读Ubuntu 交换指南

相关内容