Linux önbellekleri çok büyükse neden QEMU belleği ayıramıyor?


9

Makinemi [Ubuntu 16.04 64 bit, çekirdek 4.4] bir süre kullanırsam, QEMU'nun çekirdek önbelleklerinin bırakılması gerekir, aksi takdirde RAM ayırmayı başaramaz.

Neden oluyor?

Bu örnek bir çalışmadır:

~$ 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
Çünkü takasınız yok.
Michael Hampton

Yanıtlar:


19

Önbelleğe alınan verilerin tümü hemen atılamaz. Örneğin, önbelleğe alınmış kirli sayfaların RAM'den çıkarılmadan önce diske yazılması gerekir. Takasınız yok, bu yüzden bu yazılar tamamlanana kadar QEMU için yeterli alan yok.

Gerçekten makul miktarda takas eklemelisiniz. Bellek yöneticisinin tek elle arkasından iyi bir iş çıkmasını bekleyemezsiniz.


1
Teorik bir soru olarak (bellek yönetiminin gerçekte nasıl çalıştığı hakkında daha fazla bilgi edinmek istediğim için), yönetici kirli sayfalar geri yazılırken neden QEMU'nun bellek ayırma girişimlerini geciktiremiyor (engelleyemiyor)?
nanofarad

2
@ hexafraction Sadece bir tahmin: muhtemelen teknik olarak mümkündür (ancak önemli değil, karmaşıklık ekleyebilir, emin değilim), ancak çekirdek geliştiricileri muhtemelen bu özelliğe gerek olmadığını savunur, çünkü çözdüğü tek sorun takas olmamasından kaynaklanır. ayrıca sadece takas etkinleştirirseniz ve çekirdeğin bellek yönetimini zaten iyi yapmak için kodlandığı şekilde yapmasına izin verirseniz düzeltilen diğer sorunlara neden olur.
mtraceur

1
@hexafraction Çekirdeğin bunun mantıklı bir şey olduğu hakkında hiçbir fikri yok. Bazı uygulamalar için bu bir anlam ifade etmez, bu nedenle genel politika değildir. QEMU bunu yapmamayı seçti.
David Schwartz

2
veya birkaç dakika - - sizin için @hexafraction Gerçekten, 30 saniye bekleyin isteyeyim malloc()çağrısına belki yeterli bellek bulmak?
Michael Hampton

3
@hexafraction Bu şekilde düşünün. Çekirdek teorik olarak bir süre bloke etmek için bu özelliğe sahip olsaydı, bir aksaklık başarısız olursa, ek API olmadan mevcut davranışı elde etmenin hiçbir yolu olmazdı. Öte yandan, mevcut uygulama, bir süre beklemek ve yeniden denemek isteyen yazılımın, tatmin olana kadar yavaş bir döngüde malloc'u yeniden denemek için izin verir.
Vality
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.