JVM设置和建议 第5章配置--7.1.2版本
JVM设置和建议
原文: https://docs.tigase.net/tigase-server/7.1.2/Administration_Guide/html_chunk/jvm_settings.html
Tigase配置文件tigase.conf
(在“ tigase.sh的启动文件-tigase.conf”一节中有更详细的描述)中提到了几个与JVM操作有关的环境变量。在本指南中,我们将详细介绍这些配置选项,并提供有关最佳设置的提示。
包含的设置etc/tigase.conf
如下:
#GC =“-XX:+ UseBiasedLocking -XX:+ UseConcMarkSweepGC -XX:+ UseParNewGC -XX:NewRatio = 2 -XX:+ CMSIncrementalMode -XX:ReduceInitialCardMarks -XX:CMSInitiatingOccupancyFraction = 70 -XX:+ UseCMSInitiatingOccupancyOnly”#EX =“-XX:+ OptimizeStringConcat -XX:+ DoEscapeAnalysis -XX:+ UseNUMA”#GC_DEBUG =“ -XX:+ PrintTenuringDistribution -XX:+ PrintGCDetails -XX:+ PrintGCDateStamps -XX:+ PrintGCTimeStamps -Xloggc:logs / jvm.log -verbose:gc”#PRODUCTION_HEAP_SETTINGS =“ -Xms5G -Xmx5G”#堆内存设置必须在每个部署基础上进行调整!JAVA_OPTIONS =“ $ {GC} $ {GC_DEBUG} $ {EX} $ {ENC} $ {DRV} $ {JMX_REMOTE_IP}-服务器$ {PRODUCTION_HEAP_SETTINGS} $ {DNS_RESOLVER} $ {INTERNAL_IP} $ {EXTERNAL_IP} -XX:MaxDirectMemorySize = 128m“
尽管此文件使用bash变量,但可以在所有操作系统上以相同方式使用JVM配置选项。
该指南将包括两个主要部分-内存设置和垃圾收集器调整说明和提示。
我们建议-server
在所有情况下都使用JVM参数。
对于非生产部署(开发或说明环境),我们建议使用JVM的默认内存设置(取决于底层操作系统),这会导致自动内存分配,并且根据经验,在这种情况下最安全环境。
对于生产环境,我们建议使用固定大小的HEAP-初始大小和最大大小,可以分别(通过)-Xms
和-Xmx
JVM标志进行设置-理想情况下应设置为相同的值(如果Tigase是机器上唯一的服务),以避免分配和取消分配。
为了方便起见,可以取消注释行PRODUCTION_HEAP_SETTINGS
并相应地调整参数。
让我们首先说明没有“一个人可以全部统治”的情况-每个部署和用例都是不同的,但是我们将尝试给出一些指示,并建议对GC本身进行简短介绍。
XMPP在内存分配方面非常具体-短期对象(各种节)通常超过长期对象(用户连接和相关数据)的数量。这是有关JVM HEAP通常如何组织以及垃圾收集器如何工作的重要信息。在最基本的层次上,堆分为两个区域:
青年一代,又分为:
伊甸园 -通常在创建对象时分配对象的区域;
生存空间 - (到和从 -其中一个总是空的) -负责存储收集后剩下的所有带电物体年轻一代(过程反复多次,直到对象被最终认为足够老);
老一代 -(终身空间)-负责在 Survivor Spaces上运行GC后剩余的活动对象-这些对象将是长期存在的对象(通常是用户连接和关联的数据);
一般的想法表明:* 次要GC清洁了年轻一代;* 主要GC清理使用权空间;* Full GC清除所有堆。
但是,虽然我们可以肯定地说,次要GC可以清理年轻一代,但是区分主要和完全GC却有些困难,尤其是考虑到主要GC经常由次要GC触发并且某些垃圾收集器可以同时执行清理。相反区分阶段应该更密切地关注垃圾收集器本身的实际操作的对焦方式-取消注释行GC_DEBUG=" -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:logs/jvm.log -verbose:gc "
中etc/tigase.conf
(或添加相同属性的Java命令行),然后分析结果应证明更有帮助。此外,使用例如VisualVM(带有VisualGC插件)监视GC操作也将有所帮助。
理想情况下,我们应该限制GC暂停的次数及其持续时间。经过相当的测试后得出以下结论:
垃圾收集越快,死掉的物体在给定的空间中占据的空间就越多,因此,在高流量的安装中,最好使用相当大的YoungGen,从而降低将这些物体升级为OldGen的能力。
更改了JVM8的年轻/旧一代的默认大小,即使NewRatio仍默认为“ 2”-将其显式设置为“ 2”又恢复了以前的大小;
启用并发标记和扫掠(CMS)(仅适用于权属空间),并且将NewRatio的显式配置设置为默认值2(即
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:NewRatio=2
)通常表现最佳;对于流量较低的小型安装(很少的核心CPU,较少的内存),并行收集器可能是更好的解决方案。
使用调整为实际使用量的堆大小更好,因为堆越大,需要执行收集的空间越大,因此导致更长的暂停时间;在堆很大的情况下,G1收集器可能是避免长时间停顿的更好解决方案;
考虑以上所有因素,使用以下选项应该是进一步优化垃圾收集的良好起点:
GC="-XX:+UseBiasedLocking -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSIncrementalMode -XX:-ReduceInitialCardMarks -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly"
除了使用CMS收集器的一般建议之外,以下选项(或对选项的更改)可能值得考虑:
-XX:NewRatio=2
-定义年轻一代和终身一代之间的比例为1:2。换句话说,伊甸园空间和幸存者空间的总大小将占堆总大小的三分之一。参数NewSize和MaxNewSize从下方和上方限制了年轻代的大小。将它们设置为相同的值可以修复年轻一代,就像将-Xms和-Xmx设置为相同的值可以修复总堆大小一样。-XX:CMSInitiatingOccupancyFraction=percent
-设置开始CMS收集周期的上一代占用率(0到100)。-XX:+UseCMSInitiatingOccupancyOnly
-指示JVM不根据运行时统计信息决定何时启动CMS周期,而是针对每个CMS周期使用CMSInitiatingOccupancyFraction的值。-XX:ParallelGCThreads=x
-设置年轻人代和老年人代中用于并行垃圾回收的线程数。缺省值取决于JVM可用的CPU数量。如果Tigase JMV是唯一运行在安装默认值上的JMV,则建议使用。-XX:ConcGCThreads=x
-设置用于并发GC的线程数。缺省值取决于JVM可用的CPU数量。如果Tigase JMV是唯一运行在安装默认值上的JMV,则建议使用。-XX:+UseBiasedLocking
和-XX:+DoEscapeAnalysis
-旨在消除锁定开销,但是它们对性能的影响是不可预知的,因此测试是必需的; 减少锁定可以提高并发性,并且在当前的多核硬件上可以提高吞吐量。-XX:+OptimizeStringConcat
-启用字符串连接操作的优化。默认情况下启用此选项。-XX:+UseNUMA
-通过增加应用程序对低延迟内存的使用,可以在具有非统一内存架构(NUMA-大多数现代计算机基于NUMA架构)的计算机上优化应用程序的性能。默认情况下,此选项为禁用状态,并且不对NUMA进行优化。仅当使用并行垃圾收集器(-XX:+ UseParallelGC)时,此选项才可用。-XX:-UseCompressedOops
—禁用压缩指针的使用。默认情况下,启用此选项,并且当Java堆大小小于32 GB时,将使用压缩指针。启用此选项后,对象引用将表示为32位偏移量而不是64位指针,这通常在运行Java堆大小小于32 GB的应用程序时提高性能。此选项仅适用于64位JVM。
对于此类设置,建议启用CMS垃圾收集器。根据流量使用情况和特定用例,可能需要调整NewRatio。需要为实际的可用内存调整Xms和Xms的大小(或者为实际的流量调整更好!)。应该使用以下内容:
GC =“-XX:+ UseBiasedLocking -XX:+ UseConcMarkSweepGC -XX:+ UseParNewGC -XX:NewRatio = 2 -XX:+ CMSIncrementalMode -XX:-ReduceInitialCardMarks -XX:CMSInitiatingOccupancyFraction = 70 -XX:+ UseCMSInitiatingOccupancyOnly”EX =“-XX:+ OptimizeStringConcat -XX:+ DoEscapeAnalysis -XX:+ UseNUMA”#GC_DEBUG =“ -XX:+ PrintTenuringDistribution -XX:+ PrintGCDetails -XX:+ PrintGCDateStamps -XX:+ PrintGCTimeStamps -Xloggc:logs / jvm.log -verbose:gc”PRODUCTION_HEAP_SETTINGS =“ -Xms15G -Xmx15G”#堆内存设置必须根据每个部署基础进行调整!JAVA_OPTIONS =“ $ {GC} $ {GC_DEBUG} $ {EX} $ {ENC} $ {DRV} $ {JMX_REMOTE_IP}-服务器$ {PRODUCTION_HEAP_SETTINGS} $ {DNS_RESOLVER} $ {INTERNAL_IP} $ {EXTERNAL_IP} -XX:MaxDirectMemorySize = 128m“
对于具有大量可用内存并打算全部利用的安装,使用G1GC收集器可能是一个更好的主意:
GC =“-XX:+ UseG1GC -XX:ConcGCThreads = 4 -XX:G1HeapRegionSize = 2 -XX:InitiatingHeapOccupancyPercent = 35 -XX:MaxGCPauseMillis = 100”EX =“-XX:+ OptimizeStringConcat -XX:+ DoEscapeAnalysis -XX:+ UseNUMA”#GC_DEBUG =“ -XX:+ PrintTenuringDistribution -XX:+ PrintGCDetails -XX:+ PrintGCDateStamps -XX:+ PrintGCTimeStamps -Xloggc:logs / jvm.log -verbose:gc”PRODUCTION_HEAP_SETTINGS =“ -Xms60G -Xmx60G”#堆内存设置必须根据每个部署基础进行调整!JAVA_OPTIONS =“ $ {GC} $ {GC_DEBUG} $ {EX} $ {ENC} $ {DRV} $ {JMX_REMOTE_IP}-服务器$ {PRODUCTION_HEAP_SETTINGS} $ {DNS_RESOLVER} $ {INTERNAL_IP} $ {EXTERNAL_IP} -XX:MaxDirectMemorySize = 128m“
对于此类设置,还建议启用CMS垃圾收集器。根据流量使用情况和特定用例,可能需要调整NewRatio(并且必须配置NewRatio!)。需要为实际的可用内存调整Xms和Xms的大小(或者为实际的流量调整更好!)。应该使用以下内容:
GC =“-XX:+ UseBiasedLocking -XX:+ UseConcMarkSweepGC -XX:+ UseParNewGC -XX:NewRatio = 2 -XX:+ CMSIncrementalMode -XX:-ReduceInitialCardMarks -XX:CMSInitiatingOccupancyFraction = 70 -XX:+ UseCMSInitiatingOccupancyOnly”EX =“-XX:+ OptimizeStringConcat -XX:+ DoEscapeAnalysis -XX:+ UseNUMA”#GC_DEBUG =“ -XX:+ PrintTenuringDistribution -XX:+ PrintGCDetails -XX:+ PrintGCDateStamps -XX:+ PrintGCTimeStamps -Xloggc:logs / jvm.log -verbose:gc”PRODUCTION_HEAP_SETTINGS =“ -Xms7G -Xmx7G”#堆内存设置必须根据每个部署基础进行调整!JAVA_OPTIONS =“ $ {GC} $ {GC_DEBUG} $ {EX} $ {ENC} $ {DRV} $ {JMX_REMOTE_IP}-服务器$ {PRODUCTION_HEAP_SETTINGS} $ {DNS_RESOLVER} $ {INTERNAL_IP} $ {EXTERNAL_IP} -XX:MaxDirectMemorySize = 128m“
默认情况下,资源有限的小型安装可以更好地运行(对于JVM版本8,这是撰写本文时最新的版本)。再次-根据流量使用情况和特定用例,可能需要调整NewRatio。建议针对实际可用内存调整Xms和Xms大小(或者针对实际流量调整更好!)。应该使用以下内容(即GC
应注释行,以便使用默认值):
#GC =“-XX:+ UseBiasedLocking -XX:+ UseConcMarkSweepGC -XX:+ UseParNewGC -XX:NewRatio = 2 -XX:+ CMSIncrementalMode -XX:ReduceInitialCardMarks -XX:CMSInitiatingOccupancyFraction = 70 -XX:+ UseCMSInitiatingOccupancyOnly”EX =“-XX:+ OptimizeStringConcat -XX:+ DoEscapeAnalysis -XX:+ UseNUMA”#GC_DEBUG =“ -XX:+ PrintTenuringDistribution -XX:+ PrintGCDetails -XX:+ PrintGCDateStamps -XX:+ PrintGCTimeStamps -Xloggc:logs / jvm.log -verbose:gc”PRODUCTION_HEAP_SETTINGS =“ -Xms3G -Xmx3G”#堆内存设置必须在每个部署基础上进行调整!JAVA_OPTIONS =“ $ {GC} $ {GC_DEBUG} $ {EX} $ {ENC} $ {DRV} $ {JMX_REMOTE_IP}-服务器$ {PRODUCTION_HEAP_SETTINGS} $ {DNS_RESOLVER} $ {INTERNAL_IP} $ {EXTERNAL_IP} -XX:MaxDirectMemorySize = 128m“
标签:
上一篇: 高负载系统的Linux设置 第5章配置 ---7.2.2版本
下一篇: tigase.sh的启动文件-tigase.conf 第5章配置---7.1.2版本