Ситуация:
Была запущена opera, которая жрёт 6 гигов, + была запущена игруля. В результате система вытеснила Оперу и всё ненужное в своп. Теперь закрываем игрулю, а затем закрываем Оперу.
Остаётся вот такая картина:
vadim@aquila:~$ free -m
total used free shared buff/cache available
Mem: 15906 1647 13367 711 1915 14259
Swap: 8191 4887 3304
Как видно, занято 4887 метров в свопе. Я уже знаю, что это течёт моя программа, но суть тут в том, что смотрим как работает учёт потребления памяти. Вырубаем своп:
vadim@aquila:~$ sudo swapoff -a
[sudo] пароль для vadim:
vadim@aquila:~$ free -m
total used free shared buff/cache available
Mem: 15906 6511 8494 5139 6351 9395
Swap: 0 0 0
Теперь вся утёкшая память загружена из свопа обратно в ОЗУ. И она, внезапно, в секции shared. И при этом она же — в секции «buff/cache»! А вот это неожиданно.
Смотрим разницу показателей, цифры бьются логично:
buff/cache 6351 - 1915 = 4436
shared 5139 - 711 = 4428
used 6511 - 1647 = 4864
swap used 0 - 4887 = -4887
Теперь смотрим htop:
И как видно, в htop нет большого объёма «buff/cache». Он понимает, что «buff/cache» и shared дублируют друг друга.
И также видно, что утёкшая память не отображается ни в RESIDENT, ни в SHARED, ни даже в VIRTUAL ни одного процесса. Она есть, она учитывается системой как занятая, но её нет в счётчиках показателей потребления памяти процессов.
Теперь убиваем виновника:
vadim@aquila:~$ killall stuurman-desktop
vadim@aquila:~$ free -m
total used free shared buff/cache available
Mem: 15906 1782 13214 442 1663 14124
Swap: 0 0 0
Смотрим разницу показателей, вот столько памяти у нас освободилось:
buff/cache 6351 - 1663 = 4688
shared 5139 - 442 = 4697
used 6511 - 1782 = 4729
Итак, пока только один вывод:
- Реальное потребление памяти процессом может быть никак не связано с числами, которые htop показывает для процесса.
И остались открытые вопросы:
- Что именно показывает
free
и что именно показываетhtop
для общесистемных показателей. Придётся заглянуть в код, чтобы узнать точно. - Как при таких условиях искать источник большого потребления ОЗУ в случае, если у нас нет возможности убивать все подозреваемые процессы подряд.
- А, ну и чуть не забыл. Надо всё-таки найти и исправить утечку в моём коде… когда-нибудь уже.