Mengapa QEMU tidak dapat mengalokasikan memori jika cache Linux terlalu besar?

9

Jika saya menggunakan mesin saya [Ubuntu 16.04 64 bit, kernel 4.4] untuk sementara waktu, QEMU membutuhkan cache kernel untuk dihapus, jika tidak, ia tidak akan berhasil mengalokasikan RAM.

Mengapa itu terjadi?

Ini adalah contoh dijalankan:

~$ 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
Marcus
sumber
4
Karena Anda belum mendapat swap apa pun.
Michael Hampton

Jawaban:

19

Tidak semua data yang di-cache dapat segera dibuang. Sebagai contoh, halaman kotor yang di-cache harus ditulis kembali ke disk sebelum dihapus dari RAM. Anda tidak memiliki swap, jadi sebelum penulisan selesai, tidak cukup ruang yang tersedia untuk QEMU.

Anda benar-benar harus menambahkan jumlah swap yang wajar. Anda tidak dapat mengharapkan manajer memori melakukan pekerjaan dengan baik dengan satu tangan terikat di belakang.

David Schwartz
sumber
1
Sebagai pertanyaan teoretis (karena saya ingin belajar lebih banyak tentang bagaimana sebenarnya manajemen memori bekerja) mengapa manajer tidak dapat menunda (memblokir) alokasi memori QEMU saat mencoba halaman kotor sedang ditulis kembali?
nanofarad
2
@hexafraction Hanya tebakan: itu mungkin secara teknis mungkin (tetapi mungkin menambah kompleksitas yang signifikan, tidak yakin), tetapi kernel devs mungkin akan berpendapat bahwa tidak perlu untuk fitur itu, karena satu-satunya masalah yang dipecahkan disebabkan oleh tidak memiliki swap, yang juga menyebabkan masalah lain, yang semuanya diperbaiki jika Anda hanya mengaktifkan swap dan membiarkan kernel melakukan manajemen memorinya dengan cara yang sudah dikodekan untuk melakukannya dengan baik.
mtraceur
1
@hexafraction Kernel tidak tahu itu hal yang masuk akal untuk dilakukan. Untuk beberapa aplikasi, itu tidak masuk akal, jadi itu bukan kebijakan umum. QEMU memilih untuk tidak melakukannya.
David Schwartz
2
@hexafraction Sungguh, akan Anda ingin menunggu 30 detik - atau beberapa menit - untuk Anda malloc()panggilan untuk mungkin menemukan cukup memori?
Michael Hampton
3
@hexafraction Pikirkan tentang hal ini. Jika kernel secara teoritis memiliki fitur ini untuk memblokir sementara jika malloc akan gagal, tidak akan ada cara untuk mencapai perilaku saat ini tanpa API tambahan. Di sisi lain, implementasi saat ini memungkinkan perangkat lunak yang ingin menunggu dan mencoba lagi sebentar untuk mencoba kembali malloc dalam loop lambat sampai puas.
Vality