如何查找使用Linux交换的内容或交换中的内容?


12

我有带有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编号有很大差异?有什么方法可以“转储”交换信息以查看其中的实际内容,而不是汇总所有进程的交换使用情况吗?

在分析问题时,我提出了不同的想法,但它们似乎都是错误的:

  1. 脚本输出不是以KB为单位。即使以512或4KB为单位,也不会匹配。实际上,比率(1200:440)约为3:1,这是“奇怪”的数字。
  2. /server//a/477664/98204中所述,交换中有一些页面以某种方式在进程之间共享。如果这是真的,我该如何找到这样使用的实际内存数量?我的意思是,这需要使cca 800MB有所不同。在这种情况下听起来不对。
  3. 交换中有一些“旧”页面已由已使用的进程使用。我不介意如果我能够找出这个“可释放的”交换量是多少。
  4. 交换中有一些页面已交换回内存,并且正在交换中,以防万一它们没有在RAM中更改并且需要再次交换出去,如 /server//a/100636/98204中所述。但是SwapCached值只有24MB。

奇怪的是,交换使用量正在缓慢增加,而脚本输出的总和却大致相同。在过去3天中,使用的交换从1100MB增加到当前的1230MB,而总和从430MB增加到当前的449MB(大约)。

服务器具有足够的可用(可用)RAM,因此我可以关闭交换并重新打开。或者我可能将swappiness设置为0,这样只有在没有其他方法时才可以使用交换。但是我想解决这个问题,或者至少找出是什么原因。


就像您说的那样,您应该只设置vm.swappiness = 0(或1)并进行交换和&swapon
HTTP500

但这不能解决问题。我假设如果将swappines设置回60,交换将再次开始增加,或者如果我将其保持为0或1(除非服务器内存不足,则根本不使用)
RadekHladík13年

如果是DB Server,则仅应在紧急情况下使用swap,因此应始终将其设置为0(或1)。
2013年

没错,如果我没有找到造成此问题的原因,那可能就是我该怎么办...另一方面,服务器上有很多小型数据库,这些数据库很少被使用,我喜欢它们被不使用时由系统替换掉...但是我想MySQL将能够自己处理它
RadekHladík13年

Mysql在管理自己的缓存方面做得非常好,但这是基于对内存中实际存在和不存在的假设。如果您试图通过使用交换内存来对其进行双重猜测,那只会损害mysql决定哪些内容需要缓存,哪些内容不需要缓存的能力。关闭交换。如果您按了swap,那是调整失败。调整缓存大小,使交换永远不会发生,但除此之外,您想利用所有可用的物理内存。
mc0e 2013年

Answers:


9

Fedora 18及更高版本已smem加入回购协议。您可以下载python脚本并从源代码安装。

这是我的机器的输出示例(有些被删节和匿名化):

# 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。

   To  capture  memory statistics on resource-constrained systems, the the
   smem source includes a utility named  smemcap.   smemcap  captures  all
   /proc entries required by smem and outputs them as an uncompressed .tar
   file to STDOUT.  smem can analyze the output using the --source option.
   smemcap is small and does not require Python.

1
SMEM从F17回购没有工作(显示一个空表),但是从源头上一个工作,并呈现出几乎相同的数字别人:-) MySQL的358.1M出392.6M共有,而上节目1191224k使用
拉德克Hladík

4

您应该在另一台机器上检查此脚本,因为我的系统显示正确的交换使用情况:

# Your_script.sh
111280   Total Swap Used
# free
Swap:     33551716     120368   33431348

就在111280〜= 120368附近。

另外,请看以下脚本:

对于/ proc / *中的proc;做$ proc / smaps 2> / dev / null | awk'/ Swap / {swap + = $ 2} END {打印交换“ \ t' readlink $proc/exe'”}'; 完成| 排序-n | awk'{total + = $ 1} / [0-9] /; END {打印总计“ \ tTotal”}'

从这个线程:

/unix/71714/linux-total-swap-used-swap-used-by-processes


提到的脚本返回相同的结果... 364920 / usr / libexec / mysqld 400372总计
RadekHladík13年

当我在交换使用率非常低的其他服务器上尝试脚本时(50MB),报告总计cca为72MB :-)稍后,我将需要在一些非生产服务器上对其进行仿真...
RadekHladík13年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.