2013-01-09 25 views
0

我会尽量简短并且仍然完整。 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 已关闭,因为已发现该问题,但与原始帖子无关。

回答

1

我为你感到这些大问题!我将芯片与几件事情,看看你是否已经尝试

  • 重:Apache的记忆 - 我的Apache测试我最近在做,实际上指向降低MaxClients的数目,下一个AB或攻城测试我实际上在测试环境中获得了更好的性能,使用~12而不是256.虽然这是非常多的开发环境,而不是生产到目前为止

  • 关于锁定的mysql进程,您使用的是哪种表类型?我相信MyIsam比InnoDB更容易发生锁定问题。 MyISAM数据表是锁定,其中InnoDB的是排IIRC

  • 我注意到你写

    新PDO功能已设置为false

持久连接正在使用的持久连接旧代码?我从来没有多少运气或为他们使用

  • 你有多少缓存?你有mysql查询缓存启用,如何在webserver和mysql之间使用memcache或nosql系统?

我知道很多人会说memcache等不是缓慢/崩溃的应用程序的解决方案,但如果它给你更多的呼吸空间,为什么不呢?当缓存不是缓存时,还有一些理念:例如,我使用redis.io,它可以存储在内存中,但也可以保存到光盘上,无论何时管理系统更新mysql,它也更新这个“缓存”,它在数据存活的时间内保持不变 - 最小化热点问题 - 并且始终到目前为止没有滞后。从理论上讲,它可以感觉有点像一个警察回避这样的东西,但redis比我们设法得到mysql在我们的环境中执行相同任务的速度快6倍(开箱即用)...

更新 我看你使用的是myisam,所以任何锁定问题都可以归结为,iirc更新会锁定整个表的持续时间,这可能会导致查询堆积起来,雪球和每一个回落

re:缓存层 缓存可以回避/推迟问题,因为您将连接到数据库更少,我有一些页面根本不连接!我可以从字面上做一个mysqld停止,他们仍然工作,即使他们在技术上的动态

相关提示你连接到数据库经常在页面的顶部或仅在需要时?

更新 额外的评论让我想起了一个类似的问题,我有一个时间,其中一个XML饲料(即在页面请求跑 - 无法预缓存由于政治!)从第三方供应商将运行缓慢就像网站的其他部分会变得忙碌起来一样,慢速的XML提要会导致瓶颈与Apache进程绑定并使服务器变慢,这意味着有些人不会等待他们的页面完成,但数据库仍然会尝试提供的信息中断请求以及新的,所以它首先看起来像一个数据库问题

+0

我不是一个服务器专家,但我知道我已经安装服务器缓存前一段时间。但我不认为这与连接问题有什么关系?缓存不足意味着页面加载速度较慢。但我没有加载页面,因为我无法连接到数据库。还更新了原始主题以更好地指定信息。 – Bodybag

+0

upvoted for nice info。虽然显然这个问题是由同事雇员实施的一些代码造成的(最初的高峰期,与数据库连接无关)。仍然需要找出实际泄漏/错误,但至少找到了原因。感谢您花时间阅读我的问题! – Bodybag

+0

不客气,虽然我不得不承认自己已经被骗了,并且把它从头顶拉了下来;) – CodeMonkey