Mam proces, który zgłasza „u góry”, że ma 6 GB pamięci rezydentnej i 70 GB przydzielonej pamięci wirtualnej. Dziwne jest to, że ten konkretny serwer ma tylko 8 GB pamięci fizycznej i 35 GB dostępnej przestrzeni wymiany.
Z „górnego” podręcznika:
o: VIRT -- Virtual Image (kb)
The total amount of virtual memory used by the task. It includes
all code, data and shared libraries plus pages that have been
swapped out. (Note: you can define the STATSIZE=1 environment vari-
able and the VIRT will be calculated from the /proc/#/state VmSize
field.)
VIRT = SWAP + RES.
Biorąc pod uwagę to wyjaśnienie, spodziewałbym się, że alokacja pamięci virutal dla procesu będzie ograniczona do mojej swap + dostępnej pamięci fizycznej.
Według „pmap” sekcje kodu, biblioteki współużytkowanej i pamięci współużytkowanej tego procesu są minimalne - nie więcej niż 300 mln.
Oczywiście maszyna i proces nadal działają poprawnie (choć powoli), więc czego tu brakuje?
źródło
Oto dyskusja pamięci virt vs. rezydent:
/programming/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used
Dyskusja dotyczy procesów Java, ale ma zastosowanie do wszystkiego, co działa pod Linuksem. Najważniejsze w odniesieniu do virt jest to, że całość zawiera całą masę rzeczy, których nigdy nie można użyć. Virt jest czymś, na co warto zwrócić uwagę w 32-bitowych systemach operacyjnych (ponieważ procesy przekroczą limit przestrzeni adresowalnej), ale w większości nie jest przydatny. Jak wspomniano, należy zwrócić uwagę na pamięć rezydentną, która będzie ograniczona do dostępnej fizycznej pamięci RAM i wymiany.
źródło
Jest to prawdopodobne, ponieważ przestrzeń adresowa procesu ma rozmiar, jak podano, ale tak naprawdę nie jest przydzielana przez system operacyjny.
Od: http://lwn.net/Articles/428100/
Jest to więc nieelegancki sposób zarządzania pamięcią czasami - posiadanie ciągłej przestrzeni adresowej upraszcza uwalnianie nieużywanej pamięci.
źródło
Odpowiedź brzmi prawdopodobnie MMAP - dane znajdują się na dysku, ale są „poza” wymianą i nie można ich zobaczyć za pomocą polecenia „wolny” lub „górny”.
Jeśli proces Java nie jest zbyt skomplikowany, możesz spróbować zagrać w „lsof”, aby dowiedzieć się, gdzie jest plik MMAP. Jednak jeśli ten proces Java jest skomplikowany, będzie trudno go zobaczyć.
źródło
Byłem również zaskoczony, że Linux pozwala ci przydzielić więcej pamięci wirtualnej niż jest pamięć fizyczna + przestrzeń wymiany, ale najwyraźniej poprawia wydajność w typowych sytuacjach.
http://www.linuxjournal.com/article/10678
źródło