Назад | Перейти на главную страницу

Почему у меня так мало возможностей параллелизма для моего веб-приложения в экземпляре LAMP EC2?

Я вырос в веб-разработчике и долго работал над созданием своего PHP-приложения с использованием инфраструктуры CakePHP. Проблема возникла, когда я начал тестирование ab (Apache Bench) на экземпляре Amazon EC2, в котором находится приложение. У меня ужасное среднее время загрузки страницы, хотя я использую экземпляр c1.medium (2 ядра, 2 ГБ ОЗУ), и я думаю, что все делаю правильно.

Я бы побежал:

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, ЦП постоянно на 80-100% (хотя я не уверен, что могу доверять этому на виртуальной машине), использование RAM увеличивается примерно до 1,6 G (оставив 400M бесплатно). Загрузка увеличивается примерно до 8, и сайт замедляется до ползания.

Вот что, как мне кажется, я делаю правильно со стороны кода:

Страницы, которые были бы самыми серьезными нарушителями, в 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? Что мне не хватает? Я действительно хочу достичь 1000 одновременных операций, но с такой скоростью этого не произойдет.

Вы передаете много данных. 8 Мбайт / с, вы исчерпываете свое сетевое соединение.