Почему мой потенциал параллелизма настолько низок для моего веб-приложения на экземпляре 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% (хотя я не уверен, что могу доверять этому на виртуальной машине), использование оперативной памяти возрастает примерно до 1,6G (оставляя 400M бесплатно). Загрузка увеличивается примерно до 8, и сайт замедляется до сканирования.
Вот что я думаю, я делаю прямо на стороне кода:
- В браузере Chrome загруженные страницы обычно загружаются за 800-1000 мс, а закешированные страницы загружаются за 300-500 мс. Не потрясающий, но и не ужасный.
- Благодаря кэшированию представления, для записи данных сеанса может быть не более одного запроса БД на загрузку страницы. Таким образом, мы можем исключить узкое место в БД.
- У меня есть БТР.
- Я использую Memcached для обслуживания кеша просмотра и других кешей сайта.
- Профилировщик кода xhprof показывает, что кэшированные страницы занимают 10–40 МБ в памяти и 100–1000 мс в настенном режиме.
Страницы, которые были бы худшими нарушителями, выглядели бы примерно так в 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 одновременных возможностей, но при таких условиях этого не произойдет.
1 ответ
Вы передаете много данных. 8 мегабайт / с, вы максимально используете сетевое соединение.