我会尽量简短并且仍然完整。 Thx提前为那些花费宝贵的时间指出我一个可能的解决方案。LAMP max_connections,睡眠进程,锁定进程,等待超时,内存不足
在Ubuntu环境下的PHP/Mysql应用程序。
原始发行日期:
Keep getting error 'to_many_connections'.
当我检查:
show processlist;
有很多睡眠过程。所以我想这些是to_many_connections错误的原因,因为他们阻止任何新的传入连接。
改变MySQL的设置:
Raise max_connections from 250 to 400;
lower wait_timeout from 60 to 15;
连接似乎工作,但现在我的Apache是内存霸占。 只需更改这2个设置即可从11G变为25G以上。 我无法想象150个额外的mysql_connections占用14G的额外内存? 我也不希望wait_timeout设置较低,以增加apache的内存使用量。它应该在内存中使用较少的内存少连接?我期望过程使用量上升,但不是记忆。当然不是那么多。
试图realtering MySQL的设置:
keep max_connections at 400
raise wait_timeout to 30 sec
内存使用率下降,约5分钟,但之后再次上升。
其他说明:
我注意到有很多锁定过程一定 表。 (mysql:show processlist;) 更新:表是MyISSAM表。
我也改变了一些数据库实现,这并不理想,有些页面使用2个连接到数据库,因为我们正在经历一个代码重构阶段。 从功能的mysql_query切换到PDO功能
更新:
新PDO功能已专门设置为false(即使它默认为false) 旧版本的MySQL功能不使用持久连接持久连接无论是。
public function __construct($dbname, $username, $password) { parent::__construct('mysql:hostname=localhost;dbname=' . $dbname . ';', $username, $password, array( PDO::ATTR_PERSISTENT => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8;" )); }
我很清楚地知道,使该数据库中的几个连接远非最佳实践,但我们目前的应用程序丢失的设计模式了很多,一切仍是程序性的,没有MVC,没有OOP 。 我有责任做这些实践,因为我的雇主想要结果,并且此时并没有打算对我们的应用程序进行完全重写,以使用应该早已实施LOONG的设计/编码标准。 无论如何我会很惊讶,如果这个代码将是真正的原因,因为它已经运行完美了一个多星期,并且由于讨价还价的期限(在1个月的巨大的一个月的巨大访问量在我们的商店讨价还价/优惠)。
任何有关此事的见解将不胜感激。至于这一点,我不知道下一步可能会解决这个问题。
update2 已关闭,因为已发现该问题,但与原始帖子无关。
我不是一个服务器专家,但我知道我已经安装服务器缓存前一段时间。但我不认为这与连接问题有什么关系?缓存不足意味着页面加载速度较慢。但我没有加载页面,因为我无法连接到数据库。还更新了原始主题以更好地指定信息。 – Bodybag
upvoted for nice info。虽然显然这个问题是由同事雇员实施的一些代码造成的(最初的高峰期,与数据库连接无关)。仍然需要找出实际泄漏/错误,但至少找到了原因。感谢您花时间阅读我的问题! – Bodybag
不客气,虽然我不得不承认自己已经被骗了,并且把它从头顶拉了下来;) – CodeMonkey