Apache没有释放具有少量请求的线程

时间:2016-05-05 12:09:29

标签: php apache tcp server

在我们的某个服务器上,当我们部署的某个应用程序针对我们的API运行更新时,我们会遇到一些奇怪的行为。要点是它下载一个XML文件,其中包含一个文件列表。然后它继续检索列出的文件。这些文件由PHP进程提供,该进程使用文件ID,查找文件,并在文件存在时将文件读出到客户端。

最初,由于低并发性(我们现在运行在2)和文件大小,文件将以大约每秒1的速度进入。但是,随着流程的推移,我们的开发人员表示每张图片的下载时间将增加到30秒以上。

在查看Munin图表时,下载时间的增加与Apache进程(以及因此内存消耗)大致同时上升相吻合。

Apache Processes

奇怪的是,在更新过程中,Apache Accesses的实际数量仍然非常低。

Apache Accesses

虽然(除非我错误地读取此图表),但活动连接的数量仍在继续增长。

Firewall Connections

对我们来说似乎很奇怪,进程计数就像这样继续上升,似乎完成的连接没有被删除。我假设当请求完成时,连接将终止,并且Apache工作程序将在后续连接上重用。但是,它看起来并没有发生......此外,您可以看到在“更高”的访问负载条件下,打开的连接数和活动的Apache进程数没有显着变化。

目前的脚本相当于:

if (
    $file = File::get($_GET['file_id']) &&
    !$file->is_locked() && $file->has_member_access($current_member)
){
    /* Stuff */

    header('Cache-Control: public');
    header('Last-Modified: ' . $gmt_modify_time );
    header('Content-Length: ' . $file_size);
    header('Content-Disposition: attachment; filename="' . $file_name . '";');
    header('Content-type: ' . $file_type);
    header('Content-Transfer-Encoding: binary');


    @readfile("$file_path") or die("File not found."); 

}

因此,基本上,这会在一段时间内每秒被击中一次,直到Apache进程堆叠到每30秒命中一次为止。下面的图表的尖端表示更新终止,并显示进程也缓慢下降...

最后一件事,还有一个额外的问题,就是“为什么连接在它们出现之后保持开放这么长时间,我猜,它会关闭?”你可以在ipconntrack看到一个约275个连接的高原,直到星期三。这个高原将近一周,并与通过防火墙建立的连接相吻合。

Connections Week Firewall Week

非常好奇,令人沮丧...

0 个答案:

没有答案