我的Drupal 6网站运行平稳多年,但最近经历了间歇性极端缓慢(10-60秒页面加载)。几个小时的缓慢,然后是几小时的正常(4-6秒)页面加载。页面总是加载没有错误,有时需要永远。
我的设置:
故障排除
问题似乎是Apache响应请求,但以前我只看到100%cpu负载下的这种行为。仅仅通过资源监控来判断,看起来似乎很少发生。
这是踢球者 - 大约一半的网站访问来自我们的局域网,但如果我禁用防火墙规则并阻止从我们网络外部访问,内部(LAN)访问(1000多台设备)是快速的。但是一旦外部访问恢复,该网站就会瘫痪。
Apache配置?爬虫/机器人?攻击者?我已经走到了尽头,我应该在哪里找出问题所在?
------编辑:-----
附件是来自webpagetest.org的瀑布图,显示15秒的加载时间。我见过高达几分钟的时间。而且,服务器大部分时间运行良好。绿色区域表示浏览器已发送请求并正在等待从服务器接收数据的第一个字节。这肯定是一个后端延迟,但令人费解的是,在这种缓慢的情况下,CPU几乎没有使用过。
(发布图片的代表不够,请参阅https://webmasters.stackexchange.com/questions/54658/apache-very-high-page-load-time
------ ------编辑
在Apache方面 - 这可能是一个ThreadsPerChild问题吗?
答案 0 :(得分:4)
经过大量研究,我可能已经找到了解决方案。如果我是对的,这是一个apache配置问题。具体来说,就是“ThreadsPerChild”指令。见...... http://httpd.apache.org/docs/2.2/platform/windows.html
因为Apache for Windows是多线程的,所以它不使用 每个请求都有单独的进程,就像Apache在Unix上一样。代替 通常只有两个Apache进程在运行:父进程, 和一个处理请求的孩子。在每个孩子的过程中 请求由一个单独的线程处理。
ThreadsPerChild:这个指令是新的。它告诉服务器有多少 它应该使用的线程。这是最大连接数 服务器可以立即处理,所以一定要设置这个数字足够高 对于您的网站,如果你获得了大量的点击。建议的默认值是 ThreadsPerChild 150,但必须调整以反映最大值 预期接受的同时连接数。
事实证明,我的配置中没有设置此指令,因此默认为64.我通过查看任务管理器中第二个httpd.exe进程的线程数来确认这一点。当服务器超过64个连接时,多余的请求只需要等待线程打开。我在httpd.conf中添加了ThreadsPerChild 150。
此外,我启用了apache状态模块 http://httpd.apache.org/docs/2.2/mod/mod_status.html
...除其他外,它允许人们在任何给定时刻查看服务器上的活动请求总数。马上,我可以看到高达80个活跃请求的峰值。时间会证明,但我相信这将解决我的问题。到目前为止,30个小时没有打嗝。
答案 1 :(得分:0)
对于“1-3次/秒平均值”,Apache太庞大而且笨拙。
一旦我有更轻的(几乎静态-html,没有数据库)网站和类似的点击/秒的类似问题。 没有错误,没有高网络/ CPU /内存/磁盘负载。 WinXP上的Apache。
我在Apache之前为静态文件插入了nginx,它开始像魅力一样工作。
答案 2 :(得分:0)
缓存。它缓存的解决方案。
Drupal(与大多数其他大型CMS平台一样)由于其性质而倾向于这种事物 - 每个页面都是动态构建的,由一堆数据库表和代码模块构成。你进入的越多,它就会越慢,但如果你的网站有点流量,即使是相当简单的页面也会变得非常慢。
Drupal内置了一个页面缓存机制,可以显着降低您的负载。只要您的页面是静态的(即没有动态内容),您就可以直接启用缓存并观察性能是否正确。
如果您有动态内容,您仍然可以为页面的静态部分启用缓存。它有点复杂(超出了这个答案的范围),但值得努力。
如果仍然不够,基于服务器的缓存解决方案(例如Varnish)肯定会有所帮助。