ubuntu 18.04:clamav 正在运行,tomcat 正在死亡

ubuntu 18.04:clamav 正在运行,tomcat 正在死亡

Ubuntu 18.04。2Gb RAM + 512mb 交换。

运行 clamav 时,它会消耗 800+mb 的内存,因为它会将所有签名加载到内存中。因此,我将其设置为每天凌晨 3 点运行,而不是持续运行。

到目前为止,tomcat 和 clamav 配合得很好。昨晚凌晨 3 点,当 clamav 开始工作时,tomcat 服务被关闭了。

[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+mb?

  2. 如果再次发生类似的事情,有没有办法自动重新启动 tomcat?

  3. Java 真的占用了 4,568,248kB = 4.5gb 吗,还是我遗漏了什么?

编辑 在 tomcat.service 文件中我有以下内容:

Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom -Djava.awt.headless=true"

答案1

Java 没有使用 4.5 GiB 的物理内存,该数字指的是虚拟内存。您有大约 128 TiB 的虚拟内存地址空间(参见这个答案),它不仅用于访问物理内存,还用于访问文件,就像它们在内存中一样。大多数分配的虚拟空间不使用任何物理内存,只包含0或指向硬盘上存在的数据。

您感兴趣的是匿名-rss数字:它是进程使用的物理内存,主要用于私人用途,而不仅仅是文件的缓存/副本(与文件-rss)内核不能直接删除这部分内存,否则会导致 OOM。

Janne 的回答您之前的问题为您指出了问题的解决方案:

  1. 您应该调整 Tomcat 的内存设置,这可以通过JAVA_OPTS向 中的变量添加选项来完成/etc/default/tomcat9。最常用的是-Xms(最小堆大小)和-Xmx(最大堆大小)。例如,您可以使用:

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

    JVM 将使用 256 MiB 到 1024 MiB 的堆空间(加上其他类型的 Java 内存),并且可能当不使用时,返还一些。

  2. 您的交换空间非常小,特别是如果您没有很多 RAM。将其扩展到大约 4 GiB(参见本文) 以便内核可以交换一些内存而不是杀死 Tomcat。

  3. 要配置 Tomcat 在故障后自动重启,请编辑该tomcat.service文件:

    systemctl edit --full tomcat.service
    

    并添加到[Service]部分,例如:

    RestartSec=5s
    Restart=on-failure
    

    Restart您可以在中找到SystemD 文档

相关内容