我有一台 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
会这么做。