Ubuntu 18.04. 2 ГБ ОЗУ + 512 МБ подкачки.
При запуске clamav он потребляет более 800 МБ памяти, потому что загружает все подписи в память. Из-за этого я настроил его запускать каждый день в 3 часа ночи, а не постоянно.
Пока что кот и кламав очень хорошо ладили. Прошлой ночью, в 3 часа ночи, служба tomcat была закрыта, когда clamav начал работать.
[4643256.375812] OOM killed process 8145 (clamscan) total-vm:1149268kB, anon-rss:969476kB, file-rss:4kB
[7667218.452649] OOM killed process 8865 (java) total-vm:4568248kB, anon-rss:1067312kB, file-rss:0kB
Mar 26 03:00:31 user systemd[1]: tomcat.service: Main process exited, code=killed, status=9/KILL
Mar 26 03:00:31 user systemd[1]: tomcat.service: Failed with result 'signal'.
Mar 26 03:17:08 user systemd[1]: Reloading The Apache HTTP Server.
Mar 26 03:17:08 user systemd[1]: Reloaded The Apache HTTP Server.
Я знаю, что обновление - это немедленный ответ, но до тех пор мои вопросы таковы:
Есть ли способ запустить clamav, не потребляя 800+ мб?
Есть ли способ автоматически перезапустить tomcat, если что-то подобное произойдет снова?
Действительно ли Java заняла 4568 248 КБ = 4,5 ГБ или я что-то упустил?
редактировать внутри файла tomcat.service у меня есть следующее:
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom -Djava.awt.headless=true"
Java не использовала 4,5 ГиБ физической памяти, эта цифра относится к виртуальной памяти. У вас есть около 128 ТиБ адресного пространства виртуальной памяти (см. этот ответ) и используется для доступа к физической памяти, а также к файлам, как если бы они были в памяти. Большая часть выделенного виртуального пространства не использует физическую память и содержит только 0
s или указывает на данные на жестких дисках.
Что вас интересует, так это анон-rss число: это физическая память, используемая процессом, в основном для личного использования, а не просто кеш / копия файла (в отличие от файл-rss). Ядро не может просто удалить эту память, и вы получите OOM.
В ответ Янне на ваш предыдущий вопрос указывает на решение вашей проблемы:
Вам следует настроить параметры памяти Tomcat, что можно сделать, добавив параметры в переменную JAVA_OPTS
в /etc/default/tomcat9
. Наиболее часто используются -Xms
(минимальный размер кучи) и -Xmx
(максимальный размер кучи). Например. ты можешь использовать:
JAVA_OPTS="-Djava.awt.headless=true -Xms256m -Xmx1024m"
JVM будет использовать от 256 до 1024 МБ кучи (плюс другие виды памяти Java) и мощь верните часть его, когда он не используется.
Ваш объем подкачки довольно невелик, особенно если у вас мало оперативной памяти. Увеличьте его примерно до 4 ГиБ (ср. Эта статья), чтобы ядро могло поменять местами часть памяти вместо того, чтобы убивать Tomcat.
Чтобы настроить автоматический перезапуск Tomcat после сбоя, отредактируйте tomcat.service
файл:
systemctl edit --full tomcat.service
и добавить к [Service]
раздел, например:
RestartSec=5s
Restart=on-failure
Вы можете найти возможные значения для Restart
в Документация по SystemD.