我是否应该担心进程列表中的 mysql 睡眠状态进程

Hao*_*Hao 14 mysql

在网站运行过程中,在mysql进程列表中,我看到几个进程的“command”列标记为“SLEEP”。

我应该担心吗?如何阻止这个?

Jan*_*nen 27

即使是我们中最强大的人,有时也需要睡觉。不睡觉就会焦虑,失眠会导致各种严重的症状。

更严重的是:睡眠状态意味着 MySQL 进程已完成其查询,但客户端尚未退出。许多 Web 应用程序之后不会清理它们的连接,这会导致 MySQL 进程休眠。如果只有少数几个,请不要担心;MySQL 将在可配置的超时时间 (wait_timeout) 后清理它们。

或者,如果您的 Web 应用程序使用持久连接和连接池,那么即使有很多休眠进程也是完全正常的:在这种情况下,您的应用程序只需打开例如 100 个 SQL 连接并保持它们打开。这减少了连接打开/关闭的开销。除非您的应用程序非常繁忙,否则几乎不是每个 SQL 进程都有事可做是正常的,因此它们会休眠。

  • 就我而言,我有 10 个休眠连接,其中最大的一个是 271 秒,而且我遇到 MySQL CPU 使用率高的问题(90%),我的休眠连接会导致这种情况吗?请 (3认同)

wol*_*gsz 8

不,不要担心它们,除非你有成千上万个。通常,它们表示当前未执行任何操作但仍处于活动状态的数据库连接。

许多网站的构建方式是,在开始处理页面时,会打开一个数据库连接,然后在整个页面生成过程中使用,最后在最后丢弃。如果丢弃正确完成,数据库连接将关闭,然后服务器将杀死相关线程,这意味着该连接从进程列表中消失。

如果连接没有关闭,它可能会一直处于“睡眠”状态,直到超时。在这种情况下,您可能会遇到很多睡眠过程。但是除非您在 db 服务器上遇到内存问题,否则这也不是什么大问题。


小智 5

在增加 max_connections 变量之前,您必须通过运行 show processlist 命令检查有多少个非交互式连接。

如果您有很多睡眠连接,则必须减小“wait_timeout”变量的值以在等待一段时间后关闭非交互式连接。

  • 显示 wait_timeout 值:
显示会话变量,例如“wait_timeout”;

+---------------+--------+
| 变量名 | 价值|
+---------------+--------+
| 等待超时| 28800 |
+---------------+--------+

该值以秒为单位,表示非交互式连接仍长达 8 小时。

  • 要更改“wait_timeout”变量的值:
设置会话 wait_timeout=600;
查询正常,0 行受影响(0.00 秒)

10 分钟后,如果睡眠连接仍在睡眠,则 mysql 或 MariaDB 会删除该连接。