Почему использование памяти в "top" не складывается?

Я заметил, что иногда, когда я запускаю top, использование памяти каждым процессом в таблице процессов, по-видимому, не дает общего результата.

Например, в приведенном ниже дампе top говорит, что я использую 16 Гб памяти. Однако таблица процессов показывает только два процесса, использующих чуть более 520 Мб. Как я могу узнать, что потребляет другие 15,5 Гб? (Я использую CentOS.)

$ top

вверх - 12:16:34 до 45 дней, 2:28, 3 пользователя, средняя загрузка: 0,24, 0,65, 0,71
Задачи: всего 274, 1 работает, 273 спит, 0 остановлен, 0 зомби
ЦП: 2,3% США, 0,2%sy,  0,0%ni, 97,5%id,  0,0%wa,  0,0%hi,  0,0%si,  0,0%st
Память: всего 16432032k, использовано 16340144k,    91888k свободно,    21736k буферов
Обмен: всего 18481144 КБ, использовано 1112 КБ, 18480032 КБ свободно, 15624488 Кэшировано

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+ КОМАНДА
18159 jsmith    15   0  260 м 31 м 4560 S 16,6 0,2 53: 35,64 питон
 4795 26        15   0  260 м 6608 4220 S 2,0 0,0 0: 00,06 почтмейстер
    1 корень 15 0 10344 680 568 S 0,0 0,0 0: 39,36 init
    2 корень RT  -5     0    0    0 S  0,0 0,0 0: 00,53 миграция / 0
    3 корень 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 сторожевой таймер /0
    5 root      RT  -5     0    0    0 S  0.0  0.0   0:02.09 миграция / 1
    6 корень 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 сторожевой таймер / 1
    8 корень RT  -5     0    0    0 S  0,0 0,0 0: 00,99 миграция / 2
    9 корень 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 сторожевой таймер /2
   11 root      RT  -5     0    0    0 S  0.0  0.0   0:02.16 миграция / 3
   12 корень 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 сторожевой таймер /3
   14 root      RT  -5     0    0    0 S  0,0 0,0 0: 01,94 миграция / 4
   15 корень 34 19 0 0 0 S 0,0 0,0 0: 01,78 ksoftirqd/4
   16 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 сторожевой таймер /4
   17 root      RT  -5     0    0    0 S  0.0  0.0   0:01.92 миграция / 5
   18 корень 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 сторожевой таймер /5
   20 root      RT  -5     0    0    0 S  0.0  0.0   0:02.06 миграция / 6
   21 корень 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 сторожевой таймер /6
   23 root      RT  -5     0    0    0 S  0.0  0.0   0:02.31 миграция /7
   24 корень 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 сторожевой таймер /7
   26 корень 10 -5 0 0 0 S 0,0 0,0 0: 00,42 события /0
   27 корень 10 -5 0 0 0 S 0,0 0,0 0: 00,28 события / 1
   28 корень 10 -5 0 0 0 S 0,0 0,0 0: 00,37 события / 2
   29 корень 10 -5 0 0 0 S 0,0 0,0 0: 00,21 события / 3
   30 корень 10 -5 0 0 0 S 0,0 0,0 0: 00,38 события / 4
   31 корень 10 -5 0 0 0 S 0,0 0,0 0: 00,27 события / 5
   32 корень 10 -5 0 0 0 S 0,0 0,0 0: 00,52 события / 6
   33 root 10 -5 0 0 0 S 0,0 0,0 0: 00,64 события /7
   34 корень 10 -5 0 0 0 S 0,0 0,0 0: 00,00 хелпер

2 ответа

Решение

Из строки, посвященной использованию памяти, вверху:

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

Давайте проигнорируем обмен. Общая память равна сумме использованной и свободной памяти. С другой стороны, используется сумма "реально используемых приложениями" и кешированных данных и буферов. Итак, в вашем случае это выглядит так:

  • Mem = 16432032k = 16340144k + 91888k;
  • "Действительно используется приложениями" = Используется - (кэшировано + буферы) = 16340144k - (15624488k + 21736k) = 693920k.

Остальные 15,5 ГБ кэшируются. Это улучшает производительность. Однако в тот самый момент, когда приложению требуется часть кешируемой памяти, оно сразу же отдается ему. Вы заметите это, если запустите какое-нибудь приложение и монитор, требующие памяти top,

Этот список не похож на 274 total процессы для меня. Вверху обычно отображается только то, что умещается на вашем терминале / экране. использование ps aux вместо этого и сложить rss значение (или любой другой столбец резидентной памяти, отображаемый вашей версией).

Вы также не хотите добавлять размер виртуальной памяти, кажется, вы действительно заинтересованы в резиденте (RES) столбец.

Другие вопросы по тегам