Mobilecashier jvm参数调优cpu使用率降低20个点总结
mobilecashier gzone机房的机器CPU最近节节高升逼近70%以上,如下是mobilecashier-60-51在16号以后的CPU情况,最高已经达到87.95%,当时初步判断是新春红包业务(转账业务目前走gzone)上涨引起。
又想业务量比起大促还是少了点,这里面肯定不正常,随后看了gzone的其他几台机器,发现mobilecashier-60-101在2号13:30左右的时候,cpu有个突然升高(如下图所示),但是业务量并没有明显的变化。
于是想到发现CPU问题的利器perf,记得之前在排查gzone启动时CPU过高问题时在mobilecashier-60-51已经安装了perf(该工具需要PE使用root权限才能安装),且执行perf命令需要使用root权限,于是让知言帮忙在60-51上抓取perf文件(两个命令,先perf record -a –g 采样15秒钟左右,再将结果导出到文件:perf report > result.txt),采用的结果如下(http://zpaas.alipay.com/download/asa150202134318/mobilecashier-60-51.zue.alipay.com-result.txt),打开文件可以看到cpu的占用情况,但是后面的符号没有一点jvm底层知识的话是看不懂的,于是请教了基础技术的九居,九居给出了解释:排最高的那个是jit代码,看不到符号,排名4、5、6的符号都是gc相关的,排名4、5的是在做cms mark,排名6的是在做sweep,九居猜测是不是CMS GC比较频繁引起的。
查看mobilecashier60-101的gc日志如下,发现13点刚开始的时候是间隔三分钟一次cms gc,到后面变成间隔一分钟一次,到13:49的时候已经变成间隔一分钟3次了,而且每次cms gc的时间都比较长,有的甚至需要10秒钟。
原因基本明了,解决方案就是增加年老代(tenured generation)的内存(CMS GC用于回收此内存),有两个方案:1. 默认CMS是在tenured generation沾满68%的时候开始进行CMS GC,可以适当调高此值,降低CMS GC次数;2.增大JVM的最大可用内存。
看如下图,年老代的内存使用已经和其可使用的最大内存相近,方案1就算调高比例也没有用。
所以想到方案2,问知言要了目前的mobilecashier jvm参数如下:
cat conf/java_opts
JAVA_OPTS="-server -Xms3800m -Xmx3800m -Xmn1500m -Xss512k -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:+DisableExplicitGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=68 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/logs -XX:ErrorFile=/home/admin/logs/hs_err_pid%p.log -Ddbmode=$DBMODE -Dcom.alipay.ldc.zone=$ZONE -Dcom.alipay.confreg.url=$CONFREG_URL -XX:+TieredCompilation"
export JAVA_OPTS
各内存参数说明如下:
-Xms3800m –Xmx3800m -Xmn1500m -Xss512k -XX:PermSize=256m -XX:MaxPermSize=256m
JVM初始内存和最大可用内存 年轻代大小 每个线程的堆栈大小 持久代初始值和最大值。
(-Xms可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。)
也就是目前mobilecashier jvm最大可用内存是3800m,年老代最大可用2300m(3800m-1500m),我们目前的机器是4C10g,于是问知言能否增加jvm最大可用内存,知言给出了之前cashier性能调优时的jvm配置,年老代最大可用3500m(5600m-2100m):
JAVA_OPTS="-server -Xms5600m -Xmx5600m -Xmn2100m -Xss512k -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:+DisableExplicitGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=68 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/logs -XX:ErrorFile=/home/admin/logs/hs_err_pid%p.log -Ddbmode=$DBMODE -Dcom.alipay.ldc.zone=$ZONE -Dcom.alipay.confreg.url=$CONFREG_URL"
让知言修改mobilecashier-60-51的jvm参数,重启上线观察两天,今天对比mobilecashier-60-51(调整过jvm参数)和mobilecashier-60-101(未调整过jvm参数)结果分析如下,日常情况下mobilecashier-60-51的cpu占用在26%左右,mobilecashier-60-101的cpu占用在47%左右,10点高峰期mobilecashier-60-51的cpu占用在40%不到,mobilecashier-60-101的cpu占用在60%的样子,对比可以看出,此jvm参数的调整CPU使用降低了20个点。
mobilecashier集群会启用上面新的jvm参数;前面无线对于jvm调优这块其实关注度不够,后续其他系统的owner也可以看下gc情况,做下jvm调优,对性能提升还是挺明显的。