Dlaczego użycie pamięci w „top” nie sumuje się?

28

Zauważyłem, że czasami kiedy uruchamiam top , zużycie pamięci każdego procesu w tabeli procesów nie wydaje się sumować do całości.

Na przykład na poniższym zrzucie góra mówi, że używam 16 GB pamięci. Jednak tabela procesów pokazuje tylko dwa procesy wykorzystujące nieco ponad 520 Mb. Jak mogę dowiedzieć się, co zużywa pozostałe 15,5 Gb? (Używam CentOS.)

$ top

do góry - 12:16:34 do 45 dni, 2:28, 3 użytkowników, średnia ładowanie: 0,24, 0,65, 0,71
Zadania: w sumie 274, 1 uruchomiony, 273 śpiące, 0 zatrzymane, 0 zombie
Procesory: 2,3% us, 0,2% sy, 0,0% ni, 97,5% id, 0,0% wa, 0,0% hi, 0,0% si, 0,0% st
Mem: 16432032k łącznie, 16340144k używane, 91888k wolne, 21736k buforów
Zamiana: 18481144k łącznie, 1112k używane, 18480032k wolne, 15624488k buforowane

  PID USER PR NI VIRT RES SHR S% CPU% MEM TIME + COMMAND
18159 jsmith 15 0 260m 31m 4560 S 16,6 0,2 53: 35,64 python
 4795 26 15 0 260m 6608 4220 S 2,0 0,0 0: 00,06 postmaster
    1 korzeń 15 0 10344 680 568 S 0,0 0,0 0: 39,36 init
    2 korzenie RT -5 0 0 0 S 0,0 0,0 0: 00,53 migracja / 0
    3 korzenie 34 19 0 0 0 S 0,0 0,0 0: 00,62 ksoftirqd / 0
    4 root RT -5 0 0 0 S 0,0 0,0 0: 00.00 watchdog / 0
    5 root RT -5 0 0 0 S 0,0 0,0 0: 02.09 migracja / 1
    6 korzeni 34 19 0 0 0 S 0,0 0,0 0: 01,32 ksoftirqd / 1
    7 root RT -5 0 0 0 S 0,0 0,0 0: 00.00 watchdog / 1
    8 root RT -5 0 0 0 S 0,0 0,0 0: 00,99 migracja / 2
    9 root 34 19 0 0 0 S 0,0 0,0 0: 01.74 ksoftirqd / 2
   10 root RT -5 0 0 0 S 0,0 0,0 0: 00.00 watchdog / 2
   11 root RT -5 0 0 0 S 0,0 0,0 0: 02.16 migracja / 3
   12 korzeń 34 19 0 0 0 S 0,0 0,0 0: 01,30 ksoftirqd / 3
   13 root RT -5 0 0 0 S 0,0 0,0 0: 00.00 watchdog / 3
   14 root RT -5 0 0 0 S 0,0 0,0 0: 01.94 migracja / 4
   15 root 34 19 0 0 0 S 0,0 0,0 0: 01,78 ksoftirqd / 4
   16 korzeni RT -5 0 0 0 S 0,0 0,0 0: 00.00 watchdog / 4
   17 root RT -5 0 0 0 S 0,0 0,0 0: 01.92 migracja / 5
   18 root 34 19 0 0 0 S 0,0 0,0 0: 01,30 ksoftirqd / 5
   19 root RT -5 0 0 0 S 0,0 0,0 0: 00.00 watchdog / 5
   20 root RT -5 0 0 0 S 0,0 0,0 0: 02,06 migracja / 6
   21 root 34 19 0 0 0 S 0,0 0,0 0: 01,83 ksoftirqd / 6
   22 root RT -5 0 0 0 S 0,0 0,0 0: 00.00 watchdog / 6
   23 korzeń RT -5 0 0 0 S 0,0 0,0 0: migracja 02,31 / 7
   24 root 34 19 0 0 0 S 0,0 0,0 0: 01,50 ksoftirqd / 7
   25 root RT -5 0 0 0 S 0,0 0,0 0: 00.00 watchdog / 7
   26 root 10 -5 0 0 0 S 0,0 0,0 0: 00,42 zdarzeń / 0
   27 pierwiastek 10 -5 0 0 0 S 0,0 0,0 0: 00,28 zdarzeń / 1
   28 root 10 -5 0 0 0 S 0,0 0,0 0: 00,37 zdarzeń / 2
   29 root 10 -5 0 0 0 S 0,0 0,0 0: 00,21 zdarzeń / 3
   30 root 10 -5 0 0 0 S 0,0 0,0 0: 00,38 zdarzeń / 4
   31 root 10 -5 0 0 0 S 0,0 0,0 0: 00,27 zdarzeń / 5
   32 pierwiastek 10 -5 0 0 0 S 0,0 0,0 0: 00,52 zdarzeń / 6
   33 root 10 -5 0 0 0 S 0,0 0,0 0: 00,64 zdarzeń / 7
   34 root 10 -5 0 0 0 S 0,0 0,0 0: 00,00 khelper
del
źródło

Odpowiedzi:

26

Z górnych linii związanych z wykorzystaniem pamięci:

Mem: 16432032k total, 16340144k used, 91888k free, 21736k buffers
Swap: 18481144k total, 1112k used, 18480032k free, 15624488k cached

Zignorujmy zamianę. Całkowita pamięć jest równa sumie użytej i wolnej pamięci. Z drugiej strony używana jest suma „naprawdę używana przez aplikacje” oraz buforowane i buforowane. W twoim przypadku wygląda to tak:

  • Mem = 16432032k = 16340144k + 91888k;
  • „Naprawdę używany przez aplikacje” = Używany - (buforowany + bufory) = 16340144k - (15624488k + 21736k) = 693920k.

Pozostałe 15,5 GB są buforowane. To poprawia wydajność. Jednak w tej samej chwili aplikacja wymaga części pamięci podręcznej, która jest jej natychmiast przekazywana. Zauważysz to, jeśli uruchomisz aplikację wymagającą dużej ilości pamięci i monitorujesz top.

grs
źródło
1

Ta lista nie przypomina mi 274 totalprocesów. Góra zwykle wyświetla tylko to, co pasuje do twojego terminala / ekranu. Użyj ps auxzamiast tego i dodaj rsswartość (lub dowolną rezydentną kolumnę pamięci, którą wyświetla twoja wersja).

Nie chcesz również sumować wielkości pamięci wirtualnej, wygląda na to, że faktycznie interesuje Cię RESkolumna resident ( ).

Daniel Beck
źródło