内存缓存过高,将使用交换空间

内存缓存过高,将使用交换空间

我有一台具有 32 g RAM 的 centos 服务器,其状态为 (free -m):

              total       used       free     shared    buffers     cached
 Mem:         32071      31488        583          0        244      19329
 -/+ buffers/cache:      11914      20157
 Swap:        17399        287      17112

缓存大小不断增长(每次重启应用程序和清除缓存之间)

在我发布问题 5 小时后,内存状态为:

             total       used       free     shared    buffers     cached
Mem:         32071      31850        221          0        194      20124
-/+ buffers/cache:      11530      20541
Swap:        17399        299      17100

我的 java 选项是:

-Xms12g -Xmx12g -XX:MaxNewSize=6g -XX:NewSize=6g -XX:+UseParallelOldGC -XX:+UseParallelGC -XX:+UseTLAB -XX:MaxTenuringThreshold=15 -XX:+DisableExplicitGC

如你所见,缓存大小太高,在我的服务器的高负载时间内,交换被使用,服务器太慢(不像https://www.linuxatemyram.com/,内存已满,交换空间已被使用,我的应用程序太慢了)

我使用 java 作为服务。

我能做些什么?

答案1

服务器中 Java 应用程序变慢的原因仅受我们的想象力限制(有时也受天意限制)。内存占用大的进程是其中的一部分,它们导致的内存耗尽意味着交换,而与磁盘的交互会降低性能。

但是,在这种情况下,内存使用情况并未显示交换的症状(请参阅@Sven 的评论)。基于应用程序的行为的解释更合理。

Java 应用程序对内存配置非常敏感(除其他外)。程序员对 Java(以及几乎所有现代语言)非常满意,因为他们不必调用释放函数来避免内存泄漏,因为这是垃圾收集器完成的。但是,垃圾收集器可以在应用程序进入时冻结它。有各种类型的垃圾收集。作用于新区域的垃圾收集侵入性较小,作用于旧区域的垃圾收集侵入性较差,而完整 GC 是最糟糕的。

总体而言(当然在本例中也是如此),有必要研究内存的演化,以优化其配置。无论如何,我们可以看到一些值得反思的要点:

  • 分配给应用程序的内存为服务器总空间 32 GB 中的 12 GB。
  • 分配给新对象的空间为 12 GB 中的 4 GB。如您所见堆调整参数,这意味着 NewRatio 为 2,符合最佳实践。无论如何,应该考虑增加这个值。

NewSize 和 MaxNewSize 参数控制新生代的最小和最大大小。通过将这些参数设置为相等来调节新生代的大小。新生代越大,小代收集发生的频率就越低。新生代相对于老生代的大小由 NewRatio 控制。例如,设置 -XX:NewRatio=3 意味着老生代和新生代之间的比例为 1:3,伊甸园和幸存者空间的总大小将是堆的四分之一。

默认情况下,应用程序服务器通过 Java HotSpot Server JVM 调用。Server JVM 的默认 NewRatio 为 2:旧代占用堆的 2/3,而新一代占用 1/3。较大的新一代可以容纳更多短寿命对象,从而减少了对缓慢主要收集的需求。旧代仍然足够大,可以容纳许多长寿命对象

无论如何,不​​应忽视其他资源(线程、池、连接等)的使用。

答案2

您没有解释您的系统到底有多慢以及慢在哪里(交互式用户?批处理?),并且只确定了一个性能计数器,即内存。这不会发现您的问题。要有条不紊地收集响应时间和监控数据,并深入研究应用程序和操作系统的工作原理。

Linux 机器上的一个很好的起点是60,000 毫秒内的 Linux 性能分析.CPU、存储、网络、错误,当然还有内存。

uptime
dmesg | tail
vmstat 1
mpstat -P ALL 1
pidstat 1
iostat -xz 1
free -m
sar -n DEV 1
sar -n TCP,ETCP 1
top

通过分析应用程序,你可以深入了解应用程序。Java 陷入火海值得一读(也恰好是 Netflix 技术博客)。该-XX:+PreserveFramePointer选项允许 Java 堆栈与 OS 分析相关联。

相关内容