Poniżej przedstawiono użycie pamięci mysql
i apache
odpowiednio na moim serwerze. Jak wynika z pmap
powiedzmy, mysql
używa około 379M i apache
używa 277M.
[root@server ~]# pmap 10436 | grep total
total 379564K
[root@server ~]# pmap 10515 | grep total
total 277588K
Porównując to z wynikiem top
, widzę, że wartości są prawie takie same.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10515 apache 20 0 271m 32m 3132 S 0.0 6.6 0:00.73 /usr/sbin/httpd
10436 mysql 20 0 370m 21m 6188 S 0.0 4.3 0:06.07 /usr/libexec/mysqld --basedir=....
Teraz te wartości zdecydowanie nie są bieżącym wykorzystaniem pamięci przez te dwa procesy, ponieważ gdyby tak było, przekroczyłoby 512 MB ram
w moim systemie i rozumiem fakt, że są to rozmiary stron przypisanych do tych dwóch procesów, a nie tak naprawdę rozmiar aktywnie wykorzystywanej przez nich pamięci. Teraz, gdy używamy pmap -x
, widzę dodatkową barwę, Dirty
która pokazuje znacznie mniejsze zużycie pamięci dla procesu. Jak widać na poniższym przykładzie, Dirty
kolor pokazuje 15M w przeciwieństwie do 379M w pierwszym kolorze. Moje pytanie brzmi: czy wartością pod kolorem Dirty
jest „prawdziwa” ilość pamięci aktywnie wykorzystywana przez ten proces? Jeśli nie, to jak możemy ustalić faktyczne wykorzystanie pamięci przez proces? Nie ps
i top
z tych samych powodów powyższych. Czy mamy coś poniżej/proc
które podadzą te informacje?
[root@server ~]# pmap -x 10436 | grep total
total kB 379564 21528 15340
[root@server ~]#
[root@server ~]# free -m
total used free shared buffers cached
Mem: 489 447 41 0 52 214
-/+ buffers/cache: 180 308
Swap: 1023 0 1023
[root@server ~]#
źródło
Odpowiedzi:
Nie ma polecenia, które podaje „rzeczywiste użycie pamięci przez proces”, ponieważ nie ma czegoś takiego jak faktyczne użycie pamięci przez proces .
Każda strona pamięci procesu może (między innymi):
Myślę, że „brudna” liczba sumuje wszystko, co jest w pamięci RAM (bez wymiany) i nie jest zabezpieczone przez plik. Obejmuje to zarówno pamięć współdzieloną, jak i nieudostępnioną (choć w większości przypadków innych niż serwery rozwidlające, pamięć współdzielona składa się wyłącznie z plików mapowanych na pamięć).
Informacje wyświetlane przez
pmap
pochodzą z i . Takie jest rzeczywiste wykorzystanie pamięci przez proces - nie można go podsumować pojedynczą liczbą./proc/PID/maps
/proc/PID/smaps
źródło
Przytoczę coś, co napisałem na stronie podręcznika dla aplikacji, która wykonuje analizę podobną do góry i rysuje informacje z tych samych źródeł co
pmap
(np./proc/[N]/maps
):pmap
zgłasza głównie informacje o wirtualnej przestrzeni adresowej . Twoja obserwacja, że „wartości są prawietop
takie same ” w danych wyjściowych prawdopodobnie odnosi się do liczby VIRT, która jest bardzo różna od liczby RES. Odpowiadają one dokładnie temu, co powyżej oznaczyłem jako „VirtualSz” i „ResidentSz” (VIRT jest dla wirtualnego, RES dla rezydenta).Nie, ale w pewnym sensie. Pamięć „brudna” odnosi się do danych, które zostały załadowane z dysku, a następnie zmodyfikowane; ponieważ został zmodyfikowany, musi być częścią pamięci rezydentnej, ponieważ zmiany te są obecnie przechowywane w pamięci RAM. Nie jest to jednak synonimem.
źródło
Pamięć wirtualna jest jak numery szybkiego wybierania, z tym że jest ich około 3 miliardów (dla systemu 32-bitowego, 4 miliardy dla aplikacji 32-bitowej na jądrze 64-bitowym, znacznie więcej dla aplikacji 64-bitowej) i nie można wybierać numerów bezpośrednio, mają do przypisania do szybkiego wybierania.
Kilka procesów może mieć różne mapowania (numery szybkiego wybierania) dla tego samego adresu (numery telefonów). Na przykład mogą dzielić kilka bibliotek, więc mają adresy wirtualne dla całej biblioteki (możesz to zobaczyć w pmap). Mogą nawet dzielić ten sam plik wykonywalny, np. 2 instancje bash.
Jak dotąd wyjaśnia to, w jaki sposób można dopasować podrzędny adres wirtualny, ale jest więcej. Jeden proces może mieć tyle pamięci wirtualnej, że nie powinien się zmieścić, jak? Niektóre części biblioteki lub pliku wykonywalnego mogą nie być używane, nie zostaną skopiowane z dysku do pamięci RAM lub pamięć RAM zostanie zapełniona i bity załadowane z dysku zostaną upuszczone, ponieważ w razie potrzeby można je ponownie pobrać z dysku, lub pamięć, która nie ma kopii zapasowej, mój dysk jest mapowany do wymiany, kopiowany do wymiany, a następnie upuszczany. W razie potrzeby można go odczytać z wymiany. Jeśli którakolwiek z tych ostatnich strategii jest używana zbyt często, system staje się wolny.
źródło