首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存缓存太高,需要使用交换。

内存缓存太高,需要使用交换。
EN

Server Fault用户
提问于 2017-11-11 06:27:47
回答 2查看 4K关注 0票数 1

我有一个具有32 g RAM的centos服务器,它的状态是(免费的-m):

代码语言:javascript
复制
              total       used       free     shared    buffers     cached
 Mem:         32071      31488        583          0        244      19329
 -/+ buffers/cache:      11914      20157
 Swap:        17399        287      17112

缓存的大小是增长(在每次重新启动应用程序和清除缓存之间)

在我发布问题的5个小时后,记忆状态是:

代码语言:javascript
复制
             total       used       free     shared    buffers     cached
Mem:         32071      31850        221          0        194      20124
-/+ buffers/cache:      11530      20541
Swap:        17399        299      17100

我的java选项是:

代码语言:javascript
复制
-Xms12g -Xmx12g -XX:MaxNewSize=6g -XX:NewSize=6g -XX:+UseParallelOldGC -XX:+UseParallelGC -XX:+UseTLAB -XX:MaxTenuringThreshold=15 -XX:+DisableExplicitGC

正如您所看到的,缓存大小太大,在我的服务器上的高负载时间中,交换被使用,服务器太慢(与https://www.linuxatemyram.com/不同,内存已满,交换被使用,我的应用程序太慢)。

我使用java作为服务。

我能做什么?

EN

回答 2

Server Fault用户

发布于 2017-11-11 10:40:34

服务器中的Java应用程序之所以能够放缓,原因仅限于我们的想象力(有时还受到普罗维登斯的限制)。内存贪婪的进程是其中的一部分,它们所导致的内存耗尽意味着交换,而与磁盘的交互破坏了性能。

但是,在这种情况下,内存使用没有显示交换的症状(请参阅@Sven的注释)。这是一个基于应用程序行为的解释。

Java应用程序对内存配置非常敏感(除其他外)。程序员在Java (以及几乎所有现代语言中)都很高兴,因为他们不需要调用空闲函数来避免内存泄漏,垃圾收集器就是这样做的。但是,垃圾收集器可以在应用程序进入时冻结它。垃圾收集有多种类型。对新区域的影响较小,在旧区域的影响较小,而完全gc的情况最差。

通常(当然,在这种情况下),为了优化内存的配置,有必要研究内存的演变。无论如何,我们可以看到一些值得思考的地方:

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

NewSize和MaxNewSize参数控制新一代的最小和最大大小。通过将这些参数设置为相等来调整新一代的大小。年轻一代越大,小收藏就越少发生。相对于老一代而言,年轻一代的大小由NewRatio控制。例如,设置-XX:NewRatio=3意味着老一代和年轻一代之间的比例为1:3,eden和幸存者空间的合并大小将是堆的第四位。默认情况下,应用服务器是使用调用的。Server的默认NewRatio是2:旧代占用堆的2/3,而新一代占用1/3。更大的新一代可以容纳更多的短期对象,从而减少了对慢主集合的需求。老一代仍然足够大,足以容纳许多长寿的物体。

无论如何,其他资源的使用(线程、池、连接等)不应该被解雇。

票数 1
EN

Server Fault用户

发布于 2017-11-11 15:26:13

您还没有解释您的系统有多慢,在哪里(交互式用户?批处理?)只识别了一个性能计数器,内存。这不会发现你的问题。系统地收集响应时间和监控数据,深入了解应用程序和操作系统是如何工作的。

Linux上一个很好的起点是以6万毫秒为单位的Linux性能分析。CPU,存储,网络,错误,当然还有内存。

代码语言:javascript
复制
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分析相关联。

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/882949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档