1

上周我偶然发现了一些有趣的问题,我注意到我们的一个生产服务器,它运行 Tomcat 上的Apache HTTP服务器,停止,报告 HTTP 中断。

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

进一步调查,我们的一些 Linux 发行版似乎有一个 JVM 交换因子默认设置为 60%。根据一些研究,对于具有高流量的 Web 服务来说,这似乎具有很高的价值。我们的交换空间设置为 2 GB。

交换详情如下:

 Filename                                Type            Size    Used    Priority
 /dev/sda3                               partition       2096472 1261420 -1

 From /proc/meminfo
 SwapCached:     944668 kB

我们的JVM属性如下:

-Xmx6g -Xms4g -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:PermSize=512M -XX:MaxPermSize=1024M -XX:NewSize=2g -XX:MaxNewSize=2g -XX:ParallelGCThreads=8

服务器运行 12 GB RAM。

Swappiness 不适合 JVM 的GC进程。因此,我尝试将 swappiness 降低到 0,但这并没有改变任何东西。我们仍然看到整个交换空间被消耗并导致 OutOfMemory 错误的情况。

如何调整 JVM 性能?

4

2 回答 2

1

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

我对某些应用程序的个人经验是,它们需要关闭交换才能正常工作。虽然我不能确定您的应用程序是否属于此类别,但我看到尽管有足够的可用 RAM 可用,但应用程序被换出。正如您所指出的,GC 和交换不能很好地混合。交换性只是对操作系统的一个指示,因此它对交换出多少的影响可能会更大或更小,具体取决于具体情况。我的建议是尝试完全关闭交换。

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

于 2012-06-04T13:12:17.830 回答
0

如果您的物理 RAM 为 12 GB,并且您的堆设置为仅 6 GB(最大),那么您有足够的 RAM。该服务器是否专用于 Tomcat 实例?

查看详细的 GC 日志文件,了解一段时间内的内存使用情况。检查您的访问日志文件以确认访问请求是否随时间增加。

于 2012-06-02T17:37:28.723 回答