【问题标题】:Looking for a short term solution to improve website performance with additional server [closed]寻找一种短期解决方案来通过额外的服务器来提高网站性能[关闭]
【发布时间】:2012-11-22 07:33:05
【问题描述】:

我正在与一个小团队合作运行一个使用 PHP 5.3.9、MySQL 5.0.77 运行的内部网站。所有文件和数据库都托管在具有以下配置的专用 Linux 机器上:

Intel Xeon E5450 8 个 CPU 内核 @3.00GHz, 2992.498 兆赫, 缓存 6148 KB, Cent OS – Red Hat Enterprise Linux Server 5.4 版

我们从小规模开始,然后数据库变得更大,现在网站性能显着下降。我们经常遇到服务器空间溢出、mysql 因调用过多而超载等问题。我们没有太多处理这些问题的经验。我们最近获得了另一台服务器,我们正在考虑使用它来提高性能。由于它具有更好的配置,我们中的一些人希望将所有东西完全转移到新机器上。但我试图找出我们如何利用这两台机器来优化性能。我找到了诸如 MySQL 集群、负载均衡器等选项。我想知道是否可以针对这种情况获得任何建议“如何在短期内利用两台机器以获得最佳性能”,那太好了。短期来看,我们正在寻找可以在一个月左右部署的东西。

提前感谢您的宝贵时间。

【问题讨论】:

  • 尝试将您的 MySQL 服务器移动到单独的机器上。如果您将会话存储在集中存储(如数据库)而不是服务器上的普通文件中,则可以添加另一个 Web 服务器。您需要为此编写一个自定义会话处理程序。如果您有多个 Web 服务器,请不要忘记使用负载平衡。还可以尝试缓存 SQL 查询的结果(在 memcached 或 Redis 中),这可以显着提高性能。
  • 是的,最简单的改进就是在旧机器上运行你的mysql服务器,在新机器上运行你的web服务器。

标签: php mysql performance optimization cluster-analysis


【解决方案1】:

通过某种负载平衡使网站在两台服务器上运行比您想象的要困难得多...

我解决该问题的方法是让团队中的某个人调查与数据库相关的问题,例如 SLOW QUERIES(MySQL 可以配置为记录任何需要超过一定时间才能完成的查询),然后检查原因(使用 MySQL EXPLAIN)。很少有索引可以解决关键故障点,让您有时间提出可靠的长期解决方案。如果数据库的优化非常糟糕,这甚至可以消除现在做任何其他事情的需要!

您可以将 MySQL 移动到同一网络中的另一台机器上,这样您就可以分离 Web 服务器负载和 DB 负载。

考虑缓存一些不经常更改但在网站上的每个请求时加载的数据部分。 Memcached、redis 缓存、文件缓存,什么都行。

另一个短期解决方案(而且相对于开发人员的时间而言更便宜)是将 HDD 替换为 SSD,尤其是当您有磁盘需要大量查找的查询时。根据我的个人经验,这可能会产生巨大的影响。

【讨论】:

    【解决方案2】:
    • 您使用的是 2009 年 1 月发布的 MySQL 5.0.77。MySQL 的性能和可扩展性有了很大的改进。您应该升级到当前版本,即撰写本文时的 5.5.28。仅此一项就可以大大提高性能。

    • 您应该分析您的查询,以确保您有正确选择的索引。这是提高性能的关键步骤。请参阅我的演示文稿How to Design Indexes, Really,了解有关如何执行此操作的一些提示。

    • 在现代版本的 MySQL 中,InnoDB 几乎总是比 MyISAM 更好的存储引擎选择。始终进行测试以确保,因为在某些极端情况下 MyISAM 可能仍然运行得更快。尽管 InnoDB 有更多的调优参数,但设置好它们很重要,因为默认值太低而无法获得良好的性能。您可以在我的演示文稿MySQL 5.5 Guide to InnoDB Status 中获得一些有关调整 InnoDB 配置参数的见解。

    • 您应该将数据库放在与您的应用程序分开的专用服务器上。对性能的最佳改进通常是增加您用于innodb_buffer_pool_size 的内存量(假设您使用 InnoDB 存储引擎)。

    • 正如 @Veseliq 建议的那样,为您的数据目录升级到 SSD 驱动器是提高性能的好方法。

    • 将 MySQL 的 tmpdir 配置为也使用您的 SSD 驱动器。

    • 如果您无法获得 SSD 驱动器,那么最好的选择是带有回写式缓存的 RAID 控制器。

    • 设置 MySQL 配置 skip_name_resolve 以消除应用程序连接时对 DNS 反向查找的依赖。如果这样做,则需要按 IP 地址而非主机名授予 SQL 权限。

    • 其他各种 Linux 调优改进:

      • 在您的数据目录上使用 XFS 文件系统,而不是 Linux 默认的 ext3。
      • 使用 noatime 选项装载文件系统。
      • 使用 deadline 磁盘 I/O 调度程序,而不是 Linux 默认的 cfq。

    【讨论】:

      【解决方案3】:

      最简单的第一步是将数据库和前端应用程序进程分开,将它们放在不同的机器上。这通常允许您通过修改my.cnf 设置为mysqld 进程分配更多内存。

      与往常一样,将堆栈和后端更新到最新版本,以确保最大限度地利用硬件。

      密切注意系统上运行的数据库调用,看看是否有任何方法可以加快这些调用。例如,EXAMINE 通常可以显示任何给定的SELECT 调用的执行策略,并且会显示您缺少索引的位置,这通常是最大的性能拖累。如果您遇到“表扫描”或“使用文件排序”的问题,那么您在大型数据集上基本上就死定了。您需要索引或不同的架构。

      第二步是添加更多的前端应用服务器,并添加某种负载均衡器。这为您提供了额外的前端容量以更好地处理负载,但也会使您的数据库负载更多。

      第三步是确保您在调用SELECT 期间不会进行任何不必要的JOIN 操作。非常仔细地检查您需要从数据库中获取的内容,并尝试一次从一张表中获取所有内容。战术反规范化通常是这里的解决方案,但如果您不小心正确地执行此操作,则会出现同步问题。执行此操作时请密切注意,并确保您有广泛的测试覆盖范围。

      第四步通常是通过使用像Memcached 这样的缓存来缓冲数据库上的大量读取活动,以避免经常访问数据库。请记住,最快的数据库调用是您不调用的。

      没有灵丹妙药,但如果你按照这个顺序做事,你应该有一个战斗的机会。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多