
Я использую сервер Linux, на котором наблюдаются странные закономерности в использовании памяти, которые я пытаюсь исследовать.
По данным munin, при нормальной работе приложения используют около 200 МБ памяти, но время от времени (возможно, раз в пару дней) наблюдается внезапное увеличение примерно на 1 ГБ, как показано на этом графике:
Я пытался найти причину этого, но не уверен, что это может быть. Тот факт, что munin приписывает эту память «приложениям», говорит мне, что один из запущенных процессов просто использует много памяти, но просмотр top, когда это происходит, показывает, что ни один из процессов не использует даже близко столько памяти; на самом деле, 15 самых потребляющих память процессов вообще не меняются, когда это происходит, а самый верхний использует только 2,2% памяти. Кроме того, информация о памяти от ps не дает такого большого объема памяти, а скорее что-то около 200 МБ.
Высота прироста обычно одинакова, и, как видно в этом примере, он просто исчезает через несколько часов.
Я обнаружил, что надежный способ вызвать такое поведение — загрузить большой файл (1,4 ГБ) с помощью wget через туннель SSH по сети на локальный диск (одна только сетевая активность не вызывает этого).
Чтобы увидеть использование памяти более подробно, я начал регистрировать данные /proc/meminfo
каждые 10 секунд и сделалtarball с графиками из этих данных. Загрузка, вызывающая рассматриваемое поведение, началась в 10:35:32 и была завершена в 10:38:53. Исходные данные журнала также включены в tarball.
В /proc/meminfo
нет значения, которое достаточно выросло бы, чтобы объяснить это огромное уменьшение свободной памяти (это, по сути, то, что munin приписывает «приложениям»), что оставляет меня в неведении. Объем используемой памяти, о котором сообщает munin, также сообщается free и top, но в списке процессов нет процессов, которые могли бы объяснить такое высокое использование памяти или внезапное увеличение при загрузке файла.
Я пытаюсь понять следующее:
- Нормально ли, что использование памяти происходит таким образом без какого-либо конкретного процесса, использующего увеличенный объем памяти?
- Какие еще источники памяти могут быть, не учтенные в
/proc/meminfo
?
Или это может быть признаком взлома системы?
решение1
munin отлично подходит для построения графиков, но он не сообщает, какое приложение вызвало нагрузку.
Можно использовать atop - advanced top.
поверх записей сохраняется необработанный файл журнала, а затем можно открыть такой файл и интерактивно перемещаться вперед и назад во времени, а также видеть, что происходило в определенный момент.
ator -r /var/log/atop_oame_date
чем с помощью клавиш t
и T
вы можете вернуться к моменту подозрительной активности и посмотреть, что там происходило.
решение2
Ваша система не испытывает физического давления памяти. Поэтому, когда вы пытаетесь передать файл размером 1,4 ГБ, он использует 1,4 ГБ памяти. У вашей системы есть два варианта: она может либо полностью тратить память, либо использовать ее неэффективно. Она выбирает последнее. Это нормальное поведение.