首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySql进程列表中填满了导致“连接过多”的“睡眠”条目?

MySql进程列表中填满了导致“连接过多”的“睡眠”条目?
EN

Stack Overflow用户
提问于 2010-03-09 17:02:58
回答 6查看 143.3K关注 0票数 73

我想请你帮我解决一个长期存在的php/mysql连接问题。

每次我执行"SHOW PROCESSLIST“命令时,它都会显示从我们的5个400服务器中出现的大约400个到数据库服务器的空闲(状态:睡眠)连接。

这从来不是一个大问题(我也没有找到一个快速的解决方案),直到最近流量增加,从那时起,MySQL反复报告“到多个连接”的问题,即使这些连接的350+处于“睡眠”状态。此外,即使存在到同一台服务器的休眠连接,服务器也无法获得MySQL连接。

当apache服务器被重新声明时,所有这些连接都会消失。

用于创建数据库连接的PHP代码使用普通的"mysql“模块、"mysqli”模块、PEAR::DB和Zend Framework Db Adapter。(不同的项目)。这些项目都不使用持久连接。

提高连接限制是可能的,但似乎不是一个好的解决方案,因为现在是450,而且一次只有20-100个“真正”的连接。

我的问题是:

为什么有这么多处于睡眠状态的连接,我如何防止它?

--更新:

一次运行的Apache请求的数量永远不会超过50个并发请求,所以我猜可能是关闭连接或apache在没有附加phpscript的情况下保持端口打开,或者其他什么(?)

my.cnf以防对您有帮助:

代码语言:javascript
复制
innodb_buffer_pool_size = 1024M

max_allowed_packet = 5M
net_buffer_length = 8K

read_buffer_size = 2M
read_rnd_buffer_size = 8M

query_cache_size = 512M
myisam_sort_buffer_size = 128M

max_connections = 450
thread_cache = 50
key_buffer_size = 1280M
join_buffer_size = 16M

table_cache = 2048
sort_buffer_size = 64M
tmp_table_size = 512M
max_heap_table_size = 512M

thread_concurrency = 8

log-slow-queries = /daten/mysql-log/slow-log
long_query_time = 1
log_queries_not_using_indexes

innodb_additional_mem_pool_size = 64M
innodb_log_file_size = 64M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 2
innodb_file_per_table
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-03-09 19:50:24

基本上,在以下情况下,您会在睡眠状态下获得连接:

  • PHP脚本连接到MySQL
  • 执行一些查询
  • 然后,PHP脚本在不断开与
    • 的连接的情况下执行一些需要时间的操作

  • ,最后,PHP脚本结束
    • ,这意味着它将断开与MySQL PHP的连接

因此,当您有许多保持连接的PHP进程时,您通常会使许多进程处于睡眠状态,而实际上并没有在数据库端执行任何操作。

因此,一个基本的想法是:确保PHP进程不会运行太长时间--或者强制它们在不再需要访问数据库时立即断开连接。

另一件事是,当服务器上有一些负载时,我经常看到:

对于generate来说,越来越多的请求进入

    • ,这意味着很多页面

由于DB服务器increases

  • Which上的负载意味着更多的进程不断堆叠
  • ,为了生成页面,每个PHP脚本都会连接到DB,并且某些

查询会花费越来越多的时间,这意味着会有更多的进程堆叠

一个有用的解决方案是减少查询所用的时间--优化最长的查询。

票数 83
EN

Stack Overflow用户

发布于 2019-10-07 11:24:46

上面的解决方案类似于运行查询

代码语言:javascript
复制
SET session wait_timeout=600;

只有在重启mysql之后才能工作。对于持久的解决方案,编辑mysql.conf并在mysqld之后添加

代码语言:javascript
复制
wait_timeout=300
interactive_timeout = 300

其中300是您想要的秒数。

票数 7
EN

Stack Overflow用户

发布于 2018-09-19 18:10:12

增加最大连接数不会解决问题。

我们在我们的服务器上也遇到了同样的情况。这就是发生的事情

用户打开页面/视图,连接到数据库,查询数据库,仍然查询(查询)未完成,用户离开页面或移动到其他页面。因此,如果有更多的用户连接到数据库并执行类似的操作,则打开的连接将保持打开状态,并保持不断增加的连接数量。

您可以设置interactive_timeout MySQL,默认为28800 (8小时)到1小时

代码语言:javascript
复制
SET interactive_timeout=3600
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2407732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档