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.
我知道升级是一个直接的答案,但在那之前,我的问题是:
有没有办法在不消耗 800+mb 的情况下运行 clamav?
如果类似的事情再次发生,有没有办法自动重启tomcat?
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"
Java 没有使用 4.5 GiB 的物理内存,这个数字是指虚拟内存。您有大约 128 TiB 的虚拟内存地址空间(参见此答案),它用于访问物理内存,也用于访问文件,就好像它们在内存中一样。大多数分配的虚拟空间不使用任何物理内存,并且仅包含
0
s 或指向存在于硬盘驱动器上的数据。您感兴趣的是anon-rss编号:它是进程使用的物理内存,主要用于私人用途,而不仅仅是文件的缓存/副本(与file-rss不同)。内核不能只是删除这个内存,你会得到一个 OOM。
Janne对您之前的问题的回答指出了您的问题的解决方案:
您应该调整 Tomcat 的内存设置,这可以通过将选项添加
JAVA_OPTS
到/etc/default/tomcat9
. 最常用的是-Xms
(最小堆大小)和-Xmx
(最大堆大小)。例如,您可以使用:JVM 将使用 256 MiB 到 1024 MiB 的堆空间(加上其他类型的 Java 内存),并且可能会在不使用时将其中的一部分归还。
您的交换量非常小,尤其是在您没有大量 RAM 的情况下。将其扩展到大约 4 GiB(参见本文),以便内核可以交换一些内存而不是杀死 Tomcat。
要配置失败后自动重启 Tomcat,请编辑该
tomcat.service
文件:并添加到该
[Service]
部分,例如:Restart
您可以在SystemD 文档中找到可能的值。