【问题标题】:How to fix Apache instability?如何修复 Apache 不稳定?
【发布时间】:2008-11-23 21:28:31
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您是否检查过这是否是 MySQL 服务器层的问题?你说可以提供静态内容,你还能用其他工具连接数据库吗?
  • 是的。 mysql服务器一直工作正常。

标签: php apache2 debian


【解决方案1】:

我怀疑问题是:

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

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

这完全基于猜测和经验。

【讨论】:

  • 我们正在使用 InnoDB。我将改进我们的监控脚本以在 Apache 阻塞时保存 SHOW PROCESS LIST 的输出,但我认为我们没有运行奇怪的查询。服务器有很多内存,交换内存从不使用。
【解决方案2】:

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

【讨论】:

  • 错误日志中没有消息。我在一个被阻塞的孩子上运行了 strace,它在 futex 之后等待。我认为连接 php 和 mysql 服务器的代码存在问题,因为同时服务器能够处理对静态内容的请求。
【解决方案3】:

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

【讨论】:

  • 超时设置为100。这个值是不是太高了?
  • 除非你被蠕虫攻击,它会在不关闭连接的情况下断开连接,这应该没问题(我自己使用 60)。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-25
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多