普遍问题:约25秒不活动后的第一个请求总是比后续请求慢(约1秒)(约1/10秒)

时间:2013-04-30 作者:Flix

自从我开始使用WordPress以来,我就注意到了这一点。这是一个普遍的问题,从某种意义上说,WP安装是否在我的共享主机帐户上(虽然没有尝试过其他提供商)或本地LAMP安装都无关紧要。

全新、干净的WordPress,有1篇文章、1页和defaukt主题-或旧WP,有数百篇文章、一个沉重的主题和大量插件。。。没什么区别。

目前正在开发一台速度极快的本地虚拟机(i7-3930k,配有快速SSD、CentOS 6.2、Softaculous、标准Apache和MySQL,没有其他东西在机箱上运行),场景如下:

第一次加载,任何前端或后端页面:约1秒延迟

进一步观察:

同一盏灯上的不同装置相互“隔离”,即加载一个站点,然后立即加载另一个站点,不会使后者快速加载

  • 我当前的“解决方案”是打开一个选项卡,其中有一个虚拟页面,每隔20秒重新加载一次自己,是否有其他人注意到这个问题?可能是什么?我很乐意提供任何和所有细节来帮助追踪这件事。谢谢大家!

  • 1 个回复
    SO网友:EAMann

    如果不看你的盒子来了解到底发生了什么,以下是一些潜在的缓慢途径:

    潜在原因Apache通常以这样一种方式配置,即单个httpd进程始终在后台运行。当一个请求通过网络传入时,它会启动一个新的httpd进程来处理该请求。一旦请求关闭,新的httpd进程将停留一段时间,如果主进程在那里,主进程将向它传递额外的请求。

    在一段时间的不活动之后,子进程将关闭,这意味着主进程必须重新分配内存,并在下一个请求到来时启动一个新进程。

    我使用的术语如;“一段时间”;和;“特定时期”;因为这些都是服务器的可配置选项。您可以使用StartServers 指令。您还可以考虑查看MinSpareThreadsMaxSpareThreads 指令,因为它们管理;处理请求峰值的空闲线程数"E;

    有关这些指令的更多详细信息,请参阅in the manual.

    PHP与Apache一样,PHP可以通过多种不同的方式进行配置,具体取决于您在服务器上的安装方式。Apache最流行的两种是CGI脚本和Apache模块。

    作为一个CGI脚本,PHP将作为一个单独的进程运行。与Apache一样,通常会有一两个实例来处理请求,但在一段时间不活动后,它们会关闭以释放系统中的内存。

    作为一个Apache模块,PHP被编译成Apache本身,因此每当您有一个httpd 您还设置了一个PHP处理程序。但正如我在上面的Apache系统中所描述的那样,这些额外的实例将消失,除非您将Apache配置为保持它们在周围并处于活动状态。

    关于mod\\u php与php as CGI的更多信息here.

    然而,MySQL是这里最大的障碍。与大多数其他数据库一样,MySQL将其数据存储在磁盘上,但将查询结果保存在内存缓存中,以加快查找速度。您可能看到的是MySQL在大约25秒后决定您已经离开,不再需要数据。

    缓存基本查询对于流量大的站点非常有效,即使是那些服务器使用SSD进行数据持久化的站点,因为它将结果和数据保存在内存中,并且不必执行任何实际的查找来响应请求。不幸的是,您可能遇到了这样一个问题:缓存过时(或达到内部配置的超时阈值),后续请求需要从文件系统重新获取数据。

    您可以在MySQL documentation.

    缓解措施

    服务器配置

    如果您不是系统管理员,我建议您在几个小时内签订一份合同,以查看您的方框并调整设置。从书架上安装新的堆栈通常对每个人都很好(在普通的、未缓存的服务器上加载1s的页面也没什么好羞愧的)。然而,默认配置并不意味着是一刀切的方案。手头有一位专家来配置堆栈以充分利用硬件,这将是一笔划算的钱。

    前端缓存

    如果页面没有更改,可以使用前端缓存存储渲染的页面并快速为其提供服务。Batcache, 例如,使用服务器上的Memcached将渲染页面存储在内存中

    WP Super Cache 将执行类似的操作,但会将呈现的页面存储为静态HTML文件,以便访问者获取该文件,而不是让WordPress解析任何内容。页面加载的瓶颈是SSD的速度+主机提供的带宽。

    结束