У меня тяжелое приложение, работающее на сервере CentOS, и я наблюдаю странное поведение памяти. Вот снимок графика Мунина:
Как видите, объем выделенной памяти постепенно увеличивается, что приводит к использованию файла подкачки. Что мне кажется странным, так это то, что количество неактивной памяти также продолжает расти. Насколько я понимаю, неактивная память - это фактически память, освобожденная, но еще не очищенная ОС и возвращенная в пул свободной памяти. Кажется, что нехватка памяти на самом деле вызвана отсутствием очистки, но я могу ошибаться.
Можете ли вы дать несколько советов, чтобы найти причину проблемы и / или заставить CentOS освободить неактивную память?
Спасибо.
Дополнительная информация:
1) У меня есть tmpfs, смонтированный на / tmp, и количество хранящихся там файлов растет (но это вдвое больше неактивной памяти).
2) cat / proc / meminfo (на более поздней стадии, чем изображение) дает:
MemTotal: 14371428 kB
MemFree: 1207108 kB
Buffers: 35440 kB
Cached: 4276628 kB
SwapCached: 785316 kB
Active: 9038924 kB
Inactive: 3902876 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 14371428 kB
LowFree: 1207108 kB
SwapTotal: 10223608 kB
SwapFree: 6438320 kB
Dirty: 627792 kB
Writeback: 0 kB
AnonPages: 7844560 kB
Mapped: 49304 kB
Slab: 146676 kB
PageTables: 27480 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 17409320 kB
Committed_AS: 16471488 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 275852 kB
VmallocChunk: 34359462007 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
Hugepagesize: 2048 kB
3) Приложение представляет собой комбинацию MySQL, Heritrix (http://crawler.archive.org/ ) и сервлет Java на основе Tomcat для управления вещами.
Насколько я понимаю, неактивная память - это фактически память, освобожденная, но еще не очищенная ОС и возвращенная в пул свободной памяти.
Это неправда. «Неактивная» память - это активно отображаемая память, которая некоторое время не использовалась ни одним приложением. Когда пришло время поменять местами, память берется со страниц, отмеченных таким образом, и выгружается. Его также можно использовать для замены в пользу кеша страниц.
Как видите, объем выделенной памяти постепенно увеличивается, что приводит к использованию файла подкачки. Что мне кажется странным, так это то, что количество неактивной памяти также продолжает расти.
Эти два понятия не обязательно коррелируют, но для меня это сильно похоже на утечку памяти. Тот факт, что у вас есть страницы, к которым не обращаются никакие приложения, и рост подкачки также предполагает, что что-то выделяет память, забывая об этом, а затем не освобождая ее.
Память может быть «неактивной», например, при вызове malloc (). Это вызов libc, который может выделить часть памяти, но на самом деле для выполнения какой-либо работы используется только ее часть (в любом случае меньше выделенных страниц). Даже если вы освобождаете память в malloc, это на самом деле не означает, что вы освобождаете память, запрашивая это у операционной системы, ее только таблицы mallocs могут пометить как «повторно используемые», а затем освободить ее.
что это за приложение и есть ли в нем утечка памяти? то есть, если ваше приложение завершается, возвращается ли память в операционную систему?
Если у вашего приложения утечка памяти, вам нужно использовать что-то вроде электрического забора, чтобы найти эти проблемы и исправить их.
На чем написано ваше приложение? вам нужно использовать правильный отладчик для языка, на котором он написан.
Я очень сомневаюсь, что в операционной системе происходит утечка памяти, если ваше приложение не использует много ресурсов и не освобождает их правильно.
Кроме того, ваша диаграмма памяти очень загружена и очень трудна для понимания, там около 20 цветов, это примерно так же ясно, как грязь.
Как вы думаете, у вас проблема с оперативным диском? он, вероятно, расширяется для удовлетворения спроса, но не сокращается при необходимости.