Swap 应该这样使用吗?

Swap 应该这样使用吗?

我有一台双 Nehalem 四核 Xeon 5520 和 12GB DDR3 RAM 的服务器。服务器的平均内存使用率仅为 10-15% 左右,但使用的交换空间却显示 10% 以上。这是正常的吗,还是有什么问题导致了这种情况。我的印象是,只有在内存不足时才会使用交换空间。

我在 CentOS 5.3 上运行 Apache/2.0.63。

答案1

这没什么不对。内核会随着时间的推移逐渐将页面调入虚拟内存。如果您的服务器出现活动“高峰”,并且您当前可用的内存很快填满,也会出现这种情况。内存系统上的压力会导致页面调出,直到压力降低到设定点(您可以在 /proc/sys/vm 中检查)。即使在一个相当空闲的系统上,我也看到页面调出随着时间的推移逐渐出现。所以,除非交换相当活跃(大量页面错误导致页面调出活动),否则我不会担心这一点。

如果你真的那么担心,你可以随时关闭交换,然后再打开。这将强制那些交换的页面返回到内存中。我不建议这样做,但如果你愿意,你可以这样做。在执行此操作之前,请确保你有足够的可用内存。

答案2

你不必担心这个 - 交换将要如果内核认为数据不会被充分访问,因此不值得将其放在物理内存中,则使用。

如果你想监控“不良”交换使用情况,你最好监控速度交换读写发生的位置,而不仅仅是它是否正在被使用。

例如...

# vmstat 3
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0  19528  45324  19348 240132   50   17    93    26   30   30  0  1 98  1
 0  0  19528  45324  19348 240156    0    0     0     3    9   23  0  0 100  0
 0  0  19528  45324  19352 240156    0    0     0     9    9   25  0  0 100  0
 0  0  19528  45324  19352 240156    0    0     0     0    5   17  0  0 100  0

第一份报告告诉您自机器首次启动以来的状态(平均值),其余报告应该是(在上述情况下) 3 秒的平均值。

请注意siso字段大多为零 - 这就是您感兴趣的。

答案3

这很好,正如已经指出的那样,使用高峰可能会导致这种情况,或者内核可能决定将某些项目放入交换区,因为将 RAM 用于其他用途(页面缓存)更为明智。

作为其他问题的答案指出sysctl vm.swappiness你可能会感兴趣避免这种情况。

答案4

(作为答案发布,因为内容太长,无法作为对 Avery Payne 答案的补充评论)

此外,如果在高峰期使用过交换区,但高峰期已经过去,您可能会发现交换区中的大多数数据目前也位于 RAM 中。如果 Linux 将页面从交换区读回 RAM,它不会立即释放交换空间,除非需要交换区来存储更多数据,这样,如果它需要将页面交换出去(并且它知道其中的数据没有改变),它实际上不需要将页面写入磁盘,因为它们已经在那里了。

有关详细信息,请参阅 /proc/meminfo。目前在我的一台小型服务器上:

olm:/proc# free -m
             total       used       free     shared    buffers     cached
Mem:          1487       1457         30          0         15       1094
-/+ buffers/cache:        347       1139
Swap:          980        112        868
olm:/proc# cat meminfo
MemTotal:      1523572 kB
MemFree:         30688 kB
Buffers:         15724 kB
Cached:        1120884 kB
SwapCached:      67868 kB
SwapTotal:     1004052 kB
SwapFree:       888928 kB

因此,这里分配的 112Mb 交换空间中约 66Mb 目前也存在于 RAM 中。没有必要从交换中删除这 66Mb,因为不需要将空间用于其他用途(有大量完全可用的交换空间)。如果交换已满,这些页面将被重新分配,如果页面在 RAM 中发生变化,它们将被标记为脏页并可自由重新分配,但如果需要将它们交换回去,内核可以节省大量磁盘写入。

如果我强制清除磁盘缓存和缓冲区

sync; echo 3 > /proc/sys/vm/drop_caches

结果保持不变:

olm:/proc# free -m
             total       used       free     shared    buffers     cached
Mem:          1487       1278        209          0          0        979
-/+ buffers/cache:        298       1189
Swap:          980        112        868
olm:/proc# cat meminfo
MemTotal:      1523572 kB
MemFree:        212320 kB
Buffers:           652 kB
Cached:        1005732 kB
SwapCached:      67868 kB
SwapTotal:     1004052 kB
SwapFree:       888928 kB

在要求清除磁盘缓存后,“缓存”读数仍然很高,因为这也是分配给 VMWare VM 的内存,这是由于内存分配方式所致。SwapCached 读数没有改变,因为没有必要将页面复制回 RAM,因为 RAM 现在空闲了 - 在 RAM 再次分配给其他东西之前,它们可能永远都不需要,因此这些读取将被浪费。

上述情况与您的情况略有不同,因为这台机器几乎总是将其所有 RAM 分配给某些东西(虚拟机、其他进程、I/O 缓存+缓冲区),但根据您机器自上次启动以来的加载历史记录,交换区域中分配的空间中的一大块页面也同样位于 RAM 中。

相关内容