在我们的某个服务器上,当我们部署的某个应用程序针对我们的API运行更新时,我们会遇到一些奇怪的行为。要点是它下载一个XML文件,其中包含一个文件列表。然后它继续检索列出的文件。这些文件由PHP进程提供,该进程使用文件ID,查找文件,并在文件存在时将文件读出到客户端。
最初,由于低并发性(我们现在运行在2)和文件大小,文件将以大约每秒1的速度进入。但是,随着流程的推移,我们的开发人员表示每张图片的下载时间将增加到30秒以上。
在查看Munin图表时,下载时间的增加与Apache进程(以及因此内存消耗)大致同时上升相吻合。
奇怪的是,在更新过程中,Apache Accesses的实际数量仍然非常低。
虽然(除非我错误地读取此图表),但活动连接的数量仍在继续增长。
对我们来说似乎很奇怪,进程计数就像这样继续上升,似乎完成的连接没有被删除。我假设当请求完成时,连接将终止,并且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个连接的高原,直到星期三。这个高原将近一周,并与通过防火墙建立的连接相吻合。
非常好奇,令人沮丧...