如何实现每秒1000个请求的Spring boot p99在500毫秒以下

问题描述 投票:0回答:1

我们的 Spring Boot 应用程序版本 2.5.10 只有一个 api,它从 redis 读取 6 次并进行一些计算,并且没有其他 IO 操作(例如数据库操作),并使用 helm 部署在 kubernetes 中。我使用

Instant.now()
计算得出的实际 api 执行时间低于 20 毫秒。当从 m4.4xlarge 实例以 1000 VU 进行负载测试时,当前 K6 负载测试输出 p99 值低于 3 秒。

我已经使用应用程序属性文件尝试了以下 Tomcat 配置。

server.tomcat.threads.min-spare=100
server.tomcat.threads.max=400
server.tomcat.accept-count=200

最初在 kubernetes 中部署时仅使用 0.5 个 cpu。一旦需求共享,我们将 cpu 增加到 2000m,内存增加到 1Gb,并将副本集增加到 3。

在负载测试时,我注意到可运行线程计数很低。我可以进行任何更改来增加可运行的数量吗?

jvm_threads_states_threads{state="runnable",} 5.0
jvm_threads_states_threads{state="blocked",} 0.0
jvm_threads_states_threads{state="waiting",} 202.0
jvm_threads_states_threads{state="timed-waiting",} 3.0
jvm_threads_states_threads{state="new",} 0.0
jvm_threads_states_threads{state="terminated",} 0.0

可以进行哪些可能的优化或配置来进一步将 p99 延迟改善到 500ms 以下?

spring-boot kubernetes tomcat9 low-latency
1个回答
0
投票

可运行可能不是问题。你需要弄清楚这是怎么回事

jvm_threads_states_threads{state="waiting",} 202.0

您有 202 个线程在等待某事。来自java文档

"A thread that is waiting indefinitely for another thread to perform a particular action is in this state"

你有一些东西造成了瓶颈。例如,您的线程可能正在等待来自 Redis 的 IO。请注意,根据您使用的客户端,Redis 可以使用连接池等,所以这就是我开始的地方。您需要为您的问题添加更多细节。

© www.soinside.com 2019 - 2024. All rights reserved.