Mysql资源暂时不可用

Noo*_*les 10 mysql

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

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)
Run Code Online (Sandbox Code Playgroud)

从我可以告诉我的mysql服务器没有达到其最大连接限制,但还有其他东西阻止它提供查询.MySQL会遇到什么其他限制?

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

MrG*_*mez 23

假设您的系统目前基于Unix(如问题陈述中所示).如果这是正确的,这里是您可能遇到的一组问题:

  1. 你的内存已用完了MySQL.

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

    这里有一个可以帮助的附加线程,但您也可以考虑使用更简单的分析工具top,以便对正在发生的事情进行良好的估算.

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

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

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

  3. 您遇到了线程不可满足的活锁或死锁场景.

    如果你超越了系统能够处理的计算负荷,线程可能会超时,因为内存和文件描述符耗尽.它不会抛出此错误消息,但这是将来需要注意的事项.

  4. 您的系统没有可用的PID fork.

    另一种常见情况:fork在任何给定时间只能使用如此多的PID.如果您的系统只是过度加载,它将不再能够为您提供服务.

    最简单的检查是查看是否有任何其他服务可以连接到机器.例如,尝试SSH进入框并发现你不能是一个很大的线索.

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

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

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

    不太可能,但再一次,可能是穷尽的情况.如上所述,检查琐碎的服务连接,也就是这里最好的停靠点.

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


Noo*_*les 3

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

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

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