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
スワップがないからです。
マイケルハンプトン

回答:


19

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

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


1
理論的な質問として(メモリ管理の実際の動作について詳しく知りたいので)、ダーティページが書き戻されている間、マネージャがQEMUのメモリ割り当て試行を遅延(ブロック)できないのはなぜですか?
nanofarad 2016年

2
@hexafraction単なる推測:おそらく技術的には可能です(ただし、かなり複雑になる可能性がありますが、確かではありません)が、カーネル開発者はおそらく、その機能は必要ないと主張します。また、他の問題も引き起こします。スワップを有効にして、カーネルがメモリ管理をすでにうまくコーディングされている方法で実行するようにすれば、すべてが修正されます。
mtraceur 2016年

1
@hexafractionカーネルは、それが賢明なことであるとは考えていません。一部のアプリケーションでは、これは意味をなさないため、一般的なポリシーではありません。QEMUはそうしないことを選択しました。
David Schwartz

2
または数分- -あなたのために@hexafraction本当に、あなたは30秒を待つようにしたいと思うmalloc()の呼び出しに多分十分なメモリを見つけますか?
マイケルハンプトン

3
@hexafractionこのように考えてください。理論的にはカーネルがこの機能をブロックしていて、しばらくの間mallocが失敗した場合、追加のAPIなしで現在の動作を実現する方法はありません。一方、現在の実装では、しばらく待ってから再試行したいソフトウェアが、それが満たされるまで低速ループでmallocを再試行できます。
Vality
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.