为什么我的 LAMP EC2 实例上的 Web 应用程序的并发容量如此低?

为什么我的 LAMP EC2 实例上的 Web 应用程序的并发容量如此低?

我是一名 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,您的网络连接已经达到最大限度。

相关内容