1.背景
当前,后台架构方案流行微服务架构。把一个大系统拆成多个服务,服务之间通过rpc或http restful方式相互通信。微服务拆分方式有业务模块或功能。我司采用业务模块。大概公共服务,微服务,api,注册发现配置等。预发布环境模拟商用,搭建所有的微服务。预发布用于测试或压测等。预发布的硬件条件没有商用好或配置低。预发布在大部分情况下,空闲或使用量小。所以配置低,尽量不多花钱。
2.目的
为了减少阿里云资源费用,提高服务器利用率,在一台2核心8G内存的ECS服务器上,同时运行6个微服务应用。
3.环境
jdk8、centos7、spring clound微服务架构、单一部署。
4.当前运行java进程信息
/bin/java -server -Xms1G -Xmx1G -Xss512k -XX:MetaspaceSize=60m -XX:MaxMetaspaceSize=128m
-classpath /opt/app/micro-acs/conf:/opt/app/micro-acs/boot/*:/opt/app/micro-acs/lib/*:
-Dbasedir=/opt/app/micro-acs -Dfile.encoding=UTF-8 -Djava.awt.headless=true
-Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=60000
-Djmagick.systemclassloader=no -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.ttl=300
-XX:+UseG1GC -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow -XX:HeapDumpPath=/data/logs/
-XX:ErrorFile=/data/logs/micro-acs/javadump_error_%p.log -Dons.client.logRoot=/data/ons
-Dons.client.logLevel=INFO -Dons.client.logFileMaxIndex=10 com.zhht.BootstrapApplication
5.查看内存
命令:jstat -gccapacity 14114
命令结果:
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
0.0 1048576.0 660480.0 0.0 10240.0 650240.0 0.0 1048576.0 388096.0 388096.0 0.0 1138688.0 102016.0 0.0 1048576.0 12416.0 3286 0
列名说明
NGCMN 新生代最小值(KB)
NGCMX 新生代最大值(KB)
NGC 当前新生代大小(KB)
S0C Survivor0(幸存区0)大小(KB)
S1C Survivor1(幸存区1)1大小(KB)
EC Eden(伊甸区)大小(KB)
OGCMN 老年代最小值(KB)
OGCMX 老年代最大值(KB)
OGC 当前老年代大小(KB)
OC 老年代大小(KB)
OU 老年代已使用大小(KB)
MCMN 最小元数据容量(KB)
MCMX 最大元数据容量(KB)
MC 当前元数据空间大小(KB)
CCSMN 最小压缩类空间大小(KB)
CCSMX 最大压缩类空间大小(KB)
CCSC 当前压缩类空间大小(KB)
YGC 新生代GC个数
FGC Full GC次数
当前使用空间: CCSC + MC + OC + EC+ +S1C = 12416 + 102016 + 388096 + 650240 + 10240 = 1135.7500M
总结:
CCSC和MC分别代表当前压缩类空间大小、当前元数据空间大小 加在一起125M左右,对应-XX:MaxMetaspaceSize=128m
这个使用合理,没有多余空间。OC、EC、S1C代表年老代、伊甸、S1区。其中伊甸、S1区加一起等于年轻代。
年老代、年轻代分别是388M、660M左右。堆空间设置-Xmx1G。
再看YGC、FGC参数,分别代表年轻代回收和年老代回收次数。我们发现年老代回收次数为0。
我认为年老代回收频率低,压缩内存的方式提升回收。或者年轻代的回收频率提升。
调整内存大小后的进程信息
root 9053 1 1 May22 ? 02:54:53 /bin/java -server -Xms400m -Xmx400m -Xss512k -XX:MetaspaceSize=60m -XX:MaxMetaspaceSize=128m -classpath /opt/app/micro-acs/conf:/opt/app/micro-acs/boot/*:/opt/app/micro-acs/lib/*: -Dbasedir=/opt/app/micro-acs -Dfile.encoding=UTF-8 -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=60000 -Djmagick.systemclassloader=no -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.ttl=300 -XX:+UseG1GC -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -XX:HeapDumpPath=/data/logs/ -XX:ErrorFile=/data/logs/micro-acs/javadump_error_%p.log -Dons.client.logRoot=/data/ons -Dons.client.logLevel=INFO -Dons.client.logFileMaxIndex=10 com.zhht.BootstrapApplication
root 11671 11645 0 18:23 pts/0 00:00:00 grep --color=auto java
`总结:内存设置400后,单台服务器上运行了6个应用,没有内存溢出等情况。关键是使用率低。
[root@notice_ips_shedulejob_busiconf01 ~]# jstat -gccapacity 9053
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
0.0 409600.0 229376.0 0.0 7168.0 222208.0 0.0 409600.0 180224.0 180224.0 0.0 1136640.0 98252.0 0.0 1048576.0 11980.0 2756 0 ``