Как понять на что расходуется память в linux?
Есть процесс, который по данным top потребляет 13,3% оперативной памяти. Однако по данным free используется памяти - 87,1%. Как понять куда ушла остальная память?
Ниже скриншот вывода top с сортировкой по RES, на котором видно, что процесс flussonic потребляет 13,3%, потребление памяти всеми остальными процессами - незначительное и не может влиять на значение Used, также я на всякий случай сделал в top сортировку по VIRT и обнаружил ещё один процесс, запрашивающий большие объёмы виртуальной памяти - Flussonic-thumb, но резидентная память у него всего 0,1%
Дополнение. Чтобы не возникал вопрос "как сопоставить отображаемую разными утилитами информацию про использование памяти", при дальнейшем исследовании проблемы я решил не использовать утилиты free, top и smem, а информацию получал из /proc, для процессов flussonic и flussonic-thumbnailer я получал данные об используемой резидентной и виртуальной памяти из /proc/"$PID"/status, данные получались каждые 5 минут и по ним строился график.
Сейчас, спустя месяц дополняю вопрос. По графику видно, что есть некая внутидневная динамика, используемая резидентная память процесса flussonic в зависимости от дневной нагрузки сервера колеблется от 3.5 до 5 Гбайт, но на более долгих временных прмежутках видно что ухода за эти пределы нет. А вот значение Used, которое вычислялось из данных в /proc за это же время увеличилось с 24 до 28 Гбайт, а если взять график за 3 месяца, то видно, что Used увеличилось с 12 до 28 Гбайт, память "течёт", причём графики процессов flussonic и flussonic-thumbnailer доказывают, что текут вовсе не самые нагруженные процессы, тогда что течёт, ядро? Как решить эту задачу?
Ответы (3 шт):
Простой, но не точный вариант - ставите htop и смотрите на соответствующие столбики

Зеленое - то что слопали программы.
Желтое - кэш файловой системы.
Синее - разного рода буферы ядра.
На долго работающей машине, как правило, кэш съедает всю свободную память, но это не страшно - если памяти не хватает, он просто сбрасывается на диск.
$ free -h
total used free shared buff/cache available
Mem: 3,7Gi 2,0Gi 430Mi 180Mi 1,3Gi 1,2Gi
Swap: 3,9Gi 786Mi 3,1Gi
buff/cache отображается желтым в htop и может быть освобожден как только понадобится. Не паникуйте - это нормально
grep -HP "VmRSS:[ \t]+[1-9]" /proc/[0-9]*/status 2>/dev/null |\
sed -r 's/\/proc\/(.*)\/status:VmRSS:[ \t]+([^\t ]+)[ \t]+([a-zA-Z]+)/printf "%-10s | %-20s | %s\n" "PID: \1" "size: \2\3" "command: `cat \/proc\/\1\/cmdline 2>\/dev\/null`"/g' |\
/bin/bash | sort -t':' -k '3,3' -nr | more
Достаточно "дурацкая" и длинная команда, которая выведет сортированную информацию по утилизации памяти. Некий аналог top или htop что делает ее написание не особо целесообразным.
По логике, для каждого процесса мы проверяем поле VMRSS, где указана физическая величина используемого ОЗУ пространства, без записи в виртуальное хранилище и далее форматируем, сортируем.
Вывод будет выглядеть следующим образом:
PID: 17642 | size: 78784kB | command: fb_inet_server
PID: 10231 | size: 73256kB | command: fb_inet_server
PID: 4311 | size: 69968kB | command: fb_inet_server
PID: 22499 | size: 69940kB | command: fb_inet_server
PID: 1843 | size: 43508kB | command: //usr/local/tander/bin/_python2.5...
PID: 2363 | size: 33548kB | command: /usr/local/tander/i586-pc-linux-gnu/usr/bin/uwsgi...
PID: 30211 | size: 29864kB | command: fb_inet_server
PID: 5423 | size: 28456kB | command: fb_inet_server







