Rzeczywiste użycie pamięci przez proces

20

Poniżej przedstawiono użycie pamięci mysqli apacheodpowiednio na moim serwerze. Jak wynika z pmappowiedzmy, mysqlużywa około 379M i apacheuż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 ramw 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ę, Dirtyktóra pokazuje znacznie mniejsze zużycie pamięci dla procesu. Jak widać na poniższym przykładzie, Dirtykolor pokazuje 15M w przeciwieństwie do 379M w pierwszym kolorze. Moje pytanie brzmi: czy wartością pod kolorem Dirtyjest „prawdziwa” ilość pamięci aktywnie wykorzystywana przez ten proces? Jeśli nie, to jak możemy ustalić faktyczne wykorzystanie pamięci przez proces? Nie psi topz 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 ~]#
Sree
źródło

Odpowiedzi:

18

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):

  • Pamięć przejściowa używana tylko przez ten proces.
  • Współdzielone z innymi procesami przy użyciu różnych mechanizmów.
  • Utworzono kopię zapasową pliku dyskowego.
  • W pamięci fizycznej lub zamianie.

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 pmappochodzą z i . Takie jest rzeczywiste wykorzystanie pamięci przez proces - nie można go podsumować pojedynczą liczbą./proc/PID/maps/proc/PID/smaps

Gilles „SO- przestań być zły”
źródło
6

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):

WIRTUALNA PRZESTRZEŃ ADRESOWA VS. PAMIĘĆ FIZYCZNA

Ważne jest zrozumienie różnicy między wirtualną przestrzenią adresową a pamięcią fizyczną podczas interpretacji niektórych z powyższych statystyk. Jak sama nazwa wskazuje, wirtualna przestrzeń adresowa nie jest prawdziwa; jest to w zasadzie mapa całej pamięci aktualnie przypisanej do procesu. Limit wielkości tej mapy jest taki sam dla każdego procesu (zwykle 2-4 GB) i nie jest kumulowany (tzn. Możesz mieć dziesiątki lub setki procesów, każdy z własnym adresem wirtualnym 2-4 GB miejsca w systemie, który ma tylko 512 MB pamięci fizycznej ).

Dane nie mogą być faktycznie przechowywane ani pobierane z wirtualnej przestrzeni adresowej; prawdziwe dane wymagają prawdziwej pamięci fizycznej. Zadaniem jądra jest zarządzanie jednym w stosunku do drugiego. Statystyki przestrzeni wirtualnej (VirtualSz, Data + Stack oraz Priv & Write) są przydatne do rozważenia struktury procesu i związku z wykorzystaniem pamięci fizycznej, ale w odniesieniu do ilości faktycznie używanej pamięci RAM, statystyki pamięci fizycznej (ResidentSz, Share i Odsetek) się liczy.

pmapzgłasza głównie informacje o wirtualnej przestrzeni adresowej . Twoja obserwacja, że ​​„wartości są prawie toptakie 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).

Teraz, gdy używamy pmap -x, widzę dodatkowy kolor Dirty, który pokazuje znacznie mniejsze zużycie pamięci dla procesu. Jak widać na poniższym przykładzie, Dirty Coloumn pokazuje 15M w przeciwieństwie do 379M w pierwszym coloumn. Moje pytanie brzmi: czy wartość pod kolorem Brudna jest „rzeczywistą” ilością pamięci aktywnie wykorzystywaną przez ten proces?

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.

Złotowłosa
źródło
Zgadzam się. Jednak 2 do 4 GB jest przeznaczone dla systemów 32-bitowych. Większość systemów w dzisiejszych czasach jest prawdopodobnie 64-bitowa.
ctrl-alt-delor
3

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.

ctrl-alt-delor
źródło