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

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

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

这里是我的数据库查询时间的结果:


生产:

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

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

发展:

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

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


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

为什么是这样?!

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

我还应该考虑哪些其他因素? 我曾想过将网卡升级为千兆连接,但显然还有其他一些问题。

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

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

这意味着对于大约300个小的查询,你应该预计〜300ms,非常接近你所看到的。

如果两台服务器在同一台机器上,则只需在进程之间进行一些上下文切换,以将数据从数据库进程移动到前端。 通常情况下,上下文切换(具有所有典型的刷新)需要大约40us(非常广泛地说),并且至less需要其中的一些(前端请求数据,数据库读取请求并准备和提供数据,而前端读回数据)。 所以我预计~80us每个查询(让我们绕它0.1ms,使math更容易)。 因此,对于300个小的查询,您可以预计〜30ms,这与您所看到的非常接近。

真的很难给你一个明确的答案。 我真的不认为networking是瓶颈,除非你有一些真正的stream量在服务器上。

你的开发机器和生产服务器上的configuration是否相同?

你确定所有的索引都是在生产服务器上成功创build的吗?

这可能是生产服务器中的数据量。 我的意思是比较生产和开发机器之间的结果,你应该在表中有相同的行数,这是这种情况?

您是否使用相同的安装文件在您的开发机器和生产服务器上设置MySQL? 我的意思是你的开发和生产机器上都有相同版本的MySQL? 这是同一个操作系统吗? 还32位或64位? 可能是安装在服务器上的MySQL版本中的一个错误。

可能性是无止境的,没有更多的细节,真的很难给你一个翔实的答案。

唯一报告的问题是“在4394个临时表中,48%是在磁盘上创build的”。 这是真的在这两个环境和生产环境我甚至尝试增加max_heap_table_size和当前tmp_table_size到1GB,没有任何改变(我认为这是因为我有一些BLOB和TEXT列)。

你可以把MySQL的tmpdir放在一个基于RAM的filesys(例如tmpfs)上来帮助提高性能。

干杯

PS

也许性能打击是在生产中的RAID写入。

你有查询caching启用? 看看输出:

SHOW VARIABLES LIKE 'query_cache_size'; 

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

我不认为有什么办法可以捕获这些查询,并从MySQL数据库服务器上的login中运行它们来查看是否有不同的东西?

另一个可能的问题是,如果你没有进行会话caching,那么每次进行数据库调用时都会打开一个新的会话。 你知道你是否会话caching吗? 打开每个电话的新会话可能会在整个networking中变得昂贵。

我会做什么来确定瓶颈在哪里:我会做一个查询分析: http://dev.mysql.com/doc/refman/5.0/en/show-profiles.html : http://dev.mysql.com/doc/refman/5.0/en/show-profiles.html

如果数字低于您在Web服务器上运行的相同查询所看到的数字,那么这是一个“传输”问题。 (Rackspacenetworking延迟,切换configuration,返回的TEXT / BLOB字段的大型数据集(SELECT *)等)

如果数字几乎相同,则必须优化查询并改进configuration文件。 这里是一个链接,可能会有所帮助: https : //stackoverflow.com/questions/1191067/how-to-test-mysql-query-speed-with-less-inconsistencies/1191506#1191506

顺便说一句,当我的服务器从100Mbs到1Gb,性能的提高是惊人的!

在本地主机上工作时,TCP连接build立和拆除比套接字连接成本高得多。 检查页面加载时启动的数据库连接数量。