在我们的测验应用程序平台上运行 1000 个机器人的负载测试时,我们遇到了一些性能问题。
我们之前做的负载测试是500个机器人,平均响应时间是0.333秒。 AWS 中一切都很顺利,没有什么令人担忧的(完美!)
但是,当使用 1,000 个机器人进行测试时,平均响应时间达到 2.61 秒……(并不完美!)
在查看 AWS 时,我看不到任何问题或限制。事实上,AWS Aurora 在测试期间仅飙升至 10% CPU。
在监控工具 Sentry.io 中,我们收到一条警报,称其中一个 SQL 查询运行缓慢,响应时间为 785.25 毫秒。该查询负责通过 slug 参数从数据库获取测验数据。这是一个非常高性能的查询,具有正确的索引设置,不应该花费这么长时间。
db.sql.query - select *
from `quizzes`
where `slug` = ?
limit 1
这让我觉得 AWS 中有些东西导致了这种情况..可能是由于冷启动或 DB/Lambda 连接配额限制?然而,通过查看仪表板和见解,我看不到任何可以证实这一点的内容。
我唯一能看到的是在测试期间 wait/io/table/sql/handler 等待事件将总数据库负载飙升至 120(见下文)。但我们此时仍然只使用 2 个 CPU,并且仍然低于我们最多有 6 个 ACU (12 GiB),因此不应成为瓶颈。
任何人都可以建议如何在这种情况下提高性能吗?
MySQL 的设计目的不是拥有 1000 个“同时”连接。另一方面,它的设计目的是为了处理分散在一小段时间内的大量数据。 服务器为每个连接提供平等的继续进行的机会。这导致了瓶颈。 (想象一下商店里同时有 1000 名购物者。)
我建议将
max_connection = 500
(或更少)和
back_log
设置为其余部分。另外,让我们看看是否可以加快查询速度。 slug
有索引吗? (请提供
SHOW CREATE TABLE quizzes;
以及 slug
的基数。