我有一台 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
您描述的交换使用模式听起来并不奇怪。它们与某些永久运行的进程具有很少使用的页面的情况一致。在白天,由于活动量大,很少使用的页面几乎总是在交换中。在晚上,RAM 中有更多的空间可以容纳它们。
top
您可以在或中大致了解每个进程正在使用的各种内存量htop
。默认情况下,两者都不显示交换使用情况,但都可以配置为(top:按下f
并打开SWAP
列;htop:按下F2,添加列)。您可以使用进程 ID 所在的位置NSWAP
获取有关特定进程的更多信息。请注意,“程序正在使用多少交换”并没有完全明确定义,因为一些页面由多个进程共享。cat /proc/12345/vmstat
12345
RAM 主要有两种竞争者:进程内存(可以交换出去)和磁盘缓存(可以从文件中重新读取)。没有理由总是优先考虑进程内存而不是磁盘缓存:最好是交换出很少使用的进程内存部分,而不是一遍又一遍地将文件读入内存。您给出的数字是,大约一半(比如说 30%–70%)的内存专用于磁盘缓存,这对于具有合理数量的 RAM 来完成任务的系统来说是典型的。
答案2
在 StackOverflow 上,对您的第一个问题(“哪个进程实际上正在使用交换?”)已经有了一个很好的答案。
https://stackoverflow.com/a/7180078/1442301
简而言之,像top
或 这样的工具htop
根本不提供有关交换使用情况的准确信息。您应该深入研究/proc
文件夹(在伪文件中/proc/$PID/smaps
)以获取更准确的信息。
这邮政上面提到的包含一个简短的 shell 脚本,以便以一种好的方式回显这些信息。
答案3
答案4
如果不轮询和解析 、和等工具的输出vmstat
,最好的查找位置可能是 root 用户或系统上其他用户的 crontab。如果系统的总体负载在某个时间可靠地达到峰值,则很可能 cron 中有一个进程需要资源。否则,您可以随时使用该实用程序创建一个 ghetto 一次性日志记录实用程序,它只记录进入 STDOUT 的所有内容。free
top
script
因此,如果我需要编写一次性脚本来捕获输出以供以后检查,则在一个终端中我会输入:
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
的输出top
free
再次,这是一个贫民窟的方法,但听起来你只需要一次性的
你可能还想阅读Ubuntu 交换指南