系统认为它正在交换,但实际上并非如此

系统认为它正在交换,但实际上并非如此

我有一台 Linux 服务器(Ubuntu 10.04),没有交换空间(swapon -l 没有报告任何内容,/proc/meminfo 中列出了 0kb 交换内存)。top 输出的开头部分(按 %mem 排序)如下所示:

top - 04:18:28 up  7:31,  2 users,  load average: 0.93, 0.76, 0.71
Tasks:  25 total,   2 running,  23 sleeping,   0 stopped,   0 zombie
Cpu(s): 15.0%us,  0.8%sy,  0.0%ni, 84.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4195200k total,  4177028k used,    18172k free,        0k buffers
Swap:        0k total,        0k used,        0k free,        0k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND
30075 admin     20   0 4026m 1.4g 9648 S   31 35.7 271:03.97 2.5g java
 7700 root      15   0  170m 9152 4360 S    0  0.2   0:00.96 161m apache2
 7730 www-data  15   0  171m 6268 1168 S    0  0.1   0:00.00 165m apache2
 7726 www-data  15   0  171m 6232 1108 S    0  0.1   0:00.01 165m apache2
 9520 www-data  15   0  171m 6228 1100 S    0  0.1   0:00.00 165m apache2

我感到困惑的是,为什么 4 GB 内存的使用率只有报告的 40% 左右(ps 同意这些数字)。此外,我感到困惑的是,在没有交换空间的情况下,如何分配比常驻内存更多的虚拟内存。

据报道,没有可用内存,apt-get 由于分配不当而失败。这也让我很困惑,因为我认为 OOM killer 会在这种情况发生之前开始行动。

答案1

数量虚拟仿真测试系统列并不意味着所有内存实际上都没有被使用,只是标记为已分配。Java 程序往往会分配大量虚拟空间。

有时这可能会有点混乱;默认情况下,Linux 内核允许程序过度使用内存 - 即分配比系统可用内存更多的内存。这有点类似于电子邮件提供商为您提供数 GB 的免费电子邮件空间,因为他们知道/希望并不是每个人都真正使用了那么多空间,而只是其中的一小部分。

允许多少过度提交?在典型的发行版中,默认设置是使用vm.overcommit_memory=0模式,这意味着 Linux 内核使用一些启发式方法来确定该数量。使用以下方法检查您现在设置的值sysctl vm.overcommit_memory

如果该值为 0,并且您想要将内核行为更改为“不允许发生任何过度承诺”,则将这些行添加到/etc/sysctl.conf

vm.overcommit_memory=2
vm.overcommit_ratio=0

发出命令后,sudo sysctl -p新设置将被加载。

但是这些线条到底意味着什么呢?

vm.overcommit_memory=2将过度承诺模型从启发式模型更改为用户可定义的值。

vm.overcommit_ratio=0是允许过度使用内存的百分比。零表示不允许过度使用。

但是,如果你想允许大约 2 GB 的过度承诺,​​那么

vm.overcommit_memory=2
vm.overcommit_ratio=50

会这么做。

相关内容