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脚本头部杀死所有睡眠过程..
所以每个访问我的网站都有助于消除睡眠过程
所以我同时运行了300个PHP进程,速度在每秒60-90之间(我的进程涉及3个查询)。 我把它提高到了400,而这个速度下降到每秒40-50。 我把它降到了200,并回到了60到90之间!
所以,对于这个问题的任何人,我的build议是尝试运行less于更多,看看是否改善。 将会有更less的内存和正在使用的CPU,所以运行的进程将具有更大的能力,速度可能会提高。