网站运行过程中,在mysql进程列表中,看到有几个进程的“命令”列标记为“SLEEP”。
我应该担心吗?如何阻止这种情况?
答案1
即使我们中最强大的人有时也需要睡眠。没有睡眠,人就会变得焦虑,失眠会导致各种严重的症状。
更严重的是:睡眠状态意味着 MySQL 进程已完成查询,但客户端尚未退出。许多 Web 应用程序事后不会清理连接,这会导致 MySQL 进程处于睡眠状态。如果只有少数几个进程,也不用担心;MySQL 会在可配置的超时期限(wait_timeout)后清理这些进程。
或者,如果您的 Web 应用程序使用持久连接和连接池,那么拥有大量休眠进程也是非常正常的:在这种情况下,您的应用程序只会打开例如 100 个 SQL 连接并保持它们打开。这减少了连接打开/关闭开销。除非您的应用程序非常繁忙,否则几乎不是每个 SQL 进程都有事可做,所以它们处于休眠状态,这是很正常的。
答案2
不,除非您有数千个,否则不必担心它们。通常它们表示数据库连接当前没有执行任何操作,但仍然处于活动状态。
许多网站都是这样构建的:在开始处理页面时,会打开一个数据库连接,然后在整个页面生成过程中使用,最后丢弃。如果丢弃操作正确完成,数据库连接将关闭,然后服务器将终止相关线程,这意味着该连接将从进程列表中消失。
如果连接未关闭,则可能会一直处于“休眠”状态,直到超时。在这种情况下,您可能会得到大量休眠进程。但除非您在数据库服务器上遇到内存问题,否则这也不是什么大问题。
答案3
在增加 max_connections 变量之前,您必须通过运行 show processlist 命令来检查有多少个非交互式连接。
如果您有许多睡眠连接,您必须减少“wait_timeout”变量的值,以便在等待一段时间后关闭非交互式连接。
- 显示 wait_timeout 值:
显示会话变量如'wait_timeout'; +---------------+-------+ | 变量名称 | 值 | +---------------+-------+ | 等待超时 | 28800 | +---------------+-------+
该值以秒为单位,即表示非交互式连接仍可持续长达8小时。
- 要改变“wait_timeout”变量的值:
设置会话wait_timeout=600; 查询成功,影响 0 行(0.00 秒)
10 分钟后,如果睡眠连接仍然处于睡眠状态,mysql 或 MariaDB 将删除该连接。
答案4
对于一些会面临相同问题的搜索者来说。在某些情况下,它可能会导致问题。例如,在我的情况下,它是“锁定事务异常”,即使在我杀死锁定进程后也会出现。我只有在杀死所有“睡眠”进程后才解决了这个问题。此外,您可以查看此答案下的第一条评论,看起来它在某些情况下可能会导致问题 https://stackoverflow.com/a/16861630/4207348