我有一个具有32 g RAM的centos服务器,它的状态是(免费的-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作为服务。
我能做什么?
发布于 2017-11-11 10:40:34
服务器中的Java应用程序之所以能够放缓,原因仅限于我们的想象力(有时还受到普罗维登斯的限制)。内存贪婪的进程是其中的一部分,它们所导致的内存耗尽意味着交换,而与磁盘的交互破坏了性能。
但是,在这种情况下,内存使用没有显示交换的症状(请参阅@Sven的注释)。这是一个基于应用程序行为的解释。
Java应用程序对内存配置非常敏感(除其他外)。程序员在Java (以及几乎所有现代语言中)都很高兴,因为他们不需要调用空闲函数来避免内存泄漏,垃圾收集器就是这样做的。但是,垃圾收集器可以在应用程序进入时冻结它。垃圾收集有多种类型。对新区域的影响较小,在旧区域的影响较小,而完全gc的情况最差。
通常(当然,在这种情况下),为了优化内存的配置,有必要研究内存的演变。无论如何,我们可以看到一些值得思考的地方:
NewSize和MaxNewSize参数控制新一代的最小和最大大小。通过将这些参数设置为相等来调整新一代的大小。年轻一代越大,小收藏就越少发生。相对于老一代而言,年轻一代的大小由NewRatio控制。例如,设置-XX:NewRatio=3意味着老一代和年轻一代之间的比例为1:3,eden和幸存者空间的合并大小将是堆的第四位。默认情况下,应用服务器是使用调用的。Server的默认NewRatio是2:旧代占用堆的2/3,而新一代占用1/3。更大的新一代可以容纳更多的短期对象,从而减少了对慢主集合的需求。老一代仍然足够大,足以容纳许多长寿的物体。
无论如何,其他资源的使用(线程、池、连接等)不应该被解雇。
发布于 2017-11-11 15:26:13
您还没有解释您的系统有多慢,在哪里(交互式用户?批处理?)只识别了一个性能计数器,内存。这不会发现你的问题。系统地收集响应时间和监控数据,深入了解应用程序和操作系统是如何工作的。
Linux上一个很好的起点是以6万毫秒为单位的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分析相关联。
https://serverfault.com/questions/882949
复制相似问题