好的,我们经营着一家不断壮大的汽车零部件购物车。我们的服务器运行缓慢,而且总是崩溃,所以我们请我们的网络托管商来帮助我们。他们给我们发送了这些报告,但我需要一些如何处理它的建议。
我们目前的计划是采用 MySQL 数据库并将其托管在 AWS 上,但我需要知道如何判断我们需要什么大小的实例以及哪种服务最适合。
我还需要了解对 Apache 进行哪些调整可以提高性能。
以下是网站托管方发送给我们的分析
这些问题发挥作用的方式是:
1) 您的 Web 应用程序进程占用的 RAM 非常大,超过了 512M,再加上 Apache 的调整不当,导致这些 Web 应用程序进程消耗的 RAM 超过了服务器的可用内存量。
2) 服务器上的 MySQL 服务(如 Apache)被调整为分配比服务器上可用内存多得多的内存。这会使 MySQL 服务不稳定,因此需要重新启动才能修复问题,如果对 MySQL 服务进行适当调整,不使用比安装更多的内存,则不会发生此类问题。
阿帕奇
您的服务器的 Apache MaxClients 设置是默认的 == 256
您的服务器有 32232 MB 内存
最大的 Apache Web 应用程序进程使用了 572.73 MB 内存
最小的 Apache Web 应用程序进程使用 35.02 MB 内存
Apache Web 应用程序进程平均使用 94.93 MB 内存
按照平均 Apache 进程计算,Apache 可能使用 24302.09 MB RAM(占可用 RAM 的 75.40%)
按照最大的 Apache 进程计算,Apache 可能使用 146618.89 MB RAM(占可用 RAM 的 454.89%)
如果您仅将 100% 的服务器 RAM 分配给 Apache Web 应用程序进程,则服务器的 Apache MaxClients 设置不应大于 50。
最大潜在内存使用量:146618.88 MB(可用 RAM 的 454.89%)
分配给 Apache 的 RAM 百分比 454.89 %
注意:此分析未考虑任何其他进程,例如服务器上运行的 MySQL 数据库服务,该服务也需要大量 RAM 资源才能有效运行,目前至少需要 1.2GB 的 RAM。
MySQL
-------- Performance Metrics -------------------------------------------------
[--] Up for: 14h 11m 51s (9M q [195.147 qps], 41K conn, TX: 22B, RX: 1B)
[--] Reads / Writes: 59% / 41%
[--] Total buffers: 1.6G global + 5.0G per thread (151 max threads)
[!!] Maximum possible memory usage: 756.7G (2403% of installed RAM)
[OK] Slow queries: 0% (2K/9M)
[OK] Highest usage of available connections: 23% (35/151)
[OK] Key buffer size / total MyISAM indexes: 1.0G/2.2G
[OK] Key buffer hit rate: 100.0% (9B cached / 1M reads)
[OK] Query cache efficiency: 90.4% (8M cached / 9M selects)
[!!] Query cache prunes per day: 725309
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 147K sorts)
[!!] Joins performed without indexes: 1544
[!!] Temporary tables created on disk: 47% (96K on disk / 203K total)
[OK] Thread cache hit rate: 99% (59 created / 41K connections)
[!!] Table cache hit rate: 5% (512 open / 10K opened)
[OK] Open file limit used: 1% (910/65K)
[OK] Table locks acquired immediately: 99% (2M immediate / 2M locks)
[!!] Connections aborted: 6%
建议的 MySQL 缓解措施:
运行 OPTIMIZE TABLE 对表进行碎片整理,以获得更好的性能
减少总体 MySQL 内存占用,提高系统稳定性
调整连接查询以始终利用索引
临时表大小已经很大 - 减少结果集大小
减少没有 LIMIT 子句的 SELECT DISTINCT 查询
您的应用程序没有正确关闭 MySQL 连接,请您的开发人员修复代码,以便在返回查询结果时明确关闭 MySQL 连接。
答案1
如果您在同一台服务器上托管 MySQL 和 Apache,只需将它们移到不同的机器上,您就会看到性能提升。MySQL 喜欢使用 RAM 来缓存数据,但如果您进行了大量写入操作(但看起来您并没有这样做),那么您将看不到太多的改进。
您可能还考虑使用负载均衡器并在其后面启动两个 Web 服务器。这样您就可以获得较小的实例并分散一些风险。AWS 在给定的可用区域内有多个区域(如 1a、1b 等),您可以将数据库放在 1a 中,将多可用区数据库副本放在 1b 中,同时将 Web 服务器也放在该区域中。如果 1a 出现故障,您将自动故障转移到 1b。负载均衡器将确保您还在服务器之间分配流量,这意味着过载的可能性更小。
对于所有这些,我建议你尝试以下方法
- 跑步mysqltuner看看你是否可以先调整数据库。稍后你将需要这些信息来帮助调整 RDS 实例
- 将您的数据库放入 m3.medium 或 m3.large。请记住,如果您发现超载,您可以随时更改实例类型
- 使用两个 m3.medium EC2 实例作为您的 Web 服务器。负载平衡,我敢打赌它们的性能比您现在的单片服务器更好。考虑使用类似奥普斯沃克斯使设置更加简单。如果您发现服务器超载,您可以随时使用该脚本按需启动新服务器并分担负载。
答案2
您使用的是哪种 Apache 进程模型?或者听起来像是 preform。Preform 现在已经过时了,还有其他内存占用较低的 Apache mpm。并非所有应用程序都支持它们,但大多数应用程序至少应该与 Apache amp me worker 兼容。这应该允许在使用较少内存的情况下维持甚至增加并发客户端的数量。