web-dev-qa-db-ja.com

Linuxキャッシュが大きすぎるとQEMUがメモリを割り当てられないのはなぜですか?

私のマシン[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
9
Marcus

キャッシュされたすべてのデータをすぐに破棄できるわけではありません。たとえば、キャッシュされたダーティページは、RAMから削除する前にディスクに書き戻す必要があります。スワップがないため、これらの書き込みが完了するまで、QEMUに使用できる十分なスペースがありません。

妥当な量のスワップを追加する必要があります。片方の手を後ろで結んでメモリマネージャーがうまく機能することは期待できません。

19
David Schwartz