大家好,我是小盒子。上次推文:Infinispan篇(一):一个被遗忘了的分布式集群缓存系统。从各种姿势讲解了Infinispan部署,感受到了它强大的集群模式缓存。
今天的主题:如何对Infinispan进行压力测试?
一、前言
我们生产环境中Keycloak用的Infinispan的三节点分布式缓存,前段时间Infinispan的其中一个节点竟然莫名的挂了,差不多有一个月的时间了,由于其它两个节点健在,所以Keycloak服务并没受到影响。
二、日志分析
我们将挂了的节点的Infinispan的日志拷贝出来,进行分析,发现大量的java.lang.OutOfMemoryError: Java heap space,JVM堆内存溢出了。查看gc.log发现从11月25号-12月6号gc很频繁,且有大量的Full GC发生。如下所示:
通过Infinispan部署目录/bin/server.conf中看到,其默认的JAVA_OPTS如下:
JAVA_OPTS="-Xms512m -Xmx512m -XX:MetaspaceSize=64M -Djava.net.preferIPv4Stack=true" JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true"
“上面的JVM内存配置显然不足以支持我们Keycloak的会话存储。
”
三、压力测试
3.1 测试目的
为了搞清楚infinispan服务在高并发情况下的稳定性,并分析infinispan服务的日志,有无内存溢出的情况。
3.2 Infinispan部署说明
Infinispan采用集群模式,共有三个节点,如下:
192.168.0.201:11222 192.168.0.202:11222 192.168.0.203:11222
Version: Infinispan 'Triskaidekaphobia' 13.0.2.Final,同在线Keycloak使用同版本。
初始压测Infinispan JVM启动参数设置: JAVA_OPTS="-Xms64m -Xmx512m -XX:MetaspaceSize=64M -Djava.net.preferIPv4Stack=true
Infinispan部署服务器配置:
192.168.0.201 内存:11G(目前剩余可用内存8G) 磁盘:500G (目前剩余可用磁盘400G) CPU: 4核 192.168.0.202 内存:11G(目前剩余可用内存3G) 磁盘:500G (目前剩余可用磁盘440G) CPU: 4核 192.168.0.203 内存:11G(目前剩余可用内存5G) 磁盘:500G (目前剩余可用磁盘330G) CPU: 4核
3.3 Keycloak部署说明
Version: 14.0.0
单节点部署,服务器配置:
192.168.0.201 内存:11G(目前剩余可用内存8G) 磁盘:500G (目前剩余可用磁盘400G) CPU: 4核 启动参数: -Xms1024M -Xmx2048M -XX:MaxPermSize=2048M -XX:MaxHeapSize=2048M
3.4 mysql部署说明
Version: 5.7.27
参数配置:
[mysqld] character_set_server=utf8 init_connect='SET NAMES utf8' sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES max_allowed_packet=512M innodb_log_file_size=2G transaction-isolation=READ-COMMITTED lower_case_table_names=1 innodb_file_per_table=1 [client] default-character-set=utf8
3.5 测试方案
- 测试时间:2022.12.22-2022.12.28
- 压测工具:Apache JMeter5.5
- 用户账号:25个
压测环境说明:
测试工具部署地址: Master:192.168.0.1 Slave1:192.168.0.2 Slave2:192.168.0.3 Slave3:192.168.0.4 Slave4:192.168.0.5 压测kc接口地址:192.168.0.201 服务器配置:磁盘:500G (目前剩余可用磁盘400G) CPU: 4核
压测接口:
密码登录:/auth/realms/fabao/protocol/openid-connect/token 查看token是否在线:/auth/realms/fabao/protocol/openid-connect/token/introspect
“接口说明:查看token是否在线接口依赖于密码登录接口,参数token为上一接口返回值access_token
”
压测策略:
通过jmeter循环请求密码登录接口产生8w个会话,用Beanshell脚本把8w个token值存到本地,会话失效时间是1个月; 模拟增加线程数由每秒起30/60/90/100持续对8w个token是否在线进行持续压测,观察内存是否溢出,是否有其他报错;
“我们Infinispan常驻会话大概8w多个。
”
3.6 测试场景记录
我主要分析了4次有效的压测记录。前面3次是调整Infinispan JVM启动参数之前。
1. 压测日期为2022.12.22
Infinispan中会话数8万+,压测kc在线状态接口,一台机器,并发30的情况下。截止2022.12.22日09:26到2022.12.22日16点。
192.168.0.201节点共gc了227次,其中Full GC了9次。 192.168.0.202节点共gc了234次,其中Full GC了9次。 192.168.0.203节点共gc了187次,其中Full GC了9次。
“其中201、202、203节点server日志中除了infinispan Console 展示序列化的错误,无其他报错。kc服务日志中无报错。
”
2. 压测日期为2022.12.23
Infinispan中会话数8万+,压测kc在线状态接口,一台机器,并发60的情况下。截止2022.12.23日11点到2022.12.23日16点。
192.168.0.201节点共gc了2548次,其中Full GC了28次。 192.168.0.202节点共gc了2364次,其中Full GC了21次。 192.168.0.203节点共gc了2501次,其中Full GC了21次。
“其中201、202、203节点server日志中除了infinispan Console 展示序列化的错误,无其他报错。kc服务日志中无报错。
”
3. 压测日期为2022.12.26
Infinispan中会话数8万+,压测kc在线状态接口,5台机器(每台机器并发60),并发300的情况下。截止2022.12.26日15:37到2022.12.26日16:30。
192.168.0.201节点共gc了72次,其中Full GC了3次,平均一分钟进行1次gc。 192.168.0.202节点共gc了77次,其中Full GC了4次,平均一分钟进行1次gc。 192.168.0.203节点共gc了67次,其中Full GC了2次,平均一分钟进行1次gc。
“其中201、202、203节点server日志中除了infinispan Console 展示序列化的错误,无其他报错。kc服务日志中无报错。
”
4. 压测日期为2022.12.28
调整Infinispan JVM启动参数之后,JAVA_OPTS="-Xms2048m -Xmx2048m -XX:MetaspaceSize=512M -Djava.net.preferIPv4Stack=true。
Infinispan中会话数8万+,压测kc在线状态接口,5台机器(每台机器并发100),并发500的情况下。截止2022.12.27日18:19到2022.12.28日15:50。
192.168.0.201节点共gc了43次,其中Full GC了0次,平均约一个小时进行了一次gc 192.168.0.202节点共gc了43次,其中Full GC了0次,平均约一个小时进行了一次gc 192.168.0.203节点共gc了42次,其中Full GC了0次,平均约一个小时进行了一次gc
“其中201、202、203节点server日志中除了infinispan Console 展示序列化的错误,无其他报错。kc服务日志中无报错。
”
四、测试结论分析
从jmeter聚合报告可知,接口错误率为0,TPS显示400-1000/sec。调整内存后,请求数已经达到5212w+垃圾回收有明显减少,无内存溢出错误。