每天 100 万次登陆请求8G 内存该如何设置 JVM 参数?

每天 100 万次登陆请求8G 内存该如何设置 JVM 参数?

每天 100 万次登陆请求,8G 内存该如何设置 JVM 参数,大概可以分为以下 8 个步骤 。

第一步、新系统上线如何规划容量?

1、 套路总结1

任何新的业务系统在上线以前都需要去估算服务器配置和 JVM 的内存参数,这个容量与资源规划并不仅仅是系统架构师的随意估算的,需要根据系统所在业务场景去估算,推断出来一个系统运行模型,评估 JVM 性能和 GC 频率等等指标。以下是我结合大牛经验以及自身实践来总结出来的一个建模步骤:

① 计算业务系统每秒钟创建的对象会占用多大的内存空间,然后计算集群下的每个系统每秒的内存占用空间(对象创建速度);

② 选定设置一个机器配置,估算新生代的空间,比较不同新生代大小之下,多久触发一次 MinorGC;

③ 为了避免频繁 GC,就可以重新估算需要多少机器配置,部署多少台机器,给 JVM 多大内存空间,新生代多大空间;

④ 根据这套配置,基本可以推算出整个系统的运行模型,每秒创建多少对象,1 秒以后成为垃圾,系统运行多久新生代会触发一次 GC,频率多高。

2、 套路实战:以用户登录为例

有些同学看到这些步骤还是发怵,说的好像是那么回事,一到实际项目中到底怎么做还是不知道。以登录系统为例模拟一下推演过程:

1、 假设每天 100 万次登陆请求,登陆峰值在早上9点左右,预估峰值时期每秒 100 次登陆并发请求;

2、 假设部署 3 台服务器,每台机器每秒处理 30 次登陆请求。假设一个登陆请求需要处理 1 秒钟,JVM 新生代里每秒就要生成 30 个登陆对象,1 秒之后请求完毕这些对象成为了垃圾对象,即时可以回收的对象

3、 一个登陆请求对象假设 20 个字段,每个字段可能是Long 8字节以此方式进行估算,假设一个对象估算 500 字节,30 个登陆占用用大约 15kb(500字节*30/1024)。考虑到 RPC 和 DB 操作,网络通信、写库、写缓存一顿操作下来,可以扩大到 20-50 倍,大约 1 秒产生几百 K~1M 数据;

4、 假设 2核4G 机器部署,分配 2G 堆内存,新生代则只有几百 M,按照上面登录用户计算 1M/s 的垃圾产生速度,几百秒新生代就会触发一次 MinorGC 了

5、 假设 4核8G 机器部署,分配 4G 堆内存,新生代分配 2G,同样按照1M/s的速度产生对象,(2*1024/60)约需要35分钟才会触发一次 MinorGC。

所以,可以粗略的推断出来一个每天 100 万次请求的登录系统,按照 4核8G 的 3 实例集群配置,分配 4G 堆内存、2G 新生代的 JVM,可以保障系统的一个正常负载。

基本上把一个新系统的资源评估了出来,所以搭建新系统要每个实例需要多少容量多少配置,集群配置多少个实例等等这些,并不是拍拍脑袋和胸脯就可以决定的下来的。

技巧:

对于短期瞬时流量,且老年代的内存中常驻对象较少时,可以适当增大新生代内存,可以起到很大的性能优化效果。默认1:2 可以适当增加新生代的内存。

你可能感兴趣的:(每天 100 万次登陆请求8G 内存该如何设置 JVM 参数?)