11

我在高负载时间看到了其中一些错误:

mysql_connect() [<a
href='function.mysql-connect'>function.mysql-connect</a>]: [2002] Resource
temporarily unavailable (trying to connect via
unix:///var/lib/mysql/mysql.sock)

据我所知,mysql 服务器没有达到其最大连接数限制,但还有其他东西阻止它为查询提供服务。MySQL 还会遇到哪些其他限制?

我正在使用 MySQL 5.5.21 运行 RHEL 6.2 64 位

4

4 回答 4

26

假设您的系统当前是基于 Unix 的(如您的问题陈述中所述)。如果这是正确的,那么您可能会遇到以下问题:

  1. 您已经用完了MySQL 可用的内存。

    这是您最可能面临的问题。MySQL 连接池中的每个连接都需要内存才能运行,如果此资源耗尽,则无法建立进一步的连接。当然,如果您发现这是一个问题,则可以调整各种操作的内存占用和最大数据包大小。my.cnf

    这是一个可以帮助您的附加线程,但您也可以考虑使用更简单的分析工具,例如top对正在发生的事情进行良好的大致估计。

  2. 您的 MySQL 用户帐户可用的文件描述符已用完。

    另一个常见问题:如果您尝试为要求文件 IO 超过 1,024 边界(默认情况下)的请求提供服务,您将遇到操作简单失败的情况。这是因为大多数系统都对每个用户一次可以拥有的打开文件描述符的数量指定了软限制和硬限制,超过这个阈值可能会导致问题。

    这通常会在您的日志文件中表达出一系列明显的迹象。检查/var/log/messages和您的可比较目录(例如,/var/log/mysql看看您是否能找到任何有趣的东西。

  3. 您遇到了线程无法满足的活锁或死锁场景。

    内存和文件描述符耗尽的必然结果是,如果您超出了系统能够处理的计算负载,线程可能会超时。它不会抛出此错误消息,但这是将来要注意的事情。

  4. 您的系统已用完可用于 的 PID fork

    另一个常见的场景:fork在任何给定时间只有这么多的 PID 可供使用。如果您的系统只是overforked,它将不再能够为请求提供服务。

    最简单的检查是查看是否有任何其他服务可以连接到机器。例如,尝试通过 SSH 连接到盒子并发现无法连接是一个很大的线索。

  5. 上游代理或连接管理器已用完资源并停止服务请求。

    如果您的客户端和 MySQL 之间有任何服务层,则需要检查它是否已崩溃、挂起或以其他方式变得不稳定。上述建议适用。

  6. 在 65,536 个连接之后,您的端口映射器已经耗尽。

    不太可能,但又是一个可能的疲惫案例。如上所述检查琐碎的服务连接,嗯,这里也是最好的停靠港。

简而言之:这是一个资源耗尽的场景,包括服务器只是“停机”。您将不得不进一步分析您的系统以查看您正在阻止的内容。在这种情况下,给我们的所有错误消息都是资源对客户端不可用的事实——我们需要查看有关服务器的更多信息以确定更充分的补救措施。

于 2012-04-15T21:08:50.023 回答
3

我仍然没有找到它所达到的限制,但我确实设法解决了这个问题。使用 MEMORY 引擎的会话表(在 vbulletin 中)存在问题。该表的索引是 HASH,因此当 vbulletin 每小时清除一次该表时,它会将表锁定足够长的时间以阻止其他查询并将 mysql 推到其资源的限制。

通过将索引更改为 BTREE,这允许 MySQL 更快地从会话表中删除行,并避免之前达到的任何限制。当我们将主数据库服务器升级到 MySQL 5.5 时,错误才开始出现,所以我猜 MEMORY 表在最新版本中的处理方式有所不同。

请参阅http://www.mysqlperformanceblog.com/2008/02/01/performance-gotcha-of-mysql-memory-tables/了解使用 BTREE 索引而不是 HASH For MEMORY 来提高速度的信息。

于 2012-04-26T02:56:14.147 回答
2

哎呀,这可能是很多事情。可能是套接字缓冲区空间已用完。可能mysql是接受连接的速度不如它们进入的速度并且达到了积压限制(尽管我希望这会给您一个“拒绝连接”错误,但我不确定您会这样获取 Unix 域套接字)。这可能是@MrGomez 指出的任何事情。

由于您在同一台服务器上运行 Apache 和 MySQL,这在高负载下是一个问题,很可能是 Apache 正在耗尽系统的某些资源,而您只是没有看到(注意到?)丢弃/失败的传入连接/请求在您的日志中。

你在使用连接池吗?如果没有,我会从那里开始。

我还会在 Apache 日志和 syslog 中与 mysql_connect 错误同时查找错误,看看还会出现什么。我特别建议将 MySQL 转移到它自己独立的专用服务器上。

于 2012-04-19T04:47:00.217 回答
0

就我而言,我正在使用(PHP 驱动程序)处理JSON数据类型。PDOfetch用来检索一项但忘记添加LIMIT 1到查询中。添加它解决了这个问题。

于 2019-07-12T16:20:12.797 回答