如果Linux缓存太大,为什么QEMU无法分配内存?


9

如果我使用我的机器[Ubuntu 16.04 64位,内核4.4]一段时间,QEMU需要删除内核缓存,否则,它将无法分配RAM。

为什么会发生?

这是一个示例运行:

~$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15050        5427        3690          56        5931        4803
Swap:             0           0           0

~$ sudo qemu-system-x86_64 -m 10240 # and other options
qemu-system-x86_64: cannot set up guest memory 'pc.ram': Cannot allocate memory

~$ echo 3 | sudo tee /proc/sys/vm/drop_caches
3

~$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15050        1799        9446          56        3803        9414
Swap:             0           0           0

~$ sudo qemu-system-x86_64 -m 10240 # and other options
qemu-system-x86_64: cannot set up guest memory 'pc.ram': Cannot allocate memory

~$ echo 3 | sudo tee /proc/sys/vm/drop_caches
3

~$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15050        1502       10819          56        2727       10784
Swap:             0           0           0

~$ sudo qemu-system-x86_64 -m 10240 # and other options
# Now QEMU starts

4
因为您没有任何交换。
迈克尔·汉普顿

Answers:


19

并非所有缓存的数据都可以立即丢弃。例如,缓存的脏页必须先写回磁盘,然后才能从RAM中删除。您没有交换,因此在这些写入完成之前,根本没有足够的可用空间用于QEMU。

您确实应该添加合理数量的交换。您不能指望内存管理器可以用一只手绑在背后做得很好。


1
作为一个理论问题(因为我想了解有关内存管理实际工作的更多信息),为什么在写回脏页时,管理器不能延迟(阻止)QEMU的内存分配尝试?
nanofarad

2
@hexafraction只是一个猜测:在技术上可能是可能的(但不确定,这可能会增加相当大的复杂性),但是内核开发人员可能会认为不需要该功能,因为它解决的唯一问题是没有交换引起的,还会引起其他问题,如果您仅启用交换功能并让内核按照已经编码好的方式进行内存管理,所有这些问题都将得到解决。
mtraceur '16

1
@hexafraction内核不知道这是明智的选择。对于某些应用程序,这没有任何意义,因此这不是一般策略。QEMU选择不这样做。
David Schwartz

2
@hexafraction真的,你想等待30秒-或几分钟-为您的malloc()呼叫可能找到足够的内存?
迈克尔·汉普顿

3
@hexafraction这样考虑。如果理论上内核确实具有此功能(如果malloc否则会失败),则将阻塞一段时间,如果没有其他API,将无法实现当前行为。另一方面,当前实现允许希望等待并重试一段时间的软件以缓慢的循环重试malloc,直到满意为止。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.