MySQL 在(本地)网络上的性能比我预期的要慢得多

use*_*241 5 mysql networking performance latency drupal

我的生产环境中的 MySQL 查询花费的时间也比我预期的要长得多。有问题的站点是一个相当大的 Drupal 站点,安装了许多模块。网络服务器 (Nginx) 和数据库服务器 (mysql) 托管在不同的机器上,通过 100mbps 的 LAN 连接(由 Rackspace 托管)连接。

我在我的笔记本电脑上运行完全相同的站点以进行开发。显然,在我的笔记本电脑上,网络服务器和数据库服务器在同一个机器上。

以下是我的数据库查询时间的结果:


生产:

在 320.33 毫秒内执行了 291 次查询。(主页)

在 999.81 毫秒内执行了 517 次查询。(内容页)

发展:

在 46.28 毫秒内执行了 316 次查询。(主页)

在 79.09 毫秒内执行了 586 次查询。(内容页)


从这些结果中可以清楚地看出,在我的笔记本电脑上查询 MySQL 数据库所涉及的时间要短得多,其中 MySQL 服务器与 Web 服务器运行在同一数据库上。

为什么是这样?!

一个因素必须是网络延迟。从 Web 服务器到数据库服务器的往返平均需要 0.16 毫秒(由 ping 显示)。必须将其添加到每个单个 MySQL 查询中。因此,以上面的内容页面为例,其中执行了 517 个查询。仅网络延迟就会使总查询时间增加 82 毫秒。但是,这并不能解释我所看到的差异(笔记本电脑上的 79 毫秒与生产盒上的 999 毫秒)。

我还应该考虑哪些其他因素?我曾考虑将 NIC 升级到千兆连接,但显然还涉及其他问题。

我已经从http://www.day32.com/MySQL/运行了 MySQL 性能调整脚本,它告诉我我的数据库服务器配置良好(显然比我的笔记本电脑好)。报告的唯一问题是“在 4394 个临时表中,48% 是在磁盘上创建的”。在两种环境和生产环境中都是如此,我什至尝试将 max_heap_table_size 和 Current tmp_table_size 增加到 1GB,没有任何变化(我认为这是因为我有一些 BLOB 和 TEXT 列)。

小智 6

这是因为如果数据库与前端不在同一台服务器上,您必须为每个查询进行一次往返(可能更多,取决于答案的大小)。ping 同一数据中心内的另一台服务器可能需要 1 毫秒的时间。如果两台服务器在同一个机架上,则更少,但 1 毫秒是一个很好的经验法则。

这意味着对于大约 300 个小查询,您应该期望大约 300 毫秒,非常接近您所看到的。

如果两台服务器在同一台机器上,你只需要在进程之间做一些上下文切换,就可以将数据从数据库进程移动到前端。通常一个上下文切换(所有典型的刷新)需要大约 40us(非常广泛地说),你至少需要几个(前端请求数据,DB 读取请求并准备和提供数据,前端读回数据)。所以我希望每个查询约 80us(让我们将其四舍五入到 0.1ms 以使数学更容易)。因此,对于 300 个小查询,您可以期待大约 30 毫秒,这也与您所看到的非常接近。


Mor*_*ven 0

您是否启用了查询缓存?看一下输出:

SHOW VARIABLES LIKE 'query_cache_size';
Run Code Online (Sandbox Code Playgroud)

如果它大于零,则它已打开。这将对 MySQL 支持的网站的性能产生很大的影响,尽管我不确定这是否与您的具体问题有关。

我不认为有任何方法可以捕获查询集并从 MySQL 数据库服务器上的登录名运行它们,以查看那里的情况是否有所不同?

另一个可能的问题是,如果您不进行会话缓存,则每次进行数据库调用时都会打开一个新会话。你知道你是否在缓存会话吗?为每个呼叫打开一个新会话在整个网络中的成本可能会很高。