在大约一周左右的时间里,我们的 Ubuntu 16.04 服务器的交换空间被填满并且从未释放,导致服务器上出现其他级联问题。也就是说,运行 Solr 的 Tomcat 实例会定期失败。
服务器是一个四核虚拟机,带有16g
RAM 和16g
交换区。目前swappiness
的值为60
.
我们相当努力地运行该服务器,对本地服务器进行大量内部 HTTP 调用以进行图像处理等,其中大部分是通过 Apache 进行的。由于我们一直遇到交换空间慢慢填满且无法释放的问题,因此我们对其他区域进行了精简,但没有明显效果。重新启动可以解决问题,直到它恢复正常。
我可以附上掉期下降的图表数字,但不确定这会有多大帮助(一直在使用 nmon 进行跟踪)。例如,昨天重新启动后,我们的free -m
输出是:
total used free shared buff/cache available
Mem: 16047 4888 7621 32 3536 10729
Swap: 16380 0 16380
可以看出,0
用于交换。但是,一旦系统陷入困境(原因尚未确定),它就永远不会真正恢复,并且会出现如下下降:
向前跳几天,直到下午 1:30 左右触底:
有什么建议么?或有关如何继续调查的建议?
更新问题
根据评论中的一些反馈,稍微更新一下问题。
似乎不是 Tomcat 的堆大小,我们当前 Tomcat 的 JVM 设置是JAVA_OPTS=' -Xms4096m -Xmx4096m'
,我们已经大幅提高了该大小(通常运行在 2g 左右)。汤姆猫catalina.out
告诉我们Native memory allocation (mmap) failed to map 2863661056 bytes for committing reserved memory.
答案1
这看起来像是内存泄漏,可能是在 solr 中,或者您错误配置了 JVM 参数。我想,因为这是一个虚拟机,所以它只运行 solr。
您可能想要检查与内存相关的 JVM 参数。
-Xms
-Xmx
请注意,-Xmx
指定最大堆大小。
您还可以配置 JVM 以在 OOME 上创建堆转储,通过添加"-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/some/path/filename"
到 JVM 参数来完成此操作。该文件会很大,因此您可能需要磁盘空间,至少 32Gb!
一旦你知道了,你应该可以看到泄漏发生在哪里。
更新:由于这似乎不是 JVM,因此我们需要查看所有进程:
运行这个,它会告诉你哪些进程正在使用最多的交换空间:
for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r
取自https://www.cyberciti.biz/faq/linux-which-process-is-using-swap/