上周我偶然发现了一些有趣的问题,我注意到我们的一个生产服务器在tomcat上运行apache停止报告http中断。
在进一步调查此问题时,似乎是由于jvm导致内存页面被快速换出。这导致交换空间被完全填充,导致下次将页面移动到交换时出现内存问题。
进一步调查似乎有一个jvm交换因子默认设置为60%我们的一些Linux发行版。基于一些研究,似乎这对于具有高流量的Web服务来说可能是一个很高的价值。我们的交换空间设置为2GB。
交换详情为:
Filename Type Size Used Priority
/dev/sda3 partition 2096472 1261420 -1
From /proc/meminfo
SwapCached: 944668 kB
out jvm属性如下:
-Xmx6g -Xms4g -XX:+ UseParNewGC -XX:+ UseConcMarkSweepGC -XX:PermSize = 512M -XX:MaxPermSize = 1024M -XX:NewSize = 2g -XX:MaxNewSize = 2g -XX:ParallelGCThreads = 8
服务器使用12GB RAM运行。
使用jvm的GC进程,Swappiness效果不佳。因此,我尝试将swappiness减少到0,但这并没有改变任何东西。我们仍然会看到消耗整个交换空间并导致OutofMemory错误的情况。
有没有人遇到类似的jvm性能调优问题?
答案 0 :(得分:1)
swappiness factor实际上是Linux中的系统范围设置,而不是特定于JVM的设置。
我对某些应用程序的个人经验是,他们需要关闭交换才能在没有打嗝的情况下工作。虽然我无法确定您的应用程序是否属于此类别,但我已经看到应用程序被换出,尽管有足够的可用RAM。正如您所指出的,GC和交换不能很好地混合。 Swappiness只是操作系统的一个指示,因此根据情况,它对交换多少的影响可能更大或更小。我的建议是尝试完全关闭掉掉。
要执行此操作,您需要是root用户或具有sudo
访问权限。注释掉/etc/fstab
中描述交换的行,这将阻止重启后打开交换。然后,为了关闭当前服务器运行的交换,请运行swapoff -a
。如果交换中的数据需要被拉回RAM,则可能需要几分钟。然后,检查free
输出的最后一行,确保可用交换的总大小为0.在此之后,请观察您的应用,以确定关闭交换是否解决了您的问题。
答案 1 :(得分:0)
如果你的物理内存是12GB而你的堆只设置为6GB(最大),那么你有足够的内存。这个服务器是专用于tomcat实例的吗?查看详细的gc日志文件,了解内存使用情况。检查访问日志文件以确认访问请求是否随着时间的推移而增加。