我是一名 Web 开发人员,一直在使用 CakePHP 框架构建我的 PHP 应用程序。当我开始在应用程序所在的 Amazon EC2 实例上进行 ab(Apache Bench)测试时,出现了问题。尽管我运行的是 c1.medium 实例(2 核,2GB RAM),但平均页面加载时间非常糟糕,我认为我做的一切都是正确的。
我会跑:
ab -n 200 -c 20 http://localhost/heavy-but-view-cached-page.php
结果如下:
Concurrency Level: 20
Time taken for tests: 48.197 seconds
Complete requests: 200
Failed requests: 0
Write errors: 0
Total transferred: 392111200 bytes
HTML transferred: 392047600 bytes
Requests per second: 4.15 [#/sec] (mean)
Time per request: 4819.723 [ms] (mean)
Time per request: 240.986 [ms] (mean, across all concurrent requests)
Transfer rate: 7944.88 [Kbytes/sec] received
在 ab 测试运行时,我运行 VMStat,结果显示 Swap 保持在 0,CPU 持续处于 80-100%(虽然我不确定是否可以在 VM 上信任此数据),RAM 利用率上升到大约 1.6G(剩余 400M 可用)。负载上升到大约 8,网站速度缓慢。
以下是我认为我在代码方面做得正确的事情:
- 在 Chrome 浏览器中,未缓存的页面通常需要 800-1000 毫秒才能加载完成,而缓存的页面则需要 300-500 毫秒才能加载完成。虽然不是很惊人,但也不算太糟糕。
- 由于视图缓存,每次页面加载最多可能只有一个数据库查询来写入会话数据。因此我们可以排除数据库瓶颈。
- 我已打开 APC。
- 我正在使用 Memcached 来提供视图缓存和其他站点缓存。
- xhprof 代码分析器显示缓存页面占用 10MB-40MB 内存和 100ms - 1000ms 挂钟时间。
最严重的违规页面在 xhprof 中看起来会像这样:
Total Incl. Wall Time (microsec): 330,143 microsecs
Total Incl. CPU (microsecs): 320,019 microsecs
Total Incl. MemUse (bytes): 36,786,192 bytes
Total Incl. PeakMemUse (bytes): 46,667,008 bytes
Number of Function Calls: 5,195
我的 Apache 配置:
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 3
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 120
MaxRequestsPerChild 1000
</IfModule>
服务器出了问题吗?EC2 出了问题吗?还是我的代码出了问题?我应该检查一些明显的设置吗?DNS 查找太多了?我遗漏了什么?我真的想达到 1,000 个并发容量,但照这样下去,这是不可能的。
答案1
您正在传输大量数据。8mbytes/s,您的网络连接已经达到最大限度。