- How do I find which process is leaking memory? [closed]
- 7 Answers 7
- Как в Linux узнать, какой процесс использует всю оперативную память (RAM)?
- Как узнать, сколько свободной памяти в Linux
- Как просмотреть, какая программа потребляет больше всего оперативной памяти в top
- Как найти программы, которые используют больше всего памяти в ps
- Невозможно найти, через какой процесс утекает оперативная память — сумма памяти процессов меньше общей используемой памяти
- Связанные статьи:
- Как понять на что расходуется память в linux?
How do I find which process is leaking memory? [closed]
I have a system (Ubuntu) with many processes and one (or more) have a memory leak. Is there a good way to find the process that has the leak? Some of the process are JVMs, some are not. Some are home grown some are open source.
7 Answers 7
You can run the top command (to run non-interactively, type top -b -n 1 ). To see applications which are leaking memory, look at the following columns:
- RPRVT — resident private address space size
- RSHRD — resident shared address space size
- RSIZE — resident memory size
- VPRVT — private address space size
- VSIZE — total memory size
I was trying this but whatever command line arguments I pass to top it does not give an output that has this information. I get sth like ` PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND ` . Any suggestions how to get the required output?
if the program leaks over a long time, top might not be practical. I would write a simple shell scripts that appends the result of «ps aux» to a file every X seconds, depending on how long it takes to leak significant amounts of memory. Something like:
while true do echo "---------------------------------" >> /tmp/mem_usage date >> /tmp/mem_usage ps aux >> /tmp/mem_usage sleep 60 done
I suggest the use of htop, as a better alternative to top.
In addition to top, you can use System Monitor (System — Administration — System Monitor, then select Processes tab). Select View — All Processes, go to Edit — Preferences and enable Virtual Memory column. Sort either by this column, or by Memory column
If you can’t do it deductively, consider the Signal Flare debugging pattern: Increase the amount of memory allocated by one process by a factor of ten. Then run your program.
If the amount of the memory leaked is the same, that process was not the source of the leak; restore the process and make the same modification to the next process.
When you hit the process that is responsible, you’ll see the size of your memory leak jump (the «signal flare»). You can narrow it down still further by selectively increasing the allocation size of separate statements within this process.
Как в Linux узнать, какой процесс использует всю оперативную память (RAM)?
Если в операционной системе заканчивается свободная оперативная память, то это очень сильно влияет на её производительность. Система начинает работать заметно медленнее, уменьшается её «отзывчивость», происходит более долгое переключение между окнами, новые процессы не запускаются или запускаются очень медленно. По этой причине, если какой-то процесс расходует слишком много оперативной памяти или тем более всю свободную оперативную память, не оставляя ресурсов для остальной системы, то необходимо его выявить и принять меры для оптимизации.
Как узнать, сколько свободной памяти в Linux
Начнём с того, что убедимся, что дело действительно в нехватке оперативной памяти, а не в том что, например, центральный процессор слишком загружен. Для этого выполним очень простую команду:
Вы увидите примерно следующее:
- Mem — физическая оперативная память
- Swap — раздел подкачки (если недостаёт оперативной памяти, то система сбрасывает временно неиспользуемые данные на физический диск, а потом по мере необходимости вновь загружает их в оперативную память. С одной стороны, это позволяет продолжить работу в условиях нехватки оперативной памяти, но с другой — система начинает работать заметно медленнее, поскольку физический диск всегда медленнее ОЗУ, плюс нужно время для записи на диск и считывание с диска)
- total — общее количество
- used — используемая в данный момент память (вычисляется как total — free — buffers — cache)
- free — неиспользуемая память
- shared — память, используемая (преимущественно) в tmpfs
- buff — память, используемая буферами ядра
- cache — память, используемая страницами cache и slabs
- buff/cache — сумма буферов и кэша
- available — примерное количество оперативной памяти, доступное для запуска новых приложений без использования ими раздела подкачки. В отличие от поля free, это поле принимает в расчёт страницу cache и также то, что не вся рекуперируемая (пригодная для повторного использования) память будет возвращена для рекуперации из-за того, что элементы используются в данный момент
Итак, если значение поля free, а в особенности поля available очень мало или равно нулю, значит нужно принимать меры, иначе рабочая станция или сервер будут работать крайне медленно либо могут полностью зависнуть.
Как просмотреть, какая программа потребляет больше всего оперативной памяти в top
Очень подробно о команде top, в том числе подсказки и интересные трюки описаны в статье «Как пользоваться командой top для наблюдения за процессами в Linux» — крайне рекомендуется ознакомиться.
По умолчанию программа top сортирует процессы по их нагрузке на центральный процессор. Чтобы посмотреть, по какому полю выполняется сортировка, нажмите клавишу x:
По умолчанию в top отображаются следующие виды памяти:
- VIRT — общее количество используемой задачей виртуальной памяти, включает все коды, данные, совместные библиотеки, плюс страницы, которые были перенесены в раздел подкачки, и страницы, которые были размечены, но не используются
- RES — используемая оперативная память, является подмножеством VIRT, представляет физическую память, не помещённую в раздел подкачки, которую в текущий момент использует задача. Также является суммой полей RSan, RSfd и Rssh.
- SHR — размер совместной памяти, подмножество используемой памяти RES, которая может использоваться другими процессами
- %MEM — доля задачи в использовании памяти (RES)
Для переключения между полями сортировки, используйте < и >. Обратите внимание, что это не курсорные клавиши, а разновидность скобок, для их использования переключитесь на английскую раскладку клавиатуры и нажимайте эти кнопки с зажатой клавишей Shift.
Пример сортировки по %MEM:
Сортировка по VIRT:
Как найти программы, которые используют больше всего памяти в ps
С помощью утилиты ps также можно составить список, отсортированный по количеству потребляемой памяти, для этого выполните:
ps -e -o pid,vsz,comm= | sort -n -k 2
Самые «прожорливые» процессы будут внизу:
Первый столбец — это PID процесса, затем идёт виртуальная память процесса в килобайтах, затем название программы.
Ещё одна элегантная команда с использованием ps:
Невозможно найти, через какой процесс утекает оперативная память — сумма памяти процессов меньше общей используемой памяти
В некоторых версиях ядер Linux присутствовала проблема утечки памяти на уровне ядра, поэтому нет никакой возможности обнаружить её инструментами пользовательского пространства. Пример такого ядра — 3.13.
Причём некоторые ядра допускают утечку памяти только в определённых условиях (пример: Linux Mint 17 при использовании btrfs).
Самым лучшим вариантом в этом случае является обновление ядра и системы в целом до новой версии.
Связанные статьи:
Как понять на что расходуется память в linux?
Есть процесс, который по данным top потребляет 13,5% оперативной памяти. Однако по данным free используется памяти — 67,2%. Как понять куда ушла остальная память?
Пытался исследовать проблему при помощи таких инструментов как /proc/meminfo, /proc/PID/status, free, top, smem.
Что мы имеем: занятую процессами память считаю по данным из /proc/meminfo по формуле MemTotal-Free-Cached-Buffers-Slab, получается та же величина, что показывает free в строке used, где-то 67,2% в отношении к MemTotal, при этом эта величина увеличивается со временем, память «течёт», но я не могу понять где именно течёт: в каком-то процессе или в ядре.
Если исследовать процессы, то вот top мне показывает 3 столбца: VIRT, RSS и SHR, память каждого процесса состоит из RSS и SHR, но поскольку SHR — это разделяемая память, используемая одновременно несколькими процессами, то суммировать эти столбцы нельзя. Тогда я вместо top использовал smem, который вычисляет такую величину как PSS — пропорциональная память, которую уже можно суммировать, также smem умеет вычислять сумму всех процессов в процентах, так вот он мне показал — 16,2% в то время как free говорит, что занято 67,2, вопрос — куда ушли оставшиеся 51%?
Простой 5 комментариев
можно поковыряться в /proc/(pid)/smaps если я верно понимаю, можно перебрать каждый регион памяти который под что выделен, там подписано — под загружаемый модуль или кеш кучу стек и прочее но не уверен что там тоже будет корректные результаты
Я бы порекомендовал установить atop. С ее помощью можно посмотреть на историю процессов и потребления памяти.
ps axo rss,comm,pid | awk ' < proc_list[$2] += $1; >END < for (proc in proc_list) < printf("%d\t%s\n", proc_list[proc],proc); >>' | sort -n | tail -n 10 | sort -rn | awk ''
— free -m
— top -b -o +%MEM | head -n 25
$ free -m total used free shared buff/cache available Mem: 32164 22984 240 362 8938 8358 Swap: 4050 15 4035 $ top -b -o +%MEM | head -n 25 top - 14:34:30 up 109 days, 4:18, 2 users, load average: 12.31, 13.12, 13.33 Tasks: 346 total, 1 running, 345 sleeping, 0 stopped, 0 zombie %Cpu(s): 34.7 us, 9.2 sy, 0.0 ni, 49.4 id, 3.5 wa, 0.0 hi, 3.2 si, 0.0 st KiB Mem : 32936080 total, 217976 free, 23488012 used, 9230092 buff/cache KiB Swap: 4148200 total, 4132076 free, 16124 used. 8608416 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 55748 root 20 0 10.587g 4.142g 2088 S 1089 13.2 902215:22 ###### 20557 netdata 20 0 1132232 940108 2288 S 0.0 2.9 10:19.78 netdata 907 root 20 0 181300 102980 102764 S 0.0 0.3 877:33.63 systemd-journal 55972 root 20 0 5278616 32356 2236 S 0.0 0.1 120:24.22 ######-thumb 20588 netdata 20 0 105312 18996 3020 S 0.0 0.1 22:23.85 python.d.plugin 2089 root 20 0 304460 17156 11084 S 0.0 0.1 3:40.65 apache2 33372 www-data 20 0 304484 6944 864 S 0.0 0.0 0:00.00 apache2 33373 www-data 20 0 304484 6944 864 S 0.0 0.0 0:00.00 apache2 33375 www-data 20 0 304484 6944 864 S 0.0 0.0 0:00.00 apache2 33376 www-data 20 0 304484 6944 864 S 0.0 0.0 0:00.00 apache2 33377 www-data 20 0 304484 6944 864 S 0.0 0.0 0:00.00 apache2 59503 netdata 20 0 18160 4832 1700 S 0.0 0.0 3:14.73 apps.plugin 1 root 20 0 204796 4496 3040 S 0.0 0.0 700:26.02 systemd 14924 iskatel 20 0 21036 4484 2820 S 0.0 0.0 0:00.65 bash 32077 iskatel 20 0 64980 3880 2876 S 0.0 0.0 3:57.64 systemd 6515 iskatel 20 0 45036 3644 2912 R 11.1 0.0 0:00.03 top 7520 iskatel 20 0 20952 3528 1952 S 0.0 0.0 0:00.16 bash 1443 netdata 20 0 18212 3012 2532 S 0.0 0.0 0:00.69 bash
Очевидно, что память «течет» в процессе ######, который сожрал 11Гб, хотя фактически использует только 4Гб. Т.к. swap не используется, значит вся эта память выделена в ОЗУ, выделена, но не используется.
не сожрал, а лишь затребовал у ОС.
Течет ли — неизвестно. Надо смотреть на динамику потребления памяти.
Роман Мирр, сожрал, сожрал, не затребовал у ОС, а ОС ему уже выделила эту память. Автор писал про динамику, что память именно «течет».