使用Jmeter压测Keycloak出现CPU100%占用问题,寻求解决方案
Keycloak高并发登录场景性能优化方案
1. 基础配置调优
- JVM参数优化:Keycloak默认JVM堆内存分配较低,可将Xmx/Xms调整为服务器可用内存的70%左右,同时开启G1垃圾回收器,根据CPU核心数匹配GC线程数,避免GC占用过多CPU资源,参考配置如下:
JAVA_OPTS="-Xms8G -Xmx8G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=8 -XX:ConcGCThreads=2" - 关闭非必要功能:默认开启的事件审计、用户会话持久化、OTP强制校验、复杂密码规则校验等非核心功能可根据场景关闭,同时禁用未用到的身份提供商插件、解除Admin API速率限制,可降低30%左右的CPU消耗。
- 数据库层优化:将默认数据库连接池大小从100调整到200-300匹配1000并发场景,同时开启用户信息、客户端配置等静态数据的查询缓存,避免每次登录请求重复查询数据库。
2. 密码哈希策略调整
Keycloak默认对用户密码采用PBKDF2慢哈希算法,默认迭代次数为27500次,这是为了对抗暴力破解特意设计的,也是登录场景CPU高占用的核心原因。Identity Server默认的哈希迭代次数远低于Keycloak,所以同款压测下不会出现CPU瓶颈。
- 可根据安全要求适当降低迭代次数,最低可调整到10000次,登录性能可提升3倍以上,也可以更换为相同安全等级下CPU消耗更低的argon2算法,可降低40%左右的哈希计算开销。
- 仅压测场景下可临时将测试用户的哈希算法调整为无盐SHA256,压测完成后恢复生产配置即可。
注意:生产环境调整哈希迭代次数需先评估安全风险,不要低于业界推荐的最低阈值。
3. 架构层面扩容
- 单节点Keycloak性能上限有限,若你使用的是2核4G规格的服务器,70并发打满CPU属于正常表现。生产场景可部署Keycloak集群,用Nginx或HAProxy做负载均衡,采用分布式缓存Infinispan同步会话数据,无需开启会话黏滞,1000并发场景仅需3台4核8G规格的节点即可轻松承载。
- 有条件可将缓存层独立部署,用户会话、Token缓存等数据存入独立的Redis或Infinispan集群,避免占用Keycloak节点的运算资源。
4. 压测逻辑优化
- 不要仅采用密码授权模式压测:密码模式每次请求都需要做密码哈希校验,是所有OAuth授权模式中CPU消耗最高的类型,若实际业务使用授权码模式、客户端凭证模式,需用对应模式开展压测,客户端凭证模式的并发性能可达密码模式的5倍以上。
- 开启Token缓存:相同用户短时间内重复登录可直接返回缓存的有效Token,无需每次重新生成、验签。
内容的提问来源于stack exchange,提问作者Allen Chang
相关产品推荐
相关产品推荐

