Dlaczego mam tak mało możliwości współbieżności dla mojej aplikacji internetowej w instancji LAMP EC2?
Dorastałem jako programista stron internetowych i spędziłem dużo czasu na tworzeniu aplikacji PHP przy użyciu frameworka CakePHP. Problem pojawił się, gdy zacząłem testować ab (Apache Bench) na instancji Amazon EC2, w której znajduje się aplikacja. Mam okropny średni czas ładowania strony, chociaż używam instancji c1.medium (2 rdzenie, 2 GB RAM) i myślę, że robię to dobrze.
Biegałbym:
ab -n 200 -c 20 [url=http://localhost/heavy-but-view-cached-page.php]http://localhost/heavy-but-view-cached-page.php[/url]
Oto wyniki:
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
Podczas gdy test ab jest uruchomiony, uruchamiam VMStat, który pokazuje, że Swap pozostaje na 0, procesor jest stale 80-100% (chociaż nie jestem pewien, czy mogę ufać temu w VM), użycie pamięci RAM wzrasta do około 1,6 G (pozostawiając 400M za darmo). Ładowanie wzrasta do około 8, a witryna zwalnia do indeksowania.
Oto, co myślę, że robię bezpośrednio od strony kodu:
- W Chrome niezbuforowane strony ładują się zwykle w 800-1000 ms, a strony w pamięci podręcznej zwykle ładują się w 300-500 ms. Nie jest to niesamowite, ale też nie przerażające.
- Dzięki buforowaniu widoków nie może być więcej niż jedno żądanie do bazy danych na załadowanie strony, aby zapisać dane sesji. W ten sposób możemy wyeliminować wąskie gardło w bazie danych.
- Mam APC.
- Używam Memcached do obsługi pamięci podręcznej widoku i innych pamięci podręcznych witryn.
- Profiler kodu xhprof pokazuje, że buforowane strony zajmują od 10 do 40 MB pamięci i 100 do 1000 ms czasu.
Strony, które byłyby najgorszymi przestępcami w xhprof, wyglądałyby mniej więcej tak:
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
Moja konfiguracja Apache:
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 3<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 120
MaxRequestsPerChild 1000
</IfModule>
Czy coś jest nie tak z serwerem? Czy coś jest nie tak z EC2? Czy to jest mój kod? Niektóre oczywiste ustawienia, na które powinienem się zwrócić. Zbyt wiele wyszukiwań DNS? czego mi brakuje? Naprawdę chcę osiągnąć 1000 jednoczesnych operacji, ale tak się nie stanie.
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
1 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od: