一些细节:
- 网络服务器:Apache/2.2.13 (FreeBSD) mod_ssl/2.2.13 OpenSSL/0.9.8e
- 操作系统:FreeBSD 7.2-RELEASE
- 这是一个 FreeBSD 监狱。
- 我相信我使用的是 Apache 'prefork' MPM(我运行 FreeBSD 的默认值)。
- 我使用 MaxClients 的默认值 (256)
我已启用 mod_status,并带有“ExtendedStatus On”。当我查看 /server-status 时,我看到了一些常规请求。我还看到来自“localhost”的超过 240 个请求,例如这些。
37-0 - 0/0/1 . 0.00 1510 0 0.0 0.00 0.00 127.0.0.2 www.example.gov OPTIONS * HTTP/1.0
38-0 - 0/0/1 . 0.00 1509 0 0.0 0.00 0.00 127.0.0.2 www.example.gov OPTIONS * HTTP/1.0
39-0 - 0/0/3 . 0.00 1482 0 0.0 0.00 0.00 127.0.0.2 www.example.gov OPTIONS * HTTP/1.0
40-0 - 0/0/6 . 0.00 1445 0 0.0 0.00 0.00 127.0.0.2 www.example.gov OPTIONS * HTTP/1.0
昨天我还看到来自本地主机的大约 2417 个请求,如下所示:
Apr 14 11:16:40 192.168.16.127 httpd[431]: www.example.gov 127.0.0.2 - - [15/Apr/2010:11:16:40 -0700] "OPTIONS * HTTP/1.0" 200 - "-" "Apache (internal dummy connection)"
http://wiki.apache.org/httpd/InternalDummyConnection上的页面说“这些请求是完全正常的,一般来说,你不需要担心它们”,但我不太确定。
为什么有超过 230 个?这些是活动连接吗?如果我有“MaxClients 256”和超过 230 个这样的连接,那么我的网络服务器似乎很危险地接近用完可用的连接。似乎 Apache 应该只需要少数这些“内部虚拟连接”
昨晚我们实际上发生了两次无法解释的中断,我想知道这些“内部虚拟连接”是否导致我们用完可用的连接。
更新 2010/04/16
8小时后。/server-status 页面仍然显示有 243 行显示“www.example.gov OPTION *”。我相信这些联系是不活跃的。服务器大部分处于空闲状态(当前正在处理 1 个请求,9 个空闲工作人员)。Unix 主机上只有 18 个活动的 httpd 进程。
如果这些连接不活跃,为什么它们会显示在 /server-status 下?我原以为它们会在初始化后几分钟过期。
Apache 处理雷鸣般的牛群与您想象的略有不同。当您获得大量入站流量时,它会产生许多子进程,如果它确定需要更多,它会在下一个间隔内产生两倍的子进程,直到它最终有足够的进程来处理请求或达到 maxclients。
如果您看到这些,则意味着 apache 只是在检查子进程,而导致 apache 分叉那么多进程的任何原因都可能消失了。是的,它们确实占用了客户端连接,但是,任何导致事情发生假脱机的事件都可能消失了。
我会在您的日志中检查的第一件事是事件发生前的一堆 302。
如果你有类似的东西
header.php 丢失的地方和
其中 404.php 包含 header.php,您将得到一个递归循环,并且该页面上的点击将立即导致 apache 使用所有可用连接。
我的理解是,鉴于这些是从父进程到子进程的连接,它们只是 Apache 跟踪子进程的操作。请记住:
据我所知,虚拟连接并没有“耗尽”孩子。Apache 正在检查其子代的状态,而不是通过锻炼它们来测试它们是否工作。
如果有记忆,这些是由轻量级代理(例如 Lighttpd)生成的测试连接,这些代理位于较重的服务器(例如 Apache)前面。
鉴于您在监狱中,主机服务器是否可能通过 lighttpd 代理对(私有)监狱 IP 的请求?
您需要找到哪些进程连接到您的 Apache 端口(我假设它是 80)。
我没有 FreeBSD 系统,所以我可以确认命令,但至少在 Mac 上,这应该给你一个提示:
它将显示如下内容:
从这里您可以注意到 PID 为 26656 的进程正在侦听端口 56695 并且进程 26655 正在连接到该端口。这样您就可以识别谁是坏人(只是不要与第三行混淆,它显示了连接的另一端(goodguy=>badguy)。
当您将此应用于您的案例时,您会发现系统上的哪些其他进程正在保持与您的 Apache 实例的这些连接。
祝你好运!
伊夫
嗯,这有一个出人意料的答案。这是由我们在午夜拍摄 UFS 文件系统快照时的文件系统问题引起的。
这似乎是由 FreeBSD UFS 错误引起的。我们在 FreeBSD 主机上使用 FreeBSD Jails,并使用默认的 UFS 文件系统。UFS 文件系统很大——1.8TB。
每晚一次,我们使用“dump(8)”运行备份。dump(8) 在备份之前创建了文件系统的快照,这冻结了文件系统。Dump 应该适用于小于 2TB 的文件系统,但在我们的案例中它失败了。这个人也有同样的问题。
(我将我的答案从问题部分移到了答案部分。stefan,20100608)