Ubuntu 16.04 交换空间已满,从未释放

Ubuntu 16.04 交换空间已满,从未释放

在大约一周左右的时间里,我们的 Ubuntu 16.04 服务器的交换空间被填满并且从未释放,导致服务器上出现其他级联问题。也就是说,运行 Solr 的 Tomcat 实例会定期失败。

服务器是一个四核虚拟机,带有16gRAM 和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/

相关内容