内存管理,偏向交换

tra*_*nte 3 memory cache top centos swap

我有 768 MB RAM。通常情况下,MySQL 使用 100-180 mb 的 RAM,而 MySQL 交换了 80-120 mb。我有 50-60 mb 的可用内存。

所以我想我应该升级。然后我将 RAM 升级到 1 GB。之后,我有 200-350 mb 的可用内存。但是 MySQL 使用相同数量的 RAM 但仍然交换 40-60 mb。

这就是我的free -m结果。

             total       used       free     shared    buffers     cached
Mem:           996        796        200          0         73         97
-/+ buffers/cache:        625        371
Swap:         2047         92       1955
Run Code Online (Sandbox Code Playgroud)

这是我的最佳结果

top - 22:11:23 up 13:35,  1 user,  load average: 0.26, 0.33, 0.35
Tasks: 143 total,   1 running, 142 sleeping,   0 stopped,   0 zombie
Cpu(s): 20.2%us,  1.8%sy,  0.0%ni, 77.8%id,  0.2%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1020564k total,   809836k used,   210728k free,    77808k buffers
Swap:  2097144k total,    94880k used,  2002264k free,   102596k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND
 2484 mysql     20   0 1845m 165m 4356 S 25.9 16.6 151:33.45  63m mysqld
13777 myuser  20   0  201m  22m 9836 S  0.0  2.3   0:00.42    0 php-cgi
13780 myuser  20   0  200m  21m 9820 S  3.3  2.2   0:00.47    0 php-cgi
13773 myuser  20   0  200m  21m 9820 S  0.0  2.2   0:00.70    0 php-cgi
13775 myuser  20   0  200m  21m 9812 S  5.3  2.2   0:00.42    0 php-cgi
13779 myuser  20   0  200m  21m 9812 S  3.0  2.2   0:00.31    0 php-cgi
13778 myuser  20   0  200m  21m 9812 S  3.6  2.2   0:00.31    0 php-cgi
13776 myuser  20   0  200m  21m 9812 S  3.0  2.2   0:00.31    0 php-cgi
13774 myuser  20   0  199m  20m 9812 S  0.0  2.1   0:00.23    0 php-cgi
 2619 named     20   0  233m 9.8m 1388 S  0.0  1.0   0:04.57 5288 named
 2689 root      20   0  328m 7528 6316 S  0.0  0.7   0:05.14 9648 httpd
13735 root      20   0  106m 4840 3756 S  0.0  0.5   0:00.26    0 sshd
12772 apache    20   0  328m 3932 2040 S  0.0  0.4   0:01.08 9392 httpd
13163 apache    20   0  328m 3916 2036 S  0.0  0.4   0:00.65 9400 httpd
13425 apache    20   0  328m 3912 2036 S  0.0  0.4   0:00.32 9404 httpd
13417 apache    20   0  328m 3908 2036 S  0.0  0.4   0:00.35 9412 httpd
13420 apache    20   0  328m 3908 2036 S  0.0  0.4   0:00.37 9412 httpd
Run Code Online (Sandbox Code Playgroud)

虽然我有 371 mb 的可用内存,但我的 CentOS 6.3 系统仍然可以交换。现在交换是 90 mb。

我的问题是,虽然我有很多空闲内存,但为什么 Linux 仍然交换?如果情况不好,我如何诊断更多?或者我不应该关心它?

Nil*_*ils 6

您的 mysqld 配置为使用 1,8 GB 的 RAM - 可能是由于您在/etc/my.cnf. 这比物理上可用的要多得多。

现在在某个时间点(您可能会安装sysstat并询问sar),您似乎收到了使用比可用 RAM 多的内存请求(也可能是 PHP)-因此系统开始交换。

最后,内存不再使用,但也无法访问它。所以系统没有理由将该交换空间放回 RAM 中。

您可以调整 Linux 的“swappiness”来改变这种行为。

有关于“问问Ubuntu的”一个很好的问题/答案在这里