1

最近,我开始在高流量时收到 mySQL“连接过多”错误。我的 rails 应用程序在一个共享主机上有 2 个实例的 mongrel 集群上运行。最近的一些变化可能会推动它:

  • 我网站的访问量增加了。我现在平均每天大约 4K 页。
  • 数据库大小增加了。我最大的表有 ~ 100K 行。在最坏的情况下,一些关联可能会返回数百个实例,尽管大多数情况要少得多。
  • 我添加了一些功能,在某些操作中增加了数据库调用的数量和大小。

我已经进行了代码审查,以减少数据库调用、优化 SQL 查询、添加缺失的索引以及使用 :include 进行预加载。但是,我的许多方法仍然会进行 5-10 次单独的 SQL 调用。我的大多数动作的响应时间约为 100 毫秒,但我最常见的动作之一平均为 300-400 毫秒,有些动作随机峰值超过 1000 毫秒。

日志没有什么帮助,因为错误似乎是随机发生的,或者至少该模式似乎与调用的操作或访问的数据无关。

我可以通过添加额外的 mongrel 实例来缓解错误吗?还是 mySQL 连接受服务器限制,因此与我划分流量的进程数无关?

这很可能是我的编码问题,还是我应该按我的主机来增加共享服务器上的容量/减少负载?

4

3 回答 3

2

自 Rails 2.2 以来,ActiveRecord 就已经汇集了数据库连接,这很可能是导致您的连接过多的原因。pool尝试在您的环境中调低 的值database.yml(默认为 5)。

文档可以在这里找到。

于 2011-03-15T22:26:11.963 回答
1

你在缓存什么吗?它是减轻应用程序和数据库负载的重要部分。Rails 指南中有一个关于缓存的部分。

于 2011-03-15T20:36:07.100 回答
1

出了点问题。一个 Mongrel 实例一次处理 1 个请求,因此如果您有 2 个 Mongrel 实例,那么您应该不会看到超过 2 个活动的 MySQL 连接(至少来自 mongrel)

您可以随时间记录或绘制 SHOW STATUS LIKE 'Threads_connected' 的输出。

PS:这不是很多杂种。如果您希望能够同时处理 2 个以上的请求,那么您将需要更多。...如果内存紧张,您可以切换到 Phusion Passenger 和 REE。

于 2011-03-15T20:43:20.480 回答