我有带有28GB RAM和2GB交换空间的虚拟linux(Fedora 17)服务器。服务器正在运行一个MySQL DB,该数据库已设置为使用大多数RAM。
运行一段时间后,服务器开始使用swap换出未使用的页面。很好,因为我的交换默认为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
如果我使用来自/server//a/423603/98204的脚本,它会报告合理的数字(很少的MB被bash's,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,这是“奇怪”的数字。
- 如/server//a/477664/98204中所述,交换中有一些页面以某种方式在进程之间共享。如果这是真的,我该如何找到这样使用的实际内存数量?我的意思是,这需要使cca 800MB有所不同。在这种情况下听起来不对。
- 交换中有一些“旧”页面已由已使用的进程使用。我不介意如果我能够找出这个“可释放的”交换量是多少。
- 交换中有一些页面已交换回内存,并且正在交换中,以防万一它们没有在RAM中更改并且需要再次交换出去,如 /server//a/100636/98204中所述。但是SwapCached值只有24MB。
奇怪的是,交换使用量正在缓慢增加,而脚本输出的总和却大致相同。在过去3天中,使用的交换从1100MB增加到当前的1230MB,而总和从430MB增加到当前的449MB(大约)。
服务器具有足够的可用(可用)RAM,因此我可以关闭交换并重新打开。或者我可能将swappiness设置为0,这样只有在没有其他方法时才可以使用交换。但是我想解决这个问题,或者至少找出是什么原因。