【发布时间】:2010-03-09 09:02:57
【问题描述】:
我想就一个长期存在的 php/mysql 连接问题寻求您的帮助。
每次我执行“SHOW PROCESSLIST”命令时,它都会显示大约 400 个空闲(状态:睡眠)连接到来自我们的 5 个 Web 服务器的数据库服务器。
这从来都不是什么大问题(而且我没有找到快速的解决方案),直到最近流量增加,从那时起 MySQL 反复报告“to many connections”问题,即使这些连接中有 350 多个在“睡眠”状态。即使与同一台服务器存在休眠连接,服务器也无法获得 MySQL 连接。
当 apache 服务器重新启动时,所有这些连接都会消失。
用于创建数据库连接的 PHP 代码使用普通的“mysql”模块、“mysqli”模块、PEAR::DB 和 Zend Framework Db 适配器。 (不同的项目)。没有一个项目使用持久连接。
提高连接限制是可能的,但似乎不是一个好的解决方案,因为它现在是 450,而且一次只有 20-100 个“真实”连接。
我的问题:
为什么有这么多处于睡眠状态的连接,我该如何防止呢?
-- 更新:
一次运行的 Apache 请求的数量从不超过 50 个并发请求,所以我猜是关闭连接有问题,或者 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
【问题讨论】: