Infinispan篇(二):如何对Infinispan进行压力测试?

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
性能测试 PTS,5000VUM额度
简介: 如何对Infinispan进行压力测试?

大家好,我是小盒子。上次推文: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+垃圾回收有明显减少,无内存溢出错误。

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
7月前
|
测试技术
性能测试和负载测试的区别
性能测试和负载测试的区别
|
2月前
|
监控 测试技术 PHP
性能和压力测试
【10月更文挑战第10天】性能和压力测试
120 60
|
2月前
|
监控 测试技术
如何进行系统压力测试?
【10月更文挑战第11天】如何进行系统压力测试?
142 34
|
2月前
|
缓存 监控 测试技术
服务器压力测试
【10月更文挑战第11天】服务器压力测试
100 31
|
7月前
|
安全 测试技术
负载测试和压力测试的区别
负载测试和压力测试的区别
104 0
|
存储 监控 测试技术
性能测试--稳定性测试
作为质量保障,在稳定性测试方面的探索也在不断演化。记得两年前我们做稳定性测试还是基于恒定的压力,7*24小时长时间运行,关注的指标无非是吞吐量TPS的抖动、响应时间的变化趋势,以及各种资源是否泄露。稳定性测试的场景设计简单,和线上实际运行有较大的出入。带来的直接结果是稳定性测试发现的问题比较有限,做完之后仍然没有特别大的信心
1538 0
性能测试--稳定性测试
|
测试技术 Apache
Apache自带压力测试工具—ab
Apache自带压力测试工具—ab
394 0
Apache自带压力测试工具—ab
|
Java 测试技术 数据库
软件测试|什么是压力测试?什么是负载测试?这两个区别是什么?
软件测试|什么是压力测试?什么是负载测试?这两个区别是什么?
软件测试|什么是压力测试?什么是负载测试?这两个区别是什么?
|
缓存 网络协议 中间件
|
测试技术 Apache
使用Apache Benchmark进行压力测试
使用Apache Benchmark进行压力测试
419 0