【问题标题】:mySQL "Too many connections" error influenced by number of mongrel instances?受杂种实例数量影响的mySQL“连接太多”错误?
【发布时间】:2011-07-16 02:46:42
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: mysql ruby-on-rails mongrel-cluster


    【解决方案1】:

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

    文档可以在here找到。

    【讨论】:

    • 这超出了我的理解水平。减少池不会使瓶颈变得更糟吗?
    • 减少池将消除与MySQL服务器建立“太多连接”的问题;您可以通过SHOW PROCESSLIST查看您正在使用的数量
    • SHOW PROCESSLIST 显示了 2 个 ID,都是空闲的,加上进程列表查询。因为我正在运行 2 个 mongrel 实例,所以这是有道理的。
    【解决方案2】:

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

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

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

    【讨论】:

    • mySQL 连接数限制为 150。如果我每个 Mongrel 实例只能消耗 1 个连接,那么合乎逻辑的结论是托管服务提供商有太多应用程序共享一个数据库服务器吗?
    • 可能 - 除非您使用 ActiveRecord 连接做一些不寻常的事情。您可以通过登录数据库并运行“show processlist”来检查 - 您应该能够看到您的连接列表(即使您的权限受到限制)。 PS - 我很确定连接池不会发挥作用,因为您使用的是 Mongrel 而不是在多线程环境中运行。
    • 我正在向我的房东开一张支持票,看看它是否已经结束。
    • 我的托管服务提供商说“也许您的网站对于共享服务器来说太受欢迎了。您想购买 VPS 计划。”哈哈
    【解决方案3】:

    你在缓存什么吗?它是减轻应用程序和数据库负载的重要部分。 Rails Guides have a section on caching

    【讨论】:

    • 我现在不缓存,但我一直在努力这样做。不幸的是,每个用户和日期的大部分内容都会发生变化。我可以缓存一些常见的片段,但性能提升最多是递增的。不过,我绝对打算这样做。每一点都有帮助。
    • 缓存特定于用户并经常显示给他们的数据并使用清扫器使其过期,因此一切仍然是最新的,这并没有错。只需确保根据用户 ID 对这些缓存进行键控,这样用户就不会看到其他人的数据。
    • 我会在有用的地方做。问题是数据的一小部分经常向用户显示。每次用户访问时,大多数数据都会发生变化。所以回报将是微乎其微的。
    • 对一些常见的可重用项目(例如下拉列表)进行选择性片段缓存,以及优化我的一些成本更高的 SQL 查询,似乎已经缓解了这个问题。
    猜你喜欢
    • 2010-11-15
    • 2017-10-29
    • 2015-03-24
    • 2013-05-07
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    相关资源
    最近更新 更多