因此,查看日志,平均响应时间约为 20-30 毫秒,但机器上的负载为 20+,使用外部测试似乎需要一秒钟才能加载。我无法想象这都是网络延迟,所以我很好奇 apache 日志在什么时候开始跟踪请求。如果负载为 20,这是否意味着事情正在排队等待甚至进入 acpache 进程,但一旦它们到达那里,只需要 30 毫秒即可处理?
答案1
我假设您指的是日志行中 %D 提供的响应时间(即处理请求所需的微秒时间)。此处所述的时间是从成功读取 URI(例如 GET / HTTP/1.1)到其余标头之前到记录该请求的持续时间,该过程在请求完全处理后发生(从源代码的角度看,这将从 httpd://apache.wirebrain.de/lxr/source/server/protocol.c#617?v=2.2.14 到 apache.wirebrain.de/lxr/source/modules/loggers/mod_log_config.c#623?v=2.2.14)。因此,是的,一旦 Apache 真正读取该请求,只需 30 毫秒。
增加的延迟是否是由于机器的负载造成的,取决于负载产生的位置以及 Apache httpd 的配置方式。一种解释是,所有 httpd 工作进程都很忙,请求被卡在了接受队列中(有关这方面的更多技术背景信息,请参阅 www.cs.rice.edu/CS/Systems/Web-measurement/paper/node3.html;简而言之,如果没有可用的工作进程,httpd 不必立即接受连接)。
要了解是否发生了这种情况,请查看 httpd 的状态页面(localhost/server-status,您需要为此配置 mod_status (httpd.apache.org/docs/2.2/mod/mod_status.html)),并查看是否还有空闲的工作线程(以及它们是否“足够”)。如果没有,请尝试增加 httpd 生成的工作线程数量(其确切配置取决于您使用的 MPM 模块;对于 mpm_worker (httpd.apache.org/docs/2.2/mod/worker.html),您可以根据需要增加 MaxClients、ThreadsPerChild、ServerLimit 等。但请注意不要超过您机器的可用内存或打开文件的最大数量(请记住每个连接至少有一个文件句柄)。
根据/为什么/所有 Apache 工作进程都被占用,这可能会对您有所帮助。如果它们都与长时间运行的动态页面生成(即 mod_php 或类似程序)有关,那么这只会增加系统的负载。如果系统上的负载来自低于标准的存储子系统,并且所有 Apache 进程都与大型文件传输有关并等待 I/O 子系统,那么您只会获得更多负载。两者都有解决方法;如果是动态内容,您将需要限制对长时间运行的脚本的并发访问(例如,将 PHP 从工作进程中移出并放入 FastCGI 或甚至 CGI 进程中,并将这些进程的数量限制在 MaxClients 设置以下的某个位置,以便可以同时为非动态对象提供服务而不会导致它们的接受积压。
抱歉,缺少 http 链接,显然我在这个网站上的声誉不足以真正发布链接。
答案2
我不确定此 Apache 安装是否在 Windows 服务器上运行,但如果是,您可以结合使用 perfmon(使用网络接口/输出队列长度来报告网络队列(如果有))和 Firefox + Firebug 来记录响应时间。这可以让您深入了解问题所在。
我还发现本文关于 mod_log_config,不确定您是否正在使用此模块或其他模块进行日志记录。我没有安装开发版 Apache 来亲自测试,但可能值得一读。
祝你好运。