MySql Proccesslist中充满了导致“连接太多”的“睡眠”条目?

我想请问你的帮助与PHP / MySQL连接长期存在的问题。

每次我执行一个“SHOW PROCESSLIST”命令,它都会向我们展示从我们的5个Web服务器出现的数据库服务器的大约400个闲置(状态:睡眠)连接。

从来没有太多的问题(我没有find一个快速的解决scheme),直到最近的stream量数量增加,从那以后,MySql反复报告“到多个连接”的问题,即使这些连接的350多个处于“睡眠”状态。 此外,即使有睡眠连接到同一台服务器,服务器也无法获得MySQL连接。

所有这些连接消失,当一个Apache服务器重述。

用于创build数据库连接的PHP代码使用普通的“mysql”模块,“mysqli”模块,PEAR :: DB和Zend Framework数据库适配器。 (不同的项目)。 没有任何项目使用持续连接。

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

我的问题:

为什么睡眠状态下有这么多的连接,我怎么能防止这种情况。

谢谢你的时间,如果有什么不清楚或缺less,请让我知道

– 更新:

一次运行的Apache请求的数量从来没有超过50个并发请求,所以我想有一个问题closures连接或Apache保持端口打开没有附加phpscript或什么(?)

my.cnf万一有帮助:

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 

基本上,您在以下情况下可以进入睡眠状态:

  • 一个PHP脚本连接到MySQL
  • 一些查询被执行
  • 然后,PHP脚本做了一些需要时间的东西
    • 而不从DB断开
  • 最后,PHP脚本结束
    • 这意味着它从MySQL服务器断开

所以,当你有很多保持连接的PHP进程时,通常最终会有很多处于睡眠状态的进程,而实际上在数据库端没有做任何事情。

一个基本的想法是:确保没有运行时间过长的PHP进程,或者一旦不再需要访问数据库就迫使它们断开连接。

另一件事,我经常看到什么时候在服务器上有一些负载:

  • 有越来越多的请求到Apache
    • 这意味着要生成许多页面
  • 每个PHP脚本,为了生成一个页面,连接到数据库并做一些查询
  • 随着数据库服务器上的负载增加,这些查询需要越来越多的时间
  • 这意味着更多的进程不断积累

可以帮助您的解决scheme是减less查询时间 – 优化最长的时间。

好吧,在尝试了所有的解决scheme后,在wordpress博客上解决这个问题,我可能做了一些非常愚蠢的事情,或者天才……不知道为什么有一个增加的Mysql连接,我用下面的php脚本头部杀死所有睡眠过程..

所以每个访问我的网站都有助于消除睡眠过程

 <?php $result = mysql_query("SHOW processlist"); while ($myrow = mysql_fetch_assoc($result)) { if ($myrow['Command'] == "Sleep") { mysql_query("KILL {$myrow['Id']}");} } ?> 

所以我同时运行了300个PHP进程,速度在每秒60-90之间(我的进程涉及3个查询)。 我把它提高到了400,而这个速度下降到每秒40-50。 我把它降到了200,并回到了60到90之间!

所以,对于这个问题的任何人,我的build议是尝试运行less于更多,看看是否改善。 将会有更less的内存和正在使用的CPU,所以运行的进程将具有更大的能力,速度可能会提高。