我会尽量简短,但仍然完整。提前感谢那些花费宝贵时间向我指出可能的解决方案的人。
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 的内存使用量。它应该在内存中保持更少的连接,因此使用更少的内存?我预计进程使用率会上升,但内存不会。当然不是那些巨额。
尝试重新设置 mysql 设置:
keep max_connections at 400
raise wait_timeout to 30 sec
内存使用量下降了大约 5 分钟,但之后又上升了。
其他注意事项:
我注意到某个表有很多锁定的进程。(mysql: show processlist;) update: table 是一个 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。我有义务这样做,因为我的雇主想要结果,并且此刻,无意对我们的应用程序进行完全重写,以使用很久以前就应该实施的设计/编码标准。 无论如何,如果这段代码是真正的原因,我会感到惊讶,因为它已经运行了一个多星期,而且由于讨价还价期(1 个月的巨额讨价还价/交易),我们在那一周进行了大量访问在我们的商店)。
对此事的任何见解将不胜感激。截至目前,我不知道下一步可能会解决这个问题。
update2 因发现问题而关闭,但与原始帖子无关。