第 5 章 配置线程池的概念
了解避免资源耗尽和拥塞的概念。
本节旨在了解如何为红帽构建的 Keycloak 配置线程池连接池的注意事项和最佳实践。对于应用此功能的配置,请访问 使用 Operator 为 HA 部署红帽构建的 Keycloak。
5.1. 概念 复制链接链接已复制到粘贴板!
5.1.1. JGroups 通信 复制链接链接已复制到粘贴板!
JGroups 通信(在单站点设置中用于红帽构建的 Keycloak 节点间的通信)得益于使用虚拟线程,在 OpenJDK 21 中使用虚拟线程(如果至少有两个内核可用于 Keycloak)。这可减少内存用量,并不再需要配置线程池大小。因此,建议使用 OpenJDK 21。
5.1.2. Quarkus executor 池 复制链接链接已复制到粘贴板!
红帽构建的 Keycloak 请求以及阻塞探测由 executor 池处理。根据可用的 CPU 内核,它的最大大小为 50 个或更多线程。线程根据需要创建,并在不再需要时结束,因此系统将自动扩展和缩减。红帽构建的 Keycloak 允许通过 http-pool-max-threads
配置选项配置最大线程池大小。如需示例,请参阅使用 Operator 部署 Red Hat build of Keycloak for HA。
在 Kubernetes 上运行时,请调整 worker 线程数量,以避免产生比 pod 限制允许更多的负载,以避免节流,从而导致拥塞。在物理机上运行时,请调整 worker 线程数量,以避免比节点可以处理更多的负载,以避免拥塞。拥塞会导致响应时间较长,以及增加内存用量,最终导致系统不稳定。
理想情况下,您应该以较低的线程限制开始,并根据目标吞吐量和响应时间进行相应调整。当负载和线程数量增加时,数据库连接也会成为瓶颈。当请求无法在 5 秒内获取数据库连接后,其日志中会失败,并显示 Unable to acquire JDBC Connection
等消息。调用者将收到带有 5xx HTTP 状态代码代表服务器端错误的响应。
如果您增加数据库连接的数量和线程数量过多,则系统将处于高负载下,导致性能不佳。数据库连接的数量分别通过 Database
settings db-pool-initial-size
、db-pool-min-size
和 db-pool-max-size
来配置。低数字确保所有客户端的快速响应时间,即使负载激增有时有请求失败。
5.1.3. Load Shedding 复制链接链接已复制到粘贴板!
默认情况下,红帽构建的 Keycloak 将无限地将所有传入的请求排队,即使请求处理停止也是如此。这将在 Pod 中使用额外的内存,可能会耗尽负载均衡器中的资源,请求最终会在客户端一侧超时,而无需了解请求是否已被处理。要限制红帽构建的 Keycloak 中排队请求数,请设置额外的 Quarkus 配置选项。
配置 http-max-queued-requests
,以指定在超过此队列大小后有效的负载均衡的最大队列长度。假设红帽构建的 Keycloak Pod 进程每秒约 200 个请求,则队列为 1000 会导致最大等待时间为 5 秒。
当此设置处于活跃状态时,超过排队请求数的请求将返回 HTTP 503 错误。Red Hat build of Keycloak 会在日志中记录错误消息。
5.1.4. probes 复制链接链接已复制到粘贴板!
Red Hat build of Keycloak 的存活度探测是非阻止的,以避免在高负载下重启 Pod。
在一些情况下,整个健康探测和就绪度探测可能会检查与数据库的连接,因此它们可能会在高负载下失败。因此,Pod 可能会在高负载下变为未就绪。
5.1.5. OS 资源 复制链接链接已复制到粘贴板!
为了使 Java 创建线程,在 Linux 上运行时,它需要有文件句柄。因此,打开的文件数量(如 ulimit -n
on Linux)需要为红帽构建的 Keycloak 提供头空间,以增加所需的线程数量。每个线程也会消耗内存,容器内存限值需要设置为允许此的值,或 Pod 将被 Kubernetes 终止。