如何优化这个网站。需要一般性的建议

时间:2011-02-02 14:08:50

标签: php mysql optimization codeigniter web

这是我的第一个问题,即关于特定网站优化的问题。 几个月前,我们为我们的一个客户推出了www.kissid.ro,这是一个社区网站。

一切都很好,但是现在这个网站越来越大,并且在加载页面时显示出一些缓慢。

服务器规格:
- PHP 5.2.1(我认为我们需要在5.3上升级才能使用新的垃圾收集器)
- Apache 2.2
- 四核至强处理器@ 2,8 Ghz和4 GB DDR 3 RAM - XCACHE 1.3(几个月前我们添加了这个)
- Mysql 5.1(我们使用innodb作为引擎)
- Codeigniter框架

以下是我们迄今为止所做的以及我们打算进一步做的事情:

除了xcache之外,我们并没有真正使用缓存机制,因为大多数内容都是实时的,除此之外,我们不想过早优化,因为我们不知道在流量方面会发生什么。 另一方面,我们已经安装了memcached,我们希望实现一个基于memcached的缓存系统。

关于数据库结构,我们的大多数表已达到3NF,是的,我们有一些慢查询(我们计划优化),但我认为因为生成慢查询的表是博客评论的表(〜 44,408行)/用户日志跟踪(~725,837行)/用户注释(~698,964行)等是非常大的表。整个数据库现在大小为697.4 MB。

另外,以下是2011年1月的一些统计数据:
每月独立访客: - 127.124
每月独特观点:4.829.252
每月独立访问量:242.708

每日平均值:
独特的新访客:7.533
独特的新观点:179.680

如果您需要更多详细信息,请告诉我们 任何建议都非常感谢。

谢谢。

6 个答案:

答案 0 :(得分:2)

当遇到性能问题时,首先告诉它与数据库有关,没有黄金法则或标记粘滞便笺。也许我建议的是进行性能分析,互联网上有许多免费和付费的工具,可以让你这样做。

首先使用Web服务器层启动,确保所有内容都正确完成并尽可能优化。

然后转到下一层(我假设是你的数据库)。通常情况下,只要有人提到InnoDB MySQL,我们就会假设有一些索引可以用来优化和搜索操作。索引的使用也非常重要,因为您不希望将错误编入索引并使事情变得更糟。我的建议是让DBA等效人员使用暂存环境进行故障排除。

你可以看到的另一个技巧是内容,从网页内容到数据库数据,确保你只显示/保存数据,不要将不必要的信息存储到数据库中,并在网页上使用智能布局。减少一两秒可能会在可用性和响应时间方面产生很大的差异。

除非我们有关于您的应用程序,其体系结构和环境的详细信息,否则很难在此解释详细信息,但以上是人们用于解决此类事件的一些常用方向。

祝你好运!

答案 1 :(得分:1)

此网站拥有出色的资源http://www.websiteoptimization.com/
提到的书很棒。这里列出的技术太多了,我们到目前为止还不知道你尝试了什么。

答案 2 :(得分:1)

对于那些迟到的人抱歉,我一直很忙找到问题而且我做到了。

嗯,这个问题主要是因为apache,我有一个近300 GB的访问日志,在午夜被解析以生成webalizer统计信息。大多数情况下,当这种情况发生时,网站非常缓慢。我为域禁用了webalizer,清除了日志,看到了什么,它再次非常快,与访问它的时间无关。

我现在只有一些我今天倾向于解决的慢查询 我还按照建议更新了CI 2.0 Reactor并开始使用memcached驱动程序。

谁知道apache日志可能会有问题......

答案 3 :(得分:0)

根据统计数据,我认为你没有遇到负载问题...在预感中,我会首先查看数据库。 Database partitioning可能是一个很好的起点。

但是你应该首先对你的应用程序进行一些分析。应用程序与数据库花费了多少时间。是否存在使用大量时间并且只需要进行一些调整的应用方法?数据库查询是否未有效编写?您需要更多或更好的数据库索引吗?

答案 4 :(得分:0)

一切看起来都不错 - 如果升级codeigniter是一个选项,新的codeigniter 2.0(reactor)增加了对memcache的支持(带文件系统的新缓存驱动程序,APC和memcache支持)。当然你已经在使用xcache了,这些新增功能可能值得一试。

当缓存对象不足以容纳我们看到巨大流量的多域平台时,我们就开始投入更多硬件 - ram,servers / database。然后我们转移到数据库集群来处理单个帐户预测的重负载。现在从apache切换到nginx ......这是一场永无止境的战斗,但是对我们有用的是对我们缓存的内容以及增加服务器内存然后在服务器之间分配这些负载的看法......

答案 5 :(得分:0)

  1. 尽可能多地缓存数据库调用。在我的CI应用程序中,我有一个很少更改的设置表,因此我会缓存对其进行的所有调用,因为我一直在查询设置表。
  2. 缓存您的视图甚至控制器。我倾向于在CI应用程序中尽可能多地缓存,然后在文件更改时刷新缓存。
  3. 仅自动加载重要的库,模型和帮助程序。我见过人们自动加载了10个库,然后是一些帮助者,然后是模型。如果您正在使用它们,您只需要自动加载数据库和会话库。
  4. 关于第3点,您是否有机会在config / autoload.php文件中自动加载许多内容?它可能有助于加快速度,只需在控制器中加载您需要的东西,当然除了会话和数据库库。