我有一个在Mac OS X 10.4(Darwin内核版本8.10.1)上运行的服务器系统。 此服务器主要用作Bugzilla服务器,但还有一些其他基于Web的服务正在运行(Testlink,TikiWiki)。
Bugzilla数据库中有大约60000个错误,系统上有大约300个活动用户。
Bugzilla版本是3.0,运行在Perl 5.8.6上,Apache 1.3.33上运行在mySQL 5.0.38上
不时,我们有严重的麻烦,Bugzilla抛出一个数据库错误:
Software error: Can't connect to the database. Error: Too many connections
我已经有了几个可以解决这个问题的线索,但是我想提出一个更普遍的问题,你将如何debugging这些types的问题?
现在我们已经设置了以下来监控mySQL数据库:
我们刚刚开始收集这些数据,看看我们能否find“太多连接”问题的原因。
有没有其他的事情可以想到监视一个MySQL数据库,并帮助诊断问题的根本原因?
在诊断这些types的错误时,有两种截然不同的攻击计划:
首先 ,这可能是与使用中的实际软件有关的问题:某些事情实质上是在扯上关系,而不是将它们释放回来(根本不pipe是挂起线程还是在合理的时间内一个缓慢的查询)。
慢速查询日志对于诊断问题是非常有益的,但是15秒的值几乎是无用的:如果一个查询需要15秒钟,那么你非常麻烦的完全停止。 作为一般的经验法则,我查找运行一两秒以上的查询。 使用EXPLAIN关键字查看日志中显示的任何内容,并查看导致速度变慢的原因(不良连接,需要临时表进行sorting等) – 如果无法使用查询caching和索引,深入debugging代码/数据库devise。
另外,不要忽略mysql中的一般查询日志。 虽然您不希望在生产服务器上将其打开(长时间),但它可以快速告诉您,如果不是一个单一的查询花费了一定的时间,软件中的一个特定function是用数百个小查询。 显然,解决这类问题的唯一方法是通过重构代码。
其次 ,你需要调查软件的configuration是否是责任。 你有多less个并发连接? mysql中设置的最大连接数是多less? 这可能是像apache服务那么简单,说100个并发请求,而mysql只被configuration为接受20个连接 – 显然会给一些东西。 如果你能估计你想要处理多lessstream量,那么只需要一些常识(偶尔有一些谷歌find正确的设置)来平衡所有组件。
你有几个阿帕奇工人? 如何允许最大的mysql连接? 由于apache在处理请求时会为每个httpd worker产生一个cgi进程,所以前者大于后者。apache可以打开比mysql允许的连接更多的连接。
我会build议下面的日志设置
log_slow_queries log-queries-not-using-indexes set-variable = long_query_time=1
转储cron工作是非常有用的,但万一你没有任何准备好实际graphics的东西,我可以推荐具有MySQL插件监视的munin
这对确定峰值可能相当有帮助。 我在默认情况下以五分钟的间隔运行。
在过去的一年中,我发现了一个非常有趣的情况,而在此之前,情况完全不被人注意。