运行一段时间后,服务器开始使用swap来交换未用完的页面.这很好,因为我的swappiness默认为60,这是预期的行为.
奇怪的是top / meminfo中的数字与进程中的信息不对应.即服务器报告这些数字:
/proc/meminfo: SwapCached: 24588 kB SwapTotal: 2097148 kB SwapFree: 865912 kB top: Mem: 28189800k total,27583776k used,606024k free,163452k buffers Swap: 2097148k total,1231512k used,865636k free,6554356k cached
如果我使用https://serverfault.com/a/423603/98204中的脚本,它会报告合理的数字(由bash’es交换的几个MB,systemd等)和MysqL的一个大的分配(我省略了很多输出行):
892 [2442] qmgr -l -t fifo -u 896 [2412] /usr/libexec/postfix/master 904 [28382] MysqL -u root 976 [27559] -bash 984 [27637] -bash 992 [27931] SCREEN 1000 [27932] /bin/bash 1192 [27558] sshd: admin@pts/0 1196 [27556] sshd: admin [priv] 1244 [1] /usr/lib/systemd/systemd 9444 [26626] /usr/bin/perl /bin/innotop 413852 [31039] /usr/libexec/MysqLd --basedir=/usr --datadir=/data/MysqL --plugin-dir=/usr/lib64/MysqL/plugin --log-error=/data/MysqL/err --open-files-limit=8192 --pid-file=/data/MysqL/pid --socket=/data/MysqL/MysqL.sock --port=3306 449264 Total Swap Used
因此,如果我得到正确的脚本输出,则总交换使用量应为449264K = ca. 440MB用MysqL使用ca. 90%的掉期.
问题是为什么这与top和meminfo数字有很大不同?有没有办法如何“转储”交换信息,看看它实际上是什么,而不是总结所有进程的交换使用?
在分析问题时,我提出了不同的想法,但它们似乎都是错误的:
>脚本输出不是KB.即使它是512或4KB单位也不会匹配.实际上,比率(1200:440)约为3:1,这是“奇怪的”数字.
>交换中有一些页面在流程之间以某种方式共享,如https://serverfault.com/a/477664/98204所述.如果这是真的,我怎么能找到这样使用的实际内存数量?我的意思是它需要使cca 800MB的差异.在这种情况下,这听起来不对.
>已完成的进程使用交换中的一些“旧”页面.我不介意,如果我能够找出这个“可以自由”交换多少钱.
>交换中的页面已经被交换回内存并且在交换中,以防它们没有在RAM中更改并且需要再次换出,如https://serverfault.com/a/100636/98204中所述.但SwapCached值仅为24MB.
奇怪的是,交换使用缓慢增加,而脚本的总和输出大致相同.在最近3天内,交换使用量从1100MB增加到目前的1230MB,而总和从430MB增加到目前的449MB(ca.).
服务器有足够的可用(可用)RAM,所以我可以关闭交换并重新打开它.或者我可以将swappiness设置为0,这样只有在没有其他方式时才会使用交换.但我想解决这个问题,或者至少找出原因是什么.
解决方法
这是我的机器的示例输出(有点剪切和匿名):
# smem -s swap -t -k -n PID User Command Swap USS PSS RSS 20917 1001 bash 0 1.1M 1.1M 1.9M 28329 0 python /bin/smem -s swap -t 0 6.3M 6.5M 7.4M 2719 1001 gnome-pty-helper 16.0K 72.0K 73.0K 516.0K 619 0 @sbin/mdadm --monitor --sca 28.0K 72.0K 73.0K 248.0K [big snip] 32079 42 gnome-shell --mode=gdm 41.9M 1.9M 2.0M 5.0M 32403 1001 /opt/google/chrome/chrome - 43.1M 118.5M 119.4M 132.3M 4844 1002 /opt/google/chrome/chrome 48.1M 38.1M 41.9M 51.9M 5411 1002 /opt/google/chrome/chrome - 54.6M 33.4M 33.5M 36.8M 5624 1002 /opt/google/chrome/chrome - 72.4M 54.9M 55.5M 65.7M 24328 1002 /opt/Adobe/Reader9/Reader/i 77.5M 1.9M 2.0M 5.2M 4921 1002 /opt/google/chrome/chrome - 147.2M 258.4M 259.4M 272.0M ------------------------------------------------------------------------------- 214 14 1.1G 1.1G 1.2G 1.7G
该源还提供了smemcap,它将存储所有相关数据,以便稍后可以在其上运行smem.
06001