为什么第一个请求总是比后续请求多花费大约 10% 的时间?

为什么第一个请求总是比后续请求多花费大约 10% 的时间?

例如:如果第一个请求大约需要 1.32 秒,则后续请求将需要大约 1.18 秒到 1.2 秒。

根据我的研究,第一个请求可以通过设置来改进StartServersMinSpareThreads并且MaxSpareThreadsapache\conf\extra\httpd-mpm.conf

然而,没有指南提到哪些数字能够真正帮助提高首次请求速度。

另外,有人建议在服务器上使用以下脚本来创建一个不断刷新网页的页面:

<html>
<head>

<script>
setTimeout(function(){
   window.location.reload(1);
}, 2000);

</script>

</head>
<body>
<iframe name="iframe" id="iframe" src="http://mywebsite:8080"></iframe> 

</body>
</html>

这个页面虽然让apache保持繁忙,但是它却更快地增加了apache日志。

那么,我可以知道我可以采取什么措施才能使第一个请求具有与后续请求相同的响应时间甚至更快的响应时间吗?

以下是第一个请求和后续请求的场景:

10:00:01 AM Access URL http://mywebsite.com (Response time: 1.32s - First Request)

10:00:07 AM Access URL http://mywebsite.com (Response time: 1.2s - 2nd Request)

10:00:37 AM Access URL http://mywebsite.com (Response time: 1.19s - 3rd Request)

10:01:07 AM Access URL http://mywebsite.com (Response time: 1.21s - 4th Request)

10:35:35 AM Access URL http://mywebsite.com (Response time: 1.35s - First Request)

10:35:48 AM Access URL http://mywebsite.com (Response time: 1.2s - 2nd Request)

10:51:08 AM Access URL http://mywebsite.com (Response time: 1.36s - First Request)

10:51:13 AM Access URL http://mywebsite.com (Response time: 1.2s - 2nd Request)

10:51:38 AM Access URL http://mywebsite.com (Response time: 1.19s - 3rd Request)

10:52:07 AM Access URL http://mywebsite.com (Response time: 1.23s - 4th Request)

请注意,在短暂的不活动状态后,first会发出请求,并且响应时间会延迟。但是,在一分钟左右内发出的后续请求不会出现这种延迟。

谢谢。

答案1

第一:定义第一次。第一次是什么时候?

除此之外,这可能有很多原因,其中大多数都是正常的,没有必要担心:

  • 第一次从磁盘读取文件,后续请求则从缓存中读取
  • 例如,对于 PHP 文件,它们会被 APC 等缓存,不需要再次编译

再次强调,这是正常且预料之中的,大多数情况下无需尝试解决。

至于StartServers等:您需要的值取决于站点的负载,但您需要实现的只是客户端不必等待新进程或线程分叉。对于流量非常小的站点,这可能意味着只有一个线程/进程可用。

答案2

服务器通常需要经过不同的处理阶段,每个阶段都可能需要一些时间来“启动”

从我的一般理解来看,我不确定它是否可能的提出第一个请求曾经比后者更快...这种推理的用例是什么?查看您的代码和问题,您没有引用 MySQL 或 PHP(它们通常是任何 Web 服务器启动时间的主要原因)。

忽略上述内容:通常,随着流量涌入您的网络服务器/网站,您的页面加载速度会更快。这是因为 Apache 能够让线程处于等待状态,以服务下一个请求。此外,操作系统会对文件句柄等进行一些缓存。随着时间的推移,它会释放这些缓存,一切就会恢复正常。

如果你收到太多流量,您显然会注意到速度变慢,这是由于连接积压、线程或进程争夺资源或磁盘交换造成的。

根据我的研究,可以通过在 apache\conf\extra\httpd-mpm.conf 中设置 StartServers、MinSpareThreads 和 MaxSpareThreads 来改进第一个请求

再次,据我所知,,StartServers并且MinSpareThreads只会MaxSpareThreads帮助增加高峰负载下的加载时间。

一般来说,你应该将 StartServers 和 MinSpareThreads 设置为一个数字,满足您的平均负载要求每天。

MaxSpareThreads 应该被用作一种“缓冲区”用于在高负载时保持螺纹开放。

为了特别解决你的问题

您可以使用 Apache 的磁盘缓存模块,或内存缓存模块,或文件缓存模块可能会减少启动和提供静态内容所需的时间。

相关内容