0

我在 Debian 上配置了一个简单的 LAMP 堆栈,但我遇到了 Apache Web 服务器的一些问题。

每 3-4 小时,Web 服务器就会进入死锁状态,并且所有命中数据库的请求都会阻塞。服务器正在为每个请求创建一个新的子节点。进程的数量增加得非常快。几秒钟后,Monit 发现有问题并重新启动 Apache 服务器。

我怀疑这个问题是由 PHP 处理数据库连接池的方式产生的,因为服务器仍然能够回答静态内容请求。你经历过这样的行为吗?我应该怎么做?

更新:问题解决了。将 APC 用于操作码缓存和用户数据似乎是个坏主意。我现在使用 Memcache 来存储用户数据,而 APC 仅用于代码。我仍然不时遇到一些分段错误,但服务器大部分时间都很稳定。

4

4 回答 4

3

我怀疑问题是:

  • 一个困难的长时间运行的数据库查询,它会阻止进一步的请求。如果您使用只有表级锁定的 MySQL MyISAM 引擎,这相当容易,并且读取器可以轻松阻塞写入器,反之亦然,因此对用户表的单个棘手查询几乎可以阻塞整个服务器,同时数据库等待 I/O。您通常可以使用“SHOW PROCESSLIST”或为您执行此操作的工具来诊断此问题。
  • 对于 prefork 服务器上可用的 RAM,将 MaxClients 设置得太高 - 几乎每个人都这样做。如果您使用的是“胖”的 prefork Apache(例如,使用进程内 PHP),那么不要将 MaxClients 设置为高于您有足够 ram 的值。这可能比 100 或 150 的典型值小很多。

这两件事共同导致了您所看到的问题。它们都需要修复,因为它们可能单独导致问题。

这完全基于猜测和经验。

于 2008-11-23T22:02:33.910 回答
1

为什么不看日志?/var/log/apache2/*是一个很好的起点。在服务器死机之前请求什么?从那里开始,您可能可以推断出问题所在。由于 php 脚本默认在 30 秒后终止,因此错误需要相当大才能导致类似的情况。

于 2008-11-23T21:40:21.350 回答
1

检查您在 /etc/apache2/apache2.conf 中的超时设置,当 Timeout 设置为高并且系统被一堆断开的连接击中时,我看到了类似的问题。

于 2008-11-23T21:47:54.157 回答
0

mysql-slow 日志对于查找导致问题的缓慢查询也很有用。

于 2009-01-08T18:35:59.313 回答