诊断超快数据库的性能问题 ⚡
您是否曾担心,当遇到流量高峰时,您的数据库会作何反应?或者,对于不断增长的日活跃用户,您是否能保持高性能?当您的软件能够达到极快的速度时,配置的每个部分都需要协同工作来支持这些速度。
KeyDB 速度很快,这意味着我们经常遇到这些问题。由于各种硬件瓶颈,可能难以达到最佳性能,这让用户感到沮丧。然而,硬件问题可能很难调试,我们需要一种方法来持续诊断这些问题。在我们寻求这个问题的通用解决方案的过程中,我们发现了以下内容。
#
瓶颈的类型简单来说,数据库性能可能达不到标称值有三个原因。
- 发送到服务器的数据不足。 这是最常见的情况,但它本身并不是问题;这仅仅意味着您没有使系统饱和。
- 网络无法处理请求量。 这种情况仅在您的服务器和客户端不在同一台机器上时适用,但在这种情况下,它是一个常见的瓶颈。与您的数据库能够处理的数据量相比,网络可能相当慢,特别是取决于其配置。
- 托管服务器的计算机无法足够快地处理数据。 这不太可能是由于真正的硬件限制,特别是考虑到生产数据库服务器通常托管在相当强大的机器上。但是,某些 KeyDB 配置选项,如果未经过优化以利用其托管的硬件,可能会导致此问题。
那么,我们如何确定我们遇到了哪种瓶颈呢?嗯,我们可以从客户端和服务器两端获取信息,这意味着我们拥有所需的一切。我们可以简单地向服务器发送大量负载,检查客户端和服务器上的 CPU 使用情况以发现瓶颈,如果我们两者都没有发现,那么通过排除法,瓶颈就在服务器上。
另一个难题是,首先要确保我们发送了足够的负载来触及瓶颈。答案是,我们在一段时间内缓慢增加负载,同时检查处理操作的速率。一旦服务器每秒处理的操作量停止增加,我们就知道我们遇到了瓶颈——要么是因为它已达到最大负荷,要么是它没有收到我们试图发送的所有数据。

#
诊断原因一旦我们知道瓶颈所在,下一步该怎么做?为了成为一个有用的诊断,我们不仅需要确定瓶颈,还需要确定可能的原因和解决方案。
如果问题出在发送负载的客户端上,除了建议使用不同的机器进行测试外,没有太多可做的。这仅仅意味着当前的测试能力不足以正确诊断服务器的问题。
服务器的瓶颈更有趣。虽然服务器的硬件可能确实不够强大,无法跟上,但这是一个难以解决的问题,而且考虑到数据库服务器通常使用强大的硬件,这种情况相对不太可能。服务器配置是更可能的罪魁祸首。在这种情况下,我们可以运行一些启发式方法来尝试确定原因。我们可以执行配置设置扫描:将选项设置为一个值,运行瓶颈测试,记录最大性能,然后更改选项并重复。
例如,KeyDB 的大部分性能归功于多线程。如果 `server-threads` 选项设置的值不理想,性能可能会受到影响。通过扫描一系列可能的值并绘制性能结果图表,我们可以找到最佳设置。我们可以对其他相关配置设置重复此过程。请注意,理论上,一个选项的性能可能依赖于另一个选项。然而,将所有选项一起测试而不是一次一个地测试会使复杂性呈指数级增加,我们预计这种情况非常罕见,不会对结果产生太大影响。
最后是网络瓶颈。一旦我们确定瓶颈在网络上,有几件事需要考虑。首先,网络通常无法处理足以使 KeyDB 饱和的吞吐量,例如千兆网络。然而,也需要考虑一些配置问题,包括服务器和客户端之间的路由器、负载均衡和网络排队。
#
自动化流程对于技术性更强的读者来说,可能已经很明显,这样一个算法过程非常适合自动化,而这正是我们计划要做的。一个用于诊断性能问题的工具可以节省大量的时间和精力,无论是对用户还是对开发者。我们 KeyDB 最不希望看到的是,用户试用 KeyDB 后却没有看到所承诺的性能——尤其是在这是一个可以解决的问题时。随 KeyDB 二进制文件一起提供一个诊断工具,将允许用户独立解决他们的问题,而无需其他方的干预,希望能节省大量的时间和减少挫败感。
我们将构建一个专注于 KeyDB 的工具,因为这是我们最了解的。该工具将启动客户端线程,同时不断检查服务器负载和 CPU 使用情况,并且如上所述,等待其停止增加。然后我们可以确定瓶颈在哪里,并提供尽可能多的相关信息和可能的解决方案。
该工具目前正在开发中,我们希望在未来几周内发布第一个版本。我们计划随着时间的推移,在我们识别和诊断更多不常见问题时,不断为该工具添加新功能。
#
性能诊断要点研究这项任务的过程得出了几个关键点。
- 通过负载测试识别性能瓶颈。
- 使用基于过往经验建立的启发式方法来诊断问题并提供解决方案。
- 将所有过程自动化以实现最大效率!
这个简单的流程将使我们能够更快地帮助我们的用户并提供更好的结果。虽然我们的重点当然是 KeyDB,但这个通用理念没有理由不适用于任何遇到性能问题的数据库。无论您如何使用它,这种模式都将帮助您的数据库发挥其最大潜力!
#
保持关注 KeyDBKeyDB 是 Redis 的一个超强性能的直接替代品。我们现在有一个 社区 Slack 工作区 用于讨论任何与 KeyDB 相关的话题!要了解我们的最新动态,请关注我们的以下渠道之一