我收到了一堆 apache 错误,我在追踪时遇到了问题。它们位于运行大量 Drupal 网站的 RHEL 系统上。
[Mon Sep 14 12:48:44 2009] [info] [client xx.xx.xxx.xx] (70007)指定的超时已过期:core_output_filter:将数据写入网络 [Mon Sep 14 12:50:19 2009] [info] [client xx.xxx.xx.xx] (104)Connection reset by peer: core_output_filter: 将数据写入网络 [Mon Sep 14 12:51:28 2009] [info] [client xx.xxx.xx.xx] (32)Broken pipe: core_output_filter: 将数据写入网络
偶尔(每 24 到 36 小时)会出现负载峰值,并且站点将完全没有响应。平均负载从正常的 1-1.5 攀升到 200。大多数正在运行的 httpd 进程将显示为“D”——死锁——让服务器恢复“交互式”的唯一方法是三个-finger-salute 或等到你得到提示和killall -9 httpd
.
显然,该网站不能让我做一堆 strace 工作。我已经检查了 apache 配置,并且(再次)据我所知,EnableMMAP 和 EnableSendFile 被禁用。这些文件位于 NFS v3 挂载上,但 NFS 服务器、mysql 服务器或其他任何东西都没有报告错误。系统日志或 dmesg 中没有合适的内容。该站点的负载也太高,无法协调单个请求与它们导致的错误。
在这一点上,我正在考虑网络硬件错误,我更愿意在第二台机器上启动该站点。在我这样做之前,有人有什么想法吗?
这是一个疯狂的猜测,但您是否检查过 Drupal 创建了多少磁盘临时表?
我已经看到这会导致 iowait(加载)问题。
mysqladmin -u root -p 分机 -ri 30 | grep Created_tmp_disk
首次运行将告诉您自上次重新启动 MySQL 以来创建了多少磁盘临时表。然后它会告诉你在 30 秒的时间窗口中创建了多少(直到你用 Control-C 退出它)。
(创可贴)解决方案是将 MySQL 的 tmpdir 放在基于 RAM 的文件系统(例如 tmpfs)上。
我想我的建议是这会启动级联-您看到的消息只是被放弃的连接。
干杯
简而言之,在您的 apache 配置中尝试以下操作:
启用 MMAP 关闭
发送文件关闭
长篇:
Apache 显然 mmap 文件并尝试在可用时使用 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 指令的信息:
http://httpd.apache.org/docs/2.0/mod/core.html#enablemmap
我们通过全面切换到 InnoDB 并正确配置密钥缓存以及添加一堆 memcache 和其他 . 我上面引用的所有错误显然是由客户端取消对长时间运行的进程的请求引起的,因为一旦我们调整了数据库,错误就消失了。
添加 nginx 来代理您的 apache 并直接提供静态内容。甚至,完全替换 apache。这将大大降低 apache 负载。