Apache停滞了吗? / server-status显示超过240个请求,如“OPTIONS * HTTP / 1.0”200 – “ – ”“Apache(内部虚连接)”

一些细节:

  • Webserver: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”。 当我查看/服务器状态时,我看到一些常规的请求。 我也看到来自“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个这样的连接,似乎我的networking服务器已经危险地接近用完的连接了。 也似乎Apache应该只需要less数这些“内部虚拟连接”

我们昨天实际上有两个原因不明的停电,我想知道这些“内部的虚拟连接”是否导致我们用完了可用的连接。

更新2010/04/16

这是8个小时之后。 /服务器状态页仍然显示有243行说“www.example.gov选项*”。 我相信这些连接是不活跃的。 服务器大部分空闲(1个请求当前正在处理,9个空闲的工作人员)。 Unix主机上只有18个活动的httpd进程。

如果这些连接不活动,为什么他们显示在/服务器状态下? 我预计他们将在初始化几分钟后过期。

    阿帕奇处理一个雷鸣的牛群有点不同于你想象的。 当你收到一串入站stream量时,会产生大量的subprocess,如果它确定需要更多的进程,它会在下一个时间间隔内产生两倍的进程,直到它有足够的进程来处理请求或者访问maxclient。

    如果你看到这些,这意味着apache只是检查孩子,而不pipe是什么导致apache来分叉许多进程可能已经没有了。 是的,他们确实占用了客户端的连接,但是无论什么事情都可能导致事情上升。

    首先我会检查你的日志将是事件之前的一堆302。

    如果你有类似的东西

     <?php include("http://www.oursite.com/header.php");?> 

    header.php丢失和

     ErrorDocument 404 /404.php 

    其中404.php包括header.php,你会得到一个recursion循环,并在该网页上的命中将立即导致Apache使用所有可用的连接。

    我的理解是,鉴于这些是从父母到孩子的过程的联系,他们只是Apache跟踪孩子们在做什么。 请记住:

    • 在处理完请求之后,孩子们可以在这里呆上一段时间
    • 内部虚拟连接定期发生
    • 如果孩子没有做其他事情(因为服务器大部分空闲),虚拟连接将是最近处理的事情

    就我所知,情况并非如此,虚拟连接“耗尽”了孩子。 Apache正在检查它的孩子的状态,而不是运用它们来testing它们是否工作。

    如果内存服务,这些是由轻量级代理(如Lighttpd)生成的testing连接,这些代理位于较重的服务器(如Apache)之前。

    鉴于你在监狱里,主机服务器可能通过lighttpd代理请求(私人)监狱IP?

    你需要find哪些进程连接到你的Apache端口(我假设它是80)。

    我没有FreeBSD系统,所以我可以确认这些命令,但至less在Mac上这应该给你一个提示:

    $ lsof -i

    它会显示如下所示:

     COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME BadGuy 26655 yvesj 24u IPv4 0x3f32270 0t0 TCP localhost:56696->localhost:56695 (ESTABLISHED) GoodGuy 26656 yvesj 15u IPv4 0x5b7666c 0t0 TCP localhost:56695 (LISTEN) GoodGuy 26656 yvesj 16u IPv4 0x72a9e64 0t0 TCP localhost:56695->localhost:56696 (ESTABLISHED) 

    从这里你可以注意到PID 26656的进程正在侦听端口56695,进程26655正在连接到该端口。 通过这种方式,您可以确定谁是坏人(只是不要混淆第三行,这表示连接的另一端(goodguy => badguy)。

    当你把这个应用到你的案例中时,你会发现系统上的其他进程正在把这些连接保存到你的Apache实例中。

    祝你好运!

    伊夫

    那么,这有一个惊喜的答案。 这是我们在午夜拍摄UFS文件系统快照时出现文件系统问题的原因。

    这似乎是由FreeBSD UFS错误引起的。 我们在FreeBSD主机上使用FreeBSD Jails,并使用默认的UFS文件系统。 UFS文件系统很大 – 1.8TB。

    每晚一次,我们使用“dump(8)”运行备份。 dump(8)在备份之前创build了文件系统的快照,并冻结了文件系统。 转储应该与文件系统less于2TB,但在我们的情况下失败。 这家伙有同样的问题。

    (我把问题部分的答案从这里转到答案部分,stefan,20100608)