云计算、AI、云原生、大数据等一站式技术学习平台

网站首页 > 教程文章 正文

每天100w次登录请求,配置4核8G如何jvm调优

jxf315 2025-06-08 22:08:29 教程文章 15 ℃

前言:

系统登录请求操作是比较频繁的操作,那么对于4核8G的服务器,每天100w次登录请求 ,如何从容坑得住压力呢,并且正常运行。

下面就从jvm入手说下对他的调优。

业务并发说明

首先,我们需要问清楚,一天100W次的登录,在一天内有没有某个时段是高峰的?高峰期的QPS大概可以达到多少。

如果没有高峰期,虽然100万听上去挺多的,但是其实平均下来一秒钟的QPS也就10,这个量的话,其实根本不需要做什么特别的JVM优化。

一般业务存在高峰期,我们假设登录业务存在高峰期,峰值时长大概持续1个小时,峰值的QPS可以达到200。那么需要做哪些优化?

登录分析

作为一个登录服务,一般来说我们在接收到请求之后,只需要给用户进行鉴权并把结果返回给前端就行了。在这个过程中一般不太会去查询太多的数据,比如权限什么的也都是在后面访问页面再查询的。

所以,峰值200左右的QPS,对于JVM的内存来说,最主要的就是会因为远程调用,而创建出很多请求参数和请求的响应。而这些对象基本都是朝生暮死的,接口调用结束之后就会被回收掉。并且通常来说这些对象也不会很大,因为登录并不是注册,其实并不携带特别多的信息,那么也就是说,会产生大量的小对象,即新生代会不断的创建对象,并被回收掉

JVM调优

堆内存设置

首先是堆内存大小的设置。当我们的机器只有4核8G的时候,堆内存的大小肯定不能太大般不建议设置的太大,因为我们需要给机器上的其他应用预留出一部分内容。所以,我们.般建议都是把JVM的堆内存设置成操作系统内存的一半,也就是4G。至于初始内存和最大内存,我们这场景中建议设置成一样的。这样可以避免IM 在运行过程中频繁进行内存扩容和收缩操作,提高应用程序的性能和稳定性。即:

垃圾收集器的选择

在设置了堆空间的总大小之后,我们需要考虑用哪种垃圾收集器。另外,我们前面分析过这个业务中会频繁在新生代创建并销毁对象,那么,就意味着新生代的GC会比较频繁。所以我们需要选择一种在GC过程中STW时间短的,并且在年轻代的回收中也能发挥效果的。

在新生代的垃圾收集器中,主要以Serial、ParNew、Parallel Scavenge以及支持整堆回收的G1了。

因为新生代采用的都是复制算法,所以不太需要考虑碎片的问题,我们主要考虑吞吐量和STW的时长就行了。

首先排除单线程的Serial,剩下ParNew是一个并发的收集器,ParallelScavenge更加关注吞吐量,而G1作为JDK 9中默认垃圾收集器,他不仅同时具有低暂停时间和高吞吐量的优点,但是他对内存有要求,最小要4G

从使用门槛上来说,G1是可以用的,因为一般来说,内存要大于等于4G的话,才适合使用G1进行GC。

所以,我们采用G1作为垃圾收集器

在使用了G1之后,其实他自己是有一套自动的预测和调优机制的。我们只需要通过-xX:MaxGCPauseMillis 参数来设置最大停顿时间就行了。一般建议设置到100-200之间,一般这个时长对用户来说基本无感知:

其次,我们还可以自己调节一些G1的配置,比如设置他的GC线程数,可以先配置4个线程数进行GC,后续根据实际情况再做调整:

各区大小设置

G1的内存划分是自适应的,例。但是,我们也可以通过一些JVM参数来手动设置G1的各个分代内存配置。

G1 中的分代和其他垃圾回收器不太一样,它不是严格按照年轻代和老年代划分的,而是通过划分各个区域的存活对象数量来实现垃圾回收的。因此,G1中不需要像其他垃圾回收器那样设置新生代和老年代的大小比例,而是需要设置一些区域的内存配置。

-XX:G1NewSizePercent-XX:G1MaxNewSizePercent 分别用于设置年轻代的初始大小和最大大小,它们的默认值分别为 5%和 60%。针对我们的业务场景,我们其实可以适当的调高一下年轻代的初始大小,5%的比例太小了,我们可以调整到30%。

添加必要的日志

因为以上配置都是根据业务大致分析出来的初始配置,所以我们一定是需要不断地调优的那么必要的日志相关参数就要添加。如:

总结

上面针对项目中登录功能,在高并发流量下进行jvm相关的参数调优,从而保证了服务器4核8G的配置能够满足较高的QPS。

最近发表
标签列表