Я вырос в веб-разработчике и долго работал над созданием своего 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 Мбайт / с, вы исчерпываете свое сетевое соединение.