我有一个运行 centos 6.3 的生产系统,配有 96 Gb RAM 和 2 Gb 交换空间。目的是让机器上有足够的 RAM,这样就不会交换任何进程。
根据 /proc/meminfo SwapTotal 和 SwapFree 的报告,在过去一周左右,使用的交换空间量已增加到 100%。
但是,top 和此处给出的脚本报告的进程使用的交换空间量https://stackoverflow.com/questions/479953/how-to-find-out-which-processes-are-swapping-in-linux仅为约26 Mb。
系统似乎没有进行交换,所以我不确定如何认真对待 /proc/meminfo SwapFree 值。
为什么 /proc/meminfo 报告的内容和每个进程的 Swap 之间存在这种差异?
我如何才能找出哪些进程负责 /proc/meminfo 认为所有的交换都已被使用(除了依次终止每个进程并查看 SwapFree 何时增加,但这在生产系统上并不是一个好主意)?
更新:这是免费的当前输出:
total used free shared buffers cached
Mem: 99052152 98330684 721468 0 577400 82224692
-/+ buffers/cache: 15528592 83523560
Swap: 2097144 959580 1137564
和 cat /proc/meminfo:
MemTotal: 99052152 kB
MemFree: 731560 kB
Buffers: 577400 kB
Cached: 82222116 kB
SwapCached: 174456 kB
Active: 69762456 kB
Inactive: 25778300 kB
Active(anon): 53783608 kB
Inactive(anon): 8973048 kB
Active(file): 15978848 kB
Inactive(file): 16805252 kB
Unevictable: 31424 kB
Mlocked: 31424 kB
SwapTotal: 2097144 kB
SwapFree: 1137556 kB
Dirty: 2076 kB
Writeback: 0 kB
AnonPages: 12598632 kB
Mapped: 43958780 kB
Shmem: 50010060 kB
Slab: 1390148 kB
SReclaimable: 1308692 kB
SUnreclaim: 81456 kB
KernelStack: 6400 kB
PageTables: 171412 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 51623220 kB
Committed_AS: 68521168 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 478428 kB
VmallocChunk: 34307842136 kB
HardwareCorrupted: 0 kB
AnonHugePages: 11145216 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 5604 kB
DirectMap2M: 2078720 kB
DirectMap1G: 98566144 kB
记录的总交换使用量/proc/*/status VmSwap
为 11832 Kb。(计算方式awk '/^VmSwap/ {t+=$2} END {print t" kB"}' /proc/*/status
)
答案1
不会在每个进程中出现的已使用交换的一个来源是 SwapCached 页面。
该SwapCached: 174456 kB
行是交换空间和内存中的页面。
当页面被发送到交换区然后再次需要但从未被修改时,就会发生这种情况。磁盘上的副本仍然有效,因此被保留。实际上它可以稍后再次交换到磁盘,而不会导致写入磁盘。