LAMP max_connections,睡眠进程,锁定进程,等待超时,内存不足

时间:2013-01-09 09:26:27

标签: php mysql apache memory-management database-connection

我会尽量简短并且仍然完整。对于那些花费宝贵时间指出我可能的解决方案的人来说,提前


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;

连接似乎有效,但现在我的阿帕奇正在记忆中。 只需更改这两个设置,它就从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;)       更新:表是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 已找到问题但已关闭,但与原始帖子无关。

1 个答案:

答案 0 :(得分:1)

我觉得你有这些大问题!如果你尝试过,我会介绍几件事情。

  • re: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进程并减慢服务器速度,这意味着有些人不会等待他们的页面完成但数据库仍然会尝试将信息提供给中止的请求,如以及新的,所以它首先看起来像数据库问题