我已通过设置禁用内存过度使用overcommit_memory=2。现在,当我尝试时swapoff,出现此错误:
swapoff:/dev/sda5:swapoff 失败:无法分配内存
但我实际上有0 MiB交换和大量可用内存!我尝试设置overcommit_ratio为 100,但它没有改变任何东西。
如果我暂时overcommit_memory=0按默认设置,我可以成功swapoff,然后重新禁用过度提交。
为什么会有这种奇怪的行为?这是一个错误吗?
按照评论中的要求进行编辑:
$ grep -E '^Mem|Commit' /proc/meminfo
MemTotal: 2044420 kB
MemFree: 751836 kB
CommitLimit: 4122112 kB
Committed_AS: 2752544 kB
Run Code Online (Sandbox Code Playgroud)
正如@Mat 指出的,Committed_AS > MemTotal。换句话说,你已经分配了比你实际拥有的更多的内存,所以如果你禁用交换,你已经被过度使用了。因此,当您不允许过度提交时,您不能禁用交换,直到您释放一些内存。
并非所有分配的内存都被实际使用,这就是为什么你仍然有一些空闲内存,尽管分配了这么多。
这是一个非常常见的混淆。有几个概念只是松散相关的。
当一个进程分配内存(malloc 或类似的)时,它所做的实际上是保留内存。默认情况下,Linux 过量使用虚拟内存,因此不太关心预留并且通常会成功返回。
当您第一次访问保留内存时,此内存必须由位于 RAM 或磁盘上的页面支持。
如果没有足够的 RAM 将所有访问的虚拟内存保存在 RAM 上,系统就会开始分页(通常称为交换)并且性能停滞。
如果进程保留的内存多于交换区和(部分)RAM 的总和,并且您的系统配置为不过度使用内存,则分配将失败。即使您有足够的可用 RAM 并且没有使用交换区域上的任何页面,这种情况也可能发生。这是拥有一个不会随机杀死应用程序的系统所要付出的代价。
在您的情况下,您有足够的可用虚拟内存,但其中一部分被保留,因此需要存在一些交换区域,这意味着您无法删除后者。
| 归档时间: |
|
| 查看次数: |
8966 次 |
| 最近记录: |