为什么当有 16GB 的缓冲区缓存且 swappiness = 0 时主机会换出 VM?

Bla*_*jac 6 swap openstack kvm-virtualization

我有一台在 Intel i5 上使用 OpenStack Folsom 运行 Ubuntu Quantal 的桌面,具有 32 GB RAM 和 2 GB 交换。我正在运行 7 个虚拟机,每个虚拟机的大小都类似于 EC2 m1.small,因此每个虚拟机有 1.7 GB RAM。我正在使用 KVM。

当我开始同时运行 5 或 6 个时,主机开始将它们换掉:

top - 23:45:42 up 3 days,  1:51, 10 users,  load average: 0.37, 0.75, 1.15
Tasks: 418 total,   2 running, 413 sleeping,   3 stopped,   0 zombie
%Cpu(s):  8.8 us,  2.1 sy,  0.0 ni, 88.8 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
KiB Mem:  32864580 total, 32586956 used,   277624 free,   574236 buffers
KiB Swap:  1998844 total,  1113352 used,   885492 free, 16498252 cached

  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND           
24652 libvirt-  20   0 4169m 1.7g 7756 S   3.6  5.4   4:49.37 kvm               
25233 libvirt-  20   0 4450m 1.6g 7756 S   1.2  5.2   4:35.12 kvm               
25589 libvirt-  20   0 4163m 1.6g 7756 S   2.4  5.1   4:40.31 kvm               
 6562 root      39  19 2935m 658m 7460 S   0.0  2.1 100:05.62 java              
28393 libvirt-  20   0 4149m 624m 7756 S   0.0  1.9   2:25.01 kvm               
28106 libvirt-  20   0 4170m 617m 7756 S   0.0  1.9   2:18.17 kvm               
26519 libvirt-  20   0 4167m 590m 7756 S   0.0  1.8   2:22.16 kvm               
29399 libvirt-  20   0 4159m 589m 7756 S   0.0  1.8   2:19.94 kvm               


$ free -m
             total       used       free     shared    buffers     cached
Mem:         32094      31868        225          0        559      16175
-/+ buffers/cache:      15134      16959
Swap:         1951       1087        864


# /tmp/swap-used.sh |grep kvm
PID=944 - Swap used: 0 - (kvm-irqfd-clean )
PID=24652 - Swap used: 102468 - (kvm )
PID=25233 - Swap used: 108644 - (kvm )
PID=25589 - Swap used: 155768 - (kvm )
PID=26519 - Swap used: 192216 - (kvm )
PID=28106 - Swap used: 150796 - (kvm )
PID=28393 - Swap used: 208488 - (kvm )
PID=29399 - Swap used: 187388 - (kvm )
Run Code Online (Sandbox Code Playgroud)

我已经尝试将 swapiness 设置为 20,然后设置为 10,最后设置为 0,这些都没有任何区别:

# cat /proc/sys/vm/swappiness 
0
Run Code Online (Sandbox Code Playgroud)

自从将主机从 60 更改为 0 后,我还没有重新启动主机(是否需要重新启动)?我还完全关闭了与/sbin/swapoff -a; /bin/swapon -a. 重新启用交换后,我立即看到:

$ vmstat 5
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 2  0  11384 247572 652736 16539748   11   10   291   228   13   12  7  3 87  3
 0  0  12968 234360 652756 16554432    0  317  8576  1240 3508 5470 17  2 75  5
 1  0  17068 243512 652768 16559508    0  820  9448  1216 3687 4845 20  2 77  2
 1  0  20040 233300 652772 16576152    0  594 12262   677 4436 5063 29  2 68  1
 1  0  22764 219156 652792 16594448    6  546 11962   727 3870 4559 28  1 68  2
 3  0  40832 229384 652776 16602440    0 3614 58404  4176 2051 6231 21  2 66 10
 1  0  52420 232236 652784 16613320    0 2318 42174  2512 1819 4026 15  2 77  6
Run Code Online (Sandbox Code Playgroud)

我有 15 GB 的可用内存,无需换出进程即可使用。

Dav*_*rtz 8

我有 15 GB 的可用内存,无需换出进程即可使用。

不,你没有。

           total       used       free     shared    buffers     cached
Mem:       32094      31868        225          0        559      16175
Run Code Online (Sandbox Code Playgroud)

您有 225MB 的可用内存。

KiB 交换:总共 1998844 个,已使用 1113352 个,空闲 885492 个,缓存 16498252 个

看看系统制作的所有精彩缓存,部分是通过从宝贵的 RAM 中取出未使用的垃圾。你为什么要浪费宝贵的内存?

如果您在 RAM 中有 1GB 数小时未使用的数据,这更有意义:

  1. 当您不忙时,您可以将其换出到磁盘,并有 1GB 的缓存可供使用。

  2. 你把它留在记忆中。您可以使用少 1GB 的缓存,如果该内存需要用于其他用途,则您必须在忙碌时将其换出。

但是,如果您认为自己比编写操作系统内存管理逻辑的人更了解内存管理,请继续尝试找到“更快更好地完成所有事情”的神奇开关。

  • 几年来,我已经尝试了我所知道的每一种音调。我还没有找到一个有效的。无论如何,人们继续坚持在各个方向上转动经过精细调整的旋钮,以应对想象中的问题。但我并不苦。 (11认同)
  • (这是一个有用的观察,但你不认为语气可以更有建设性吗?) (3认同)
  • 关于操作系统可以重新分配给不同任务的“空闲”内存量,这个答案是不正确的,请参阅 http://www.linuxatemyram.com/ 。操作系统将使用所有可用内存,随着时间的推移,`top` 输出将始终显示接近 0 的可用内存,这正是您想要的。但是,如果您查看上面 `-/+ buffers/cache` 行上的 `free -m` 输出,就会发现如果考虑可以删除页面的缓冲区缓存,则操作系统可以使用 16959 MB 的内存. 我宁愿操作系统将虚拟机留在内存中并删除缓冲区缓存页面,而不是其他方式。 (2认同)