我收到一堆 Apache 错误,无法追踪。这些错误发生在运行大量 Drupal 网站的 RHEL 系统上。
[2009 年 9 月 14 日星期一 12:48:44] [信息] [客户端 xx.xx.xxx.xx] (70007)指定的超时已过期:core_output_filter:正在将数据写入网络 [2009 年 9 月 14 日星期一 12:50:19] [信息] [客户端 xx.xxx.xx.xx] (104) 对端重置连接:core_output_filter:正在将数据写入网络 [2009 年 9 月 14 日星期一 12:51:28] [信息] [客户端 xx.xxx.xx.xx] (32)管道损坏:core_output_filter:正在将数据写入网络
偶尔(每 24 到 36 小时)会出现负载高峰,网站会完全无响应。平均负载从正常的 1-1.5 上升到 200。大多数正在运行的 httpd 进程将显示为“D”——死锁——而让服务器恢复到“交互”状态的唯一方法是三指敬礼或等到收到提示并killall -9 httpd
。
显然,我不能为了做一堆 strace 工作而关闭该网站。我检查了 apache 配置,并且(再次)据我所知,EnableMMAP 和 EnableSendFile 被禁用。这些文件位于 NFS v3 安装上,但 NFS 服务器、mysql 服务器或其他任何东西都没有报告错误。系统日志或 dmesg 中没有任何合适的信息。该网站的负载也太高,无法协调单个请求及其导致的错误。
此时,我怀疑是网络硬件错误,我更愿意在第二台机器上启动网站。在我这样做之前,有人有什么想法吗?
答案1
这是一个大胆的猜测,但是你检查过 Drupal 正在创建多少个磁盘临时表吗?
我已经看到这导致iowait(加载)问题。
mysqladmin -u root -p ext -ri 30 | grep Created_tmp_disk
第一次运行会告诉你自上次重启 MySQL 以来创建了多少个磁盘临时表。然后它会告诉你在 30 秒的时间窗口内创建了多少个临时表(直到你按 Control-C 退出)。
(临时) 解决方案是将 MySQL 的 tmpdir 放在基于 RAM 的文件系统上 (例如 tmpfs)。
我想我的意思是,这会引发级联 - 而您看到的消息只是废弃的连接。
干杯
答案2
简而言之,在您的 apache 配置中尝试执行以下操作:
启用MMAP关闭
Sendfile 关闭
长话短说:
Apache 显然 mmaps 文件并尝试使用 linux 的 sendfile (http://linux.die.net/man/2/sendfile) 在可用时提高性能,但根据 apache 文档,如果无法读取文件,这可能会导致网络文件系统的稳定性问题,请参阅:
http://httpd.apache.org/docs/2.0/mod/core.html#enablesendfile
他们在这里详细介绍了这一点:
http://httpd.apache.org/docs/2.0/faq/all_in_one.html#error.sendfile
您可以在这里找到有关 EnableMMAP 和 EnableSendfile 指令的信息:
答案3
我们设法通过全面切换到 InnoDB 并正确配置密钥缓存以及添加一堆 memcache 和其他来平衡站点。我上面引用的所有错误显然都是由客户端取消对长时间运行的进程的请求引起的,因为一旦我们对数据库进行调整,错误就消失了。
答案4
添加 nginx 来代理你的 apache 并直接提供静态内容。甚至完全替换 apache。这将大大降低 apache 的负载。