
У меня есть Java-приложение, работающее на сервере Linux с выделенной физической памятью (ОЗУ) объемом 12 ГБ, где я вижу нормальное использование в течение определенного периода времени, как показано ниже.
sys> free -h
total used free shared buff/cache available
Mem: 11G 7.8G 1.6G 9.0M 2.2G 3.5G
Swap: 0B 0B 0B
Недавно при увеличении нагрузки на приложение я заметил, что оперативная память почти заполнена, а доступного пространства очень мало, из-за чего я мог столкнуться с некоторой замедленностью, но приложение все равно продолжало работать нормально.
sys> free -h
total used free shared buff/cache available
Mem: 11G 11G 134M 17M 411M 240M
Swap: 0B 0B 0B
sys> free -h
total used free shared buff/cache available
Mem: 11G 11G 145M 25M 373M 204M
Swap: 0B 0B 0B
Я ссылался наhttps://www.linuxatemyram.com/где он предложил следующий пункт.
Предупреждающие знакиреальной ситуации с нехваткой памяти, которую вы, возможно, захотите рассмотреть:
- доступная память (или «свободная + буферы/кэш») близка к нулю
- используемый своп увеличивается или колеблется.
- dmesg | grep oom-killer показывает работу OutOfMemory-killer
Из вышеперечисленного я не вижу никаких проблем OOM на уровне приложения, и своп также был отключен. так что пренебрегаем двумя пунктами. Один момент, который меня беспокоит, это доступная память меньше нуля, где мне нужно разъяснение
Вопросы:
- Если доступное значение близко к 0, приведет ли это к сбою системы?
- Означает ли это, что мне нужно обновить оперативную память, если доступной памяти становится меньше?
- На каком основании следует выделять/увеличивать объем оперативной памяти?
- Есть ли у нас какие-либо официальные рекомендации/руководства, которым необходимо следовать при распределении оперативной памяти?
решение1
Удалось получить ответ на один мой вопрос
Если доступное значение близко к 0, приведет ли это к сбою системы?
При тестировании на одном из моих серверов, где я загрузил память почти полностью, как показано ниже
sys> free -h
total used free shared buff/cache available
Mem: 11G 11G 135M 25M 187M 45M
Swap: 0B 0B 0B
Видно, что только мое приложение (которое потребляло больше памяти) было завершено функцией Out of memory killer, на которую можно сослаться в журналах ядра.
dmesg -e
[355623.918401] [21805] 553000 21805 69 21 2 0 0 rm
[355623.921381] Out of memory: Kill process 11465 (java) score 205 or sacrifice child
[355623.925379] Killed process 11465 (java), UID 553000, total-vm:6372028kB, anon-rss:2485580kB, file-rss:0kB, shmem-rss:0kB
https://www.kernel.org/doc/gorman/html/understand/understand016.html
Out Of Memory Killer или OOM Killer — это процесс, который ядро Linux использует, когда в системе критически мало памяти. Такая ситуация возникает из-за того, что ядро Linux выделяет своим процессам избыточную память. ... Это означает, что работающие процессы требуют больше памяти, чем физически доступно.