摘要

咱们在我的项目开发中,个别首先须要在我的项目上线前对我的项目的JVM内存大小须要进行设置。所以咱们个别的思路是:线上业务零碎流程梳理->每天的数据访问量->高峰期的QPS->依据QPS计算出计算机机器配置(1、须要多少台机器 2、每台机器的内存多大 3、每台机器的JVM参数设置)->零碎裁减10-20倍数预估(个别咱们的零碎都会比预估的大10-20倍);

其中每台机器的JVM内存参数设置是要害:须要咱们依据并发、每一次申请的数据大小、以及每一次申请的解决时长来计算机器每次会进入多大数据量到Java堆内存的新生代触发Minor GC/Young GC。

内容

目前依据所在我的项目的业务背景做一个大略的业务流程整顿,而后依据机器的配置剖析设置JVM的内存参数。

线上零碎业务流程形象

首先是外围业务流程简化、形象以及梳理。目前我的项目上是做智能外呼零碎,外围流程就是第三方零碎/利用零碎前端导入数据入库,而后会创立相应的工作规定,外呼平台依据相应的工作规定进行呼叫,因为呼叫规定比较复杂,外呼平台发动呼叫的时候,须要调用利用系统核心两个接口:
1、外呼重呼轮呼接口:次要是针对1人多号码状况下,针对于未接通或者接通的号码做是否须要从新呼叫这个号码,如果不在重呼,是否须要发动轮呼。
2、号码防火墙接口:此接口次要是平台发动呼叫时候的号码校验,一个号码是否在白名单、黑名单、以及每天是否呼叫限度,以及一些号码变换(依据业务号码获取实在号码,被叫号码解密)

而后平台呼叫结束之后,会将呼叫后果入库存储,而后利用零碎的定时调度会每次查问出100条数据接口返回给第三方零碎。简化的业务流程图如下:

零碎QPS

零碎呼叫后果量高峰期大略20万,号码接通率均匀50%,未呼通的号码均匀呼叫3次,一个可能多个号码,咱们依照1人一号码算,呼叫后果传输依据咱们三方零碎的个数,有不同的定时传送工作。目前对接的三方零碎有4个。所以咱们预估每天的进入智能外呼零碎的数据量有:
总数据量=20万(外呼平台-号码防火墙接口)+10万(接入数据)+15万(重呼轮呼接口)+20万(后果回传)+5万(其余)=70万,每天呼叫工夫大略为8个小时;因为外呼零碎呼叫是主动后盾触发,不存在80%的数据量在20%的工夫涌入。所以QPS为:700000/8/60/60=25;

JVM参数预估.

每秒有多少次申请
每秒25个申请

每次申请耗时
20万(外呼平台-号码防火墙接口--均匀1秒)+10万(接入数据-8秒)+15万(重呼轮呼接口-均匀耗时3秒)+20万(后果回传-200毫秒)+5万(其余)=70万

号码防火墙接口:均匀1秒

接入数据耗时:咱们大略算8秒.

重呼:咱们大略算3秒.
.

后果回传:均匀200毫秒

共计每次申请耗时大略:(20+10x8+15x3+20x0.2+5)/70=2.17秒。

每个申请大略须要多大的内存空间?
每个申请数据均匀来说有20多个字段,大略500b

每秒发动的申请对内存的占用?
每秒有25个申请,每个申请大小是500b,所以每秒发动的申请对内存的占用为:25x500b=12.2kb

对残缺的零碎内存占用须要进行预估.
咱们目前只是对系统外呼时候的接入数据量进行评估,实在外呼零碎运行,必定会每秒创立大量其余对象,更有可能在某一个时刻数据过去的多时候触发更大的数据并发,联合此咱们能够大略估算整个零碎每秒钟大略有多少内存空间,咱们再次根底之上将计算结果扩充10~20倍。也就是说,每秒钟在java堆内存中创立的为:120kb-250kb之间,下一秒持续触发,一次新生代垃圾将会越来越多,而后会触发Minor GC回收掉垃圾。

零碎的JVM堆内存应该怎么设置?

其实个别上线业务零碎,常见的机器配置是2核4G,或者是4核8G;
依照2核4G来计算:
4G内存调配JVM虚拟机内存为2G;JVM虚拟机运行时候除了Java堆内存、Java虚拟机栈、程序计数器、办法区;咱们调配给Java对内存的大小个别就是占一半多,也就是1G多,Java堆有新生代跟老年代,依照java对象大都是"朝存夕亡",咱们的新生代跟老年代大概是8:2也就是新生代是800M;每秒零碎有250kb的新生代对象进入;那么800x1024/250/60=55min;也就是55分钟左右会触发一个Minor GC,所以曾经足够。

并发扩充10倍零碎的JVM堆内存应该怎么设置?

如果零碎并发减少10倍,也就是每秒250个申请的话,那么每秒将会有:1200kb-2500kb数据进入java堆内存,此时就算是2M;800M的java堆内存将会在:800/2/60=7分钟,大略7分钟左右就会触发一次Minor GC,频繁触发会影响零碎系能,

如果采纳4外围8G的话,咱们4G的内存调配给JVM虚拟机,而后Java堆内存是2G,新生代占用:1.6G,那么1.6x1024/2/60=13分钟,此时也会造成Minor GC频繁,所以咱们能够让JVM虚拟机为5G,而后java堆内存为3G,新生代为:2.4G,那么:2.4x1024/2/60=21分钟,大略21分钟触发一次Minor GC还算对付。

所以参数设置:

-Xms3G -Xmx3G -Xmn2.4G