Назад | Перейти на главную страницу

ubuntu 18.04: clamav работает, кот умирает

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.

Я знаю, что обновление - это немедленный ответ, но до тех пор мои вопросы таковы:

  1. Есть ли способ запустить clamav, не потребляя 800+ мб?

  2. Есть ли способ автоматически перезапустить tomcat, если что-то подобное произойдет снова?

  3. Действительно ли 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 ТиБ адресного пространства виртуальной памяти (см. этот ответ) и используется для доступа к физической памяти, а также к файлам, как если бы они были в памяти. Большая часть выделенного виртуального пространства не использует физическую память и содержит только 0s или указывает на данные на жестких дисках.

Что вас интересует, так это анон-rss число: это физическая память, используемая процессом, в основном для личного использования, а не просто кеш / копия файла (в отличие от файл-rss). Ядро не может просто удалить эту память, и вы получите OOM.

В ответ Янне на ваш предыдущий вопрос указывает на решение вашей проблемы:

  1. Вам следует настроить параметры памяти Tomcat, что можно сделать, добавив параметры в переменную JAVA_OPTS в /etc/default/tomcat9. Наиболее часто используются -Xms (минимальный размер кучи) и -Xmx (максимальный размер кучи). Например. ты можешь использовать:

    JAVA_OPTS="-Djava.awt.headless=true -Xms256m -Xmx1024m"
    

    JVM будет использовать от 256 до 1024 МБ кучи (плюс другие виды памяти Java) и мощь верните часть его, когда он не используется.

  2. Ваш объем подкачки довольно невелик, особенно если у вас мало оперативной памяти. Увеличьте его примерно до 4 ГиБ (ср. Эта статья), чтобы ядро ​​могло поменять местами часть памяти вместо того, чтобы убивать Tomcat.

  3. Чтобы настроить автоматический перезапуск Tomcat после сбоя, отредактируйте tomcat.service файл:

    systemctl edit --full tomcat.service
    

    и добавить к [Service] раздел, например:

    RestartSec=5s
    Restart=on-failure
    

    Вы можете найти возможные значения для Restart в Документация по SystemD.