Linux jvm中的交换性

Linux jvm中的交换性,linux,apache,tomcat,jvm,jvm-crash,Linux,Apache,Tomcat,Jvm,Jvm Crash,上周我偶然发现了一些有趣的问题,我注意到我们的一个生产服务器停止报告http中断,该服务器运行apache over tomcat 在进一步研究这个问题时,它似乎是由于jvm导致内存页被快速交换。这导致交换空间被完全填充,导致下一次将页移动到交换时出现内存问题 进一步调查发现,在我们的一些linux发行版中,jvm交换因子默认设置为60%。根据一些研究,对于具有高流量的web服务来说,这似乎是一个很高的价值。我们的交换空间设置为2GB 掉期详情如下: Filename

上周我偶然发现了一些有趣的问题,我注意到我们的一个生产服务器停止报告http中断,该服务器运行apache over tomcat

在进一步研究这个问题时,它似乎是由于jvm导致内存页被快速交换。这导致交换空间被完全填充,导致下一次将页移动到交换时出现内存问题

进一步调查发现,在我们的一些linux发行版中,jvm交换因子默认设置为60%。根据一些研究,对于具有高流量的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进程。因此,我尝试将交换性降低到0,但这并没有改变任何事情。我们仍然可以看到整个交换空间被占用并导致OutofMemory错误的情况


有没有人在jvm性能调优方面遇到过类似的问题

如果您的物理RAM为12GB,而堆设置为仅6gb(最大),那么您就有足够的RAM。此服务器专用于tomcat实例吗?查看详细的gc日志文件,了解随着时间的推移内存使用情况。检查访问日志文件,确认访问请求是否随时间而增加。

如果物理RAM为12GB,而堆设置为仅6gb(最大),则内存充足。此服务器专用于tomcat实例吗?查看详细的gc日志文件,了解随着时间的推移内存使用情况。检查访问日志文件,确认访问请求是否随时间而增加。

实际上是Linux中的系统范围设置,而不是特定于JVM的

我个人对某些应用程序的经验是,它们需要关闭才能正常工作。虽然我不能确定你的应用程序是否属于这一类,但我已经看到,尽管有足够的可用内存,应用程序还是被换掉了。正如您所指出的,GC和swap不能很好地混合。交换性只是操作系统的一个指标,因此它对交换量的影响可能会根据具体情况而变大或变小。我的建议是尝试完全关闭交换

为此,您需要是root用户或具有
sudo
访问权限。注释掉
/etc/fstab
中描述交换的行,这将防止重新启动后打开交换。然后,要关闭当前服务器运行的交换,请运行
swapoff-a
。如果交换中有数据需要拉回到RAM中,这可能需要几分钟的时间。然后,检查
free
输出的最后一行,以确保可用交换的总大小为0。之后,观察你的应用程序,以确定关闭交换是否解决了你的问题。

在Linux中,这实际上是一个系统范围的设置,而不是特定于JVM的

我个人对某些应用程序的经验是,它们需要关闭才能正常工作。虽然我不能确定你的应用程序是否属于这一类,但我已经看到,尽管有足够的可用内存,应用程序还是被换掉了。正如您所指出的,GC和swap不能很好地混合。交换性只是操作系统的一个指标,因此它对交换量的影响可能会根据具体情况而变大或变小。我的建议是尝试完全关闭交换


为此,您需要是root用户或具有
sudo
访问权限。注释掉
/etc/fstab
中描述交换的行,这将防止重新启动后打开交换。然后,要关闭当前服务器运行的交换,请运行
swapoff-a
。如果交换中有数据需要拉回到RAM中,这可能需要几分钟的时间。然后,检查
free
输出的最后一行,以确保可用交换的总大小为0。在此之后,观察你的应用程序,以确定关闭交换是否解决了你的问题。

你的堆大小相当大;服务器上有多少RAM?服务器上有2G RAM和2G交换?花50美元就可以得到8GWe服务器上有12G的RAM和2G的交换空间。抱歉输入错误。为什么要将这些GC调优参数添加到JVM中?你是真的需要它们,还是仅仅因为你在互联网上的某个地方找到了它们而添加它们,而且它们看起来是个好主意?对于新一代人来说,你整个堆的1/3似乎太大了。那么大的堆的默认新空间可能更像1GiB。@Keshi,你能指出一些提供“jvm交换因子设置为60%”详细信息的文档吗?你的堆大小相当大;服务器上有多少RAM?服务器上有2G RAM和2G交换?花50美元就可以得到8GWe服务器上有12G的RAM和2G的交换空间。抱歉输入错误。为什么要将这些GC调优参数添加到JVM中?你是真的需要它们,还是仅仅因为你在互联网上的某个地方找到了它们而添加它们,而且它们看起来是个好主意?对于新一代人来说,你整个堆的1/3似乎太大了。那么大的堆的默认新空间可能更像1GiB。@Keshi,你能指出一些提供“jvm交换因子设置为60%”详细信息的文档吗?是的,有很多RAM,但可能GC和交换没有很好地同步。我们将在这里查看并发布结果。谢谢,这里有很多RAM,但可能GC和交换没有很好地同步。我们将在这里查看并发布结果。谢谢Hanks Michal,是的,这是一个特定于linux的设置