问题描述
我有一台运行数据库的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
我注意到交换每天下午都会增加,晚上会释放一些时间。需求并非全天都一样,并且在不同的时间开始。因此,除了模糊的”afternoon-night”边界之外,它都是随机的。
白天,这台机器上的负载会有所不同。在午夜和6-7 AM之间非常低,直到6-8 PM为止更高(但稳定),然后逐渐下降。
现在我有以下问题:
-
如何查看哪些进程正在使用交换?
-
为什么它更愿意换出而不是从缓存中获取一些内存?
最佳思路
您描述的交换使用模式听起来并不奇怪。它们与具有rarely-used页面的某些permanently-running进程一致。白天,由于活动繁忙,rarely-used页面几乎总是处于交换状态。晚上,RAM中有更多的空间供他们使用。
您可以了解一下top
或htop
中每个进程使用了多少种各种内存。默认情况下,两个都不显示交换使用情况,但是都可以配置为(顶部:按f
并打开SWAP
列; htop:按F2
并添加NSWAP
列)。您可以使用cat /proc/12345/vmstat
获得有关特定进程的更多信息,其中12345
是进程ID。请注意,“某些程序正在使用多少交换空间”并不完全是well-defined,因为某些页面由多个进程共享。
RAM有两种主要的竞争者:进程内存(可以换出)和磁盘缓存(可以是文件中的re-read)。没有理由总是使进程内存的优先级高于磁盘缓存:交换掉进程内存的rarely-used部分比将文件一次又一次地读入内存更好。您提供的数据大约有一半(例如30%–70%)的内存专用于磁盘缓存,这对于具有合理数量的RAM来执行其应执行的任务的系统来说是典型的。