网站加载速度慢 - HTML加载缓慢

3

谁能帮助我。

我有一个运行在Magento 1.6.2.0上的网店。 使用Apache 2的VPS服务器。 我使用了APC和memcache,varnish缓存和fooman speedster。

主页的加载时间可接受... 但是当我进入分类页面时,加载时间要长得多...

但最长的等待时间是在等待HTML页面加载... 请看截图: enter image description here

现在的加载时间约为2-5秒,但在网站繁忙时可能会达到10-15秒...太慢了...

当我用Firebug查看时,发现大部分的加载时间都是在等待...

所以我的问题是,如何减少这个等待时间?


找出 bottleneck 是什么。也许服务器上的某些东西(如 db 访问)花费了很长时间。 - PeeHaa
似乎有很多个单独的资源在加载。请求-响应往返一直是代价昂贵的。如果可能的话,尝试在服务器端将所有的.js文件导入到一个单独的文件中,然后只需加载这一个新的大文件。这将极大地减少往返成本。对于图片,您可以将它们作为精灵加载。 - Kshitij
图片将在页面显示后加载(我认为使用deflate命令可以做到这一点)。 最浪费时间的是等待第一行,即 HTML 页面加载... 我认为这是瓶颈所在。 (我昨天优化了数据库,这有些帮助) 还有其他解决方案吗? - Ronny
根据网络面板输出,Fooman Speedster 没有正常工作。 - benmarks
6个回答

2

Benmarks和Josh Pennington的想法是正确的,忽略其他人告诉你现在要减少请求数量的建议,因为额外的请求现在会分散注意力。

问题在于HTML页面生成时间太长,在负载下情况变得更糟。

通常这是由于数据库负载过重引起的,可能是由于查询优化不佳或内存不足。

您需要确定在该页面上执行了哪些查询,以及它们的性能概况,例如内存、IO、CPU使用情况等。

您的VPS大小是多少?您还必须考虑它是否有足够的内存。

另外,您是否正在运行Apache?如果是,它有多少个工作进程。可能发生的情况是,在繁忙时期可能没有足够的工作进程,并且它们可能无法快速处理,因此在繁忙时期一些请求正在排队等待工作进程可用。


将Magento的memory_limit设置为256到512,并考虑增加innodb内存池大小。Magento在2-4核心处理器和2MB内存的情况下运行最佳。一个有用的工具来调整MySQL设置是MySQL Tuner Tool,它分析您的MySQL统计数据并提出更好性能的建议。添加完整页面缓存也会极大地帮助。上周我们有650多个用户,前端没有明显的减速。这都是硬件资源和缓存。Magento将根据您允许的资源运行得越快。 - Fiasco Labs
嗨,这是一台搭载 AMD Opteron(tm) 处理器 6128(1 核心)和 2 GB RAM(1GB 保证)的服务器。你认为这够用吗?此外,我正在运行 Apache2。我不知道有多少工作进程(我在哪里可以找到这个信息?)。 - Ronny

1
一项非常好的改进是将Apache替换为Nginx。我使用Nginx看到了很大的速度和稳定性提升。MYSQL调谐器会告诉你一些优化表、增加innodb_memory_pool_size以及增加max_heap_table_size和tmp_table_size的方法。如果你有能力,可以将服务器升级到4GB,并给MySQL和PHP分配更多的内存。Gzip也会影响首字节时间,并可能因只有一个处理器而减慢速度。您可以考虑Cloudflare作为缓存的替代/补充方案。最后一件事是目录页面往往有很多图片。确保这些图片经过了优化(我使用ImageOptim),并尽可能将gif转换为png格式。还有很多需要讨论的地方,但从这些开始吧。

1
问题很可能与数据有关。创建并浏览一个没有产品的类别,并注意响应时间;这将表明是否存在类别数据问题。您可以使用分析器来缩小罪犯范围。在管理 > 系统 > 配置 > 高级:开发人员中,将开发人员限制 IP 设置为您的 IP 并启用分析器。然后在 index.php 中取消注释 Varien_Profiler::enable();

然后您应该看到正常响应主体之后的输出。您可以跟踪该输出并找到性能较差的区域,通常位于中间某个位置。


这实际上是我见过的最好的解决Magento性能问题的答案。非常感谢,benmarks。 - medina
下载 AOE Profiler,你会感到非常高兴。 - benmarks

1
我会首先查看Magento白皮书。它有很多关于如何优化PHP、Apache和MySQL以获得最佳性能的好建议。

http://www.magentocommerce.com/whitepaper

我想说,将MySQL服务器与Apache服务器分离可以产生天壤之别。Magento非常重度使用Innodb,如果DB服务器没有优化以使用允许的最大内存,则可能会被视为非常缓慢。

还要去webpagetest.org进行速度测试。我建议在Apache上启用mod_expires,这样您只需下载所有js文件一次。他们会为您提供更多建议。在修改代码之前,我建议您首先执行此操作。根据我的经验,在大量修改代码之前,应使服务器服务达到最佳性能。这样,您就知道服务器在尝试加快代码之前是否正常运行。 - Josh Pennington

0

尝试实现一个JavaScript代码,在页面加载后加载所有图像(高分辨率)。尝试通过ajax调用在页面加载后获取图像

function init() {
...function to call all the images threw ajax
}
window.onload = init;

我尝试了下面给出的代码,以获得加载图像所需的最短时间。 我将所有图像放在一个共同的div名称下,并将它们的可见性设置为隐藏...

$(document).ready(function() {
    $("#img").css('visibility','visible') //img is div for all the images on the webpage 
});

但是 Ajax 调用可以让我获得图像的外观和感觉。


他的问题在服务器端,而不是请求数量上。 - Matthew Dolman

0

您的分层导航设置相当复杂,这会给服务器带来很大的负担。

从经验来看,转向专业的Magento网络主机可以带来天壤之别...对我来说确实如此。我不确定我们是否应该提及公司,所以除非有人说可以这样做,否则我不会提及我的公司,但是在谷歌上搜索Magento基准测试应该可以让您开始。

采用三个服务器的方法会产生巨大的差异。


嗨,马修,我们需要为我们的客户提供复杂的分层导航... 现在我有一个VPS服务器,拥有1个核心和2GB RAM(保证1GB)。 但目前我正在寻找更快的服务器。你能推荐什么?我当前ISP的下一步是2个核心和4GB RAM(保证2GB),或3个核心和6GB RAM(保证3GB)。否则就是一台专用服务器... 你所说的树形服务器方法是什么意思? - Ronny
嗨Ronny,我使用dx3webs.com,拥有最快的硬件并不总是正确的答案。最好的方法是将MySql / Apache / PHP都放在不同的盒子上,并针对该目的进行优化。我知道在magento设置中,nginx应该为其中之一提供更好的环境,但我记不清是哪一个了。无论如何,dx3webs是mage专家,因此可以比我更好地为您提供建议。还有其他专业的mage主机,因此您可能需要四处寻找。 - Matthew Dolman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接