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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 如何对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+垃圾回收有明显减少,无内存溢出错误。

相关文章
|
存储 缓存 Java
Infinispan篇(一):一个被遗忘了的分布式集群缓存系统
Infinispan 是一个开源内存数据网格,提供灵活的部署选项和强大的数据存储、管理和处理功能。
2343 0
|
人工智能 开发工具 网络架构
魔哈:Grok国内镜像
xAI 宣布正式开源 3140 亿参数的混合专家(MoE)模型「Grok-1」,以及该模型的权重和网络架构。这也使得Grok-1成为当前参数量最大的开源大语言模型。
1057 0
 魔哈:Grok国内镜像
|
XML JSON 编译器
Protobuf - 更小、更快、更简单的交互式数据语言
Protobuf - 更小、更快、更简单的交互式数据语言
132 0
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
Magma:微软放大招!新型多模态AI能看懂视频+浏览网页+UI交互+控制机器人,数字世界到物理现实无缝衔接
Magma 是微软研究院开发的多模态AI基础模型,结合语言、空间和时间智能,能够处理图像、视频和文本等多模态输入,适用于UI导航、机器人操作和复杂任务规划。
394 2
|
Linux Shell 网络安全
LabVIEW NI Linux Real-Time深层解析
LabVIEW NI Linux Real-Time深层解析
274 0
|
消息中间件 运维 监控
|
编解码 人工智能 数据中心
中国陆地生态系统服务价值空间分布数据集
中国陆地生态系统服务价值空间分布数据集
295 0
中国陆地生态系统服务价值空间分布数据集
|
存储 缓存 算法
Redis进阶-分布式存储 Sequential partitioning & Hash partitioning
Redis进阶-分布式存储 Sequential partitioning & Hash partitioning
111 0
|
安全 关系型数据库 MySQL
基于LNMP搭建WordPress
基于LNMP搭建WordPress
2517 0
|
前端开发 IDE Java
用 Spring Boot 打包你的 React 应用
先讲一讲这篇文章的背景故事。之前我的团队需要在我们需求的基础架构上节省一些资金,并且由于我们要构建的这个应用程序中,大部分负载都会在客户端而非服务端上,所以我们决定试验一下能否将一个 Spring 应用程序与一个 React 应用结合起来,并打包成一个 war 文件。