W jaki sposób maszyny wirtualne mogą zużywać tak mało pamięci RAM na fizycznym komputerze hosta?

24

Używam VirtualBox na komputerze z systemem Windows XP z 2 GB pamięci RAM. Stworzyłem wirtualną maszynę Ubuntu i przydzieliłem jej podstawową pamięć 750 MB.

Aby to przetestować, uruchomiłem 20 rzeczy naraz na maszynie wirtualnej. Według „top” w Ubuntu wykorzystano 750 megabajtów pamięci, a także znaczną przestrzeń wymiany.

Jednak w Menedżerze zadań Windows VitrualBox zużywał tylko 45 000 KB pamięci. Gdy poprosiłem maszynę wirtualną o robienie coraz więcej, zużycie procesora przez proces VirtualBox wzrosło (w systemie Windows), ale użycie pamięci pozostało takie samo.

W jaki sposób maszyna wirtualna wykorzystująca 750 MB pamięci może zużywać tylko 45 MB pamięci na maszynie fizycznej?

Zakładam, że odpowiedź brzmi: maszyna wirtualna nie używa prawdziwej pamięci, ale pamięć symulowaną (tj. Przestrzeń wymiany), ale z pewnością czuje się tak, jakby działała w pamięci RAM.

AKTUALIZACJA: Bawiłem się perfmon zgodnie z sugestią. Nawet podsumowując wszystko, co mogę wymyślić, nadal zajmuje mniej niż 300 megabajtów ... więc nadal jest tajemnicą.

Process               VirtualBox     VirtualBox#1     Total
PoolNonpagedBytes     5,840          42,552           48,392
PoolPagedBytes        119,796        166,892          286,688
PrivateBytes          8,884,224      52,719,616       61,603,840
VirtualBytes          75,939,840     161,202,176      237,142,016
Sum                   84,949,700     214,131,236      299,080,936
dggoldst
źródło

Odpowiedzi:

7

Kolumny w Menedżerze zadań mogą podawać mylące liczby - w celu dokładnego wykorzystania pamięci na proces można użyć perfmon (Monitor wydajności w Panelu sterowania) i spojrzeć na liczby „prywatnych bajtów”.

Aby to pokazać, przejdź do perfmon, kliknij, aby dodać licznik (jestem Ctrl+ Iosobą). „Obiekt wydajności” to „Proces”, a „Prywatne bajty” znajdują się na liście liczników - oczywiście trzeba wybrać odpowiedni proces z listy po prawej stronie.

Rowland Shaw
źródło
Cześć. Próbowałem tego, ale nie miałem szczęścia znaleźć czegoś o nazwie Private Bytes. Czy możesz podać krok po kroku?
dggoldst
Dodałem ...
Rowland Shaw
Dzięki, to jest bardzo pomocne. Dodałem analizę do pytania. Nadal nie mogę zrozumieć, dlaczego nie sumuje się do 750.
dggoldst
Bardzo dziwne. Mógłbym wskazać, że PrivateBytes jest podzbiorem VirtualBytes (bajty wirtualne to proporcja przydzielonej przestrzeni adresowej, podczas gdy bajty prywatne to pamięć, która nie została jeszcze zwolniona - fragmentację pamięci można uzyskać przy niewielkim wycieku pamięci i mieć aplikacje giną z niewystarczającą ilością pamięci, nawet gdy jest ich wystarczająco dużo). Może się zdarzyć, że sterownik wirtualizacji przydziela pamięć w taki sposób, że nie będzie się wyświetlać, co ma sens, ponieważ pamięć powinna być odporna na stronicowanie na dysk.
Rowland Shaw
Z czterech liczników, które umieściłeś w tabeli, tylko „PoolNonPagedBytes” to liczba niestronicowanej pamięci wirtualnej, stąd ta ilość pamięci fizycznej zostanie wykorzystana. Pozostałe są wirtualne. Jak każdy inny rozmiar pamięci wirtualnej, rzeczywista pamięć RAM, której używa, jest prawie zawsze znacznie mniejsza, to jeden z całych punktów pamięci wirtualnej.
Jamie Hanrahan,
5

W przypadku niektórych rozwiązań do wirtualizacji pod Linuksem sposób, w jaki przydzielają pamięć, sprawia, że ​​jądro hosta wydaje się być specjalnym plikiem odwzorowanym w pamięci (podobnie jak /proc/kcoreplik specjalny), więc jest liczone w liczbie „buforowanej” w danych wyjściowych zfree , a nie w liczba „wykorzystanych”.

Przypuszczam, że coś podobnego dzieje się ze środowiskiem Windows: 45 MB zostanie wykorzystane przez procesy zarządzania VirtualBox, a 750 przydzielone samej maszynie wirtualnej zostanie policzone gdzie indziej.

David Spillett
źródło
0

Może to być pamięć wirtualna, pliki zmapowane w pamięci lub coś podobnego.

Czy próbowałeś wyświetlić inne kolumny w Menedżerze zadań?

zildjohn01
źródło
0

Nie wierz menedżerowi zadań. Nie widzi wszystkiego.

Ten problem jest częściej spotykany w SQL Server, na przykład w Sql, nigdy nie znalazłem nikogo, kto powiedziałby mi sposób na uzyskanie dokładnych informacji z Menedżera zadań, który prowadziłby mnie do wniosku, że postać nie jest ukryta w jednym z inne kolumny.

sgmoore
źródło