事件描述
3.1号凌晨1点,生成服务器出现fullgc告警,持续1小时
内存分析
引起原因
1点运行了凭证冲销的定时任务,定时任务是mapreduce类型,每次并发度5.其中查询凭证行会查询大量的数据,最大一台机器单次约21w+条数据。
jvm启动参数
-server -Xms4g -Xmx4g -Xmn2g -XX:+UseG1GC -XX:G1HeapRegionSize=8m -XX:+G1BarrierSkipDCQ -XX:SurvivorRatio=10 -XX:+ExplicitGCInvokesConcurrent -Dsun.rmi.dgc.server.gcInterval=2592000000 -Dsun.rmi.dgc.client.gcInterval=2592000000 -XX:ParallelGCThreads=2 -XX:+UseStringDeduplication -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -Xlog:gc*:/home/admin/logs/gc.log:time -Xlog:age*=trace:/home/admin/logs/gc.log:time -XX:ReservedCodeCacheSize=256m -XX:MaxDirectMemorySize=1g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/logs/java.hprof -XX:ErrorFile=/home/admin/logs/hs_err_pid%p.log -XX:+ParallelRefProcEnabled -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=10000 -Dsun.net.client.defaultReadTimeout=30000 -DJM.LOG.PATH=/home/admin/logs-DJM.SNAPSHOT.PATH=/home/admin/snapshots -Dfile.encoding=UTF-8 -Dhsf.publish.delayed=true -DlimitTime=100 -Dproject.name=cf-finance -Dpandora.boot.wait=true -Dlog4j.defaultInitOverride=true -Dserver.port=7001 -Dmanagement.port=7002 -Dmanagement.server.port=7002 -Dahas.agw.type=2 -Dpandora.fast.classloader=true --patch-module jdk.unsupported=/home/admin/cf-finance/target/cf-finance/BOOT-INF/lib/jdk-patch-jdk.unsupported-0.3.1.jar -Dpandora.location=/home/admin/cf-finance/target/taobao-hsf.sar -classpath /home/admin/cf-finance/target/cf-finance -Dapp.location=/home/admin/cf-finance/target/cf-finance -Djava.endorsed.dirs= -Djava.io.tmpdir=/home/admin/cf-finance/.default/temp com.taobao.pandora.boot.loader.SarLauncher
分析
1点-1.07分出现了大批量gc,期间eden区数据直接接近0M,推测该期间出现了stw,并且stw线程只有2个,所以导致整个gc时间被拉长,触发了fullgc告警(该告警触发机制是gc时长超过300MM即告警),实时上gc日志也反应了这一点,标记耗时很高。
why
为什么 -Xmx4g,明显太小了不合理。系统有8g内存为啥只给4g?
该调度任务并发度为1,治标不治本,只是减少了一台机器同时处理的数据量,迟早有一天会被打爆。
综管的本地缓存需要治理。
冲销逻辑存在隐患,adb无事务,一旦冲销过程中出现中断,再次冲销凭证行会出现重复问题(不要以半夜不会重启为借口,机器很脆弱)。