Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [apache, Win2003] Wydajność Apache na Windows 2003 server
Forum PHP.pl > Forum > Serwery WWW > Apache
soska66
Witam

Mam dość spory problem z wydajnością serwera. Problem, z którym nie mogę sobie poradzić bo nie potrafie znależć jego źródła. Proszę o pomoc. Udziele wszelkich potrzebnych danych

Strona jest postawiona na następującym systemie - Windows Server 2003, Apache 2.2, PHP 5.3 i MySQL 5.5. Na serwerze działa jednocześnie MSSQL server i IIS6, które obsługują drugą, działającą na innym adresie IP, stronę.

Każda podstrona generuje pomiędzy 70-100 zapytań i w większości są to obrazki choć jest też sporo plików js (około 7-10) i css (tez okolo 7-10). Na każdą podstronę przypada też około 100 z reguły prostych zapytań SELECT do bazy danych. Sesja przechowuje każdorazowo około 15 zmiennych.

Po analizie access.log wychodzi, że normą jest około 1000 hits w ciągu kilkudziesięciu minut.

Strona z reguły ładuje się wolno. Koło 3-4 sekund zanim zostanie wyświetlona odpowiedź z serwera (pojawi się tytuł strony w zakładce). Ale nie zawsze... Bo przykładowo po 5 kliknięciach, następne dwa odświeżenia potrafią nastąpić w ułamku sekundy. Podobnie jest z odczytem przez ajax mimo, ze wczytywana logika jest i krótsza i przede wszystkim ma zaledwie kilka prostych zapytań SELECT do bazy w porównaniu do załadowania całej strony.

Gdy strona zaczyna działać wolno, apache zużywa około 200mb pamięci, mysql około 80mb (co zostawia około 1,5gb wolnej pamięci). Zużycie procesora jest niewielkie dla tych procesów (za to około 25% ciągnie proces cidaemon). Analiza zapisów xdebuggera jest niejasna albo nie potrafie jej zinterpretować - kilka testów pokazało śmiesznie krótki czas ładowania w zasadzie wszystkiego, prócz sessions_start. Wygooglowałem, że dyski NTFS miewają problemy z częstym używaniem sesji zapisywanych w plikach i zacząłem poszukiwania w tym kierunku do póki nie okazało się, że całkowite wyrzucenie sesji z kodu niczego nie przyspiesza

Nie wiem co robić i gdzie szukać. Konfigurowałem pliki apache (mpm i default), obecnie mam threads per process ustawione na 1000, keepAlive on i keepAliveTimeout na 2. Manewrowanie tgymi ustawieniami nie powoduje jednak znaczącej różnicy. MySQL przyjmuje obecnie do 500 połączeń (maxconnections). Mam również zainstalowany xcache, zaindeksowane odpowiednie pola w bazie i włączone query buffering

Zdaję sobie sprawę, że nie wkleiłem żadnych konkretnych konfiguracji i być może podałem za mało informacji. Z przyjemnością podam co trzeba jeśli znajdzie się ktoś chętny pomóc. Mam małe doświadczenie z Windows Server i nie wiem za bardzo, w którym teraz iść kierunku

Dzięki
Niktoś
Zastanawiałeś się nad innymi serwerami-jeśli posiadasz 2 różne serwery to ja na twoim miejscu użył bym jednego.
Zastanowiłbym się nad Nginxem i postawić na tym wszystko-php na fastcgi i iisa jako proxy serwer-myślę ,że jest to jak najbardziej możliwe do zrealizowania.Dodatkowo patrząc na opinię innych i przeprowadzane przez nich testy nginx jest szybszym serwerem niż Apache i IIS i mniej zasobożernym.
Nie wiem ,może ktoś zna lepszy serwer,ja bym postawił na ten serwer.


Odnośnie tych dwóch serwerów,cashowanie plików image ,jak i css, fakt ,że kosztem pamięci,ale także powinno przyspieszyć wczytywanie się strony.
soska66
Cytat(Niktoś @ 16.11.2011, 14:25:36 ) *
Zastanawiałeś się nad innymi serwerami-jeśli posiadasz 2 różne serwery to ja na twoim miejscu użył bym jednego.
Zastanowiłbym się nad Nginxem i postawić na tym wszystko-php na fastcgi i iisa jako proxy serwer-myślę ,że jest to jak najbardziej możliwe do zrealizowania.Dodatkowo patrząc na opinię innych i przeprowadzane przez nich testy nginx jest szybszym serwerem niż Apache i IIS i mniej zasobożernym.
Nie wiem ,może ktoś zna lepszy serwer,ja bym postawił na ten serwer.


Wszystko pięknie brzmi tylko, że w tej sytuacji to nie jest nasz serwer. Serwer należy do klienta, a ta druga strona postawiona na IIS (asp .net) nie jest moim dziełem. Dodatkowo system korzysta z importera, który może działać tylko na Windzie. Także tego typu zmiana odpada

Poza tym, kłopotliwość tej sytuacji polega na tym, że musiałbym udowodnić, że to serwer jest przyczyną problemów z wydajnością aby nawet myśleć o jakichkolwiek sugestiach dotyczących migracji. A ja dowieść tego nie mogę bo na tą chwilę po prostu nie wiem skąd te problemy (właśnie dlatego tu piszę). Dodatkowo, sama maszyna nie jest taka kiepska - dedykowan pudło z duo core i z 4gb ramu
by_ikar
Z tego co czytam, to w sumie najwięcej czasu schodzi na pobranie obrazków/styli/skryptów js. Podałeś że zarówno arkusze jak i style masz więcej niż w kilku plikach. Proponuje ci połączyć wszystkie style do jednego arkusza, to samo tyczy się skryptów js. Poczytaj o css sprites. Może być tak że tych obrazków masz dużo, layout pocięty w jakieś malutkie części i tutaj już nie tyle ważna jest kwestia rozmiaru takich obrazków, co ich ilość; ponieważ przeglądarki mają ograniczoną ilość żądań dla jednej domeny. Możesz rozmieszczać pliki na kilku subdomenach, wtedy zapewniasz równoległe pobieranie kilku plików. xdebug wygenerował ci plik, który można sobie przeanalizować chociażby w webgrind. Załącz ten plik, z chęcią zobaczę ile czasu ci się tam ten session_start generuje.

Nie dam sobie co do tego ręki uciąć, ale często zdarza mi się spotykać z opinią (linków pod ręką nie mam na szybkiego) że apache będzie chodził wolniej pod windowsem, dlatego że w głównej mierze został napisany na systemy *.nixowe. Dodatkowo windows ma jedną wadę i zaletę jednocześnie. Każdą ścieżkę do pliku możesz podać zarówno z małych liter jak i z dużych. Windows jakby dwa lub nawet więcej razy, sprawdza tą samą ścieżkę do pliku, uwzględniając różne kombinacje wielkości liter. Sam zauważyłem jakieś 30-40% różnicy w czasie generowania skryptu jeżeli chodzi o windowsa w stosunku do *.nixa. Przykładowo ten sam skrypt na podobnej konfiguracji apache/mysql/php w przypadku windowsa generuje się w jakieś ~300ms, w przypadku *.nixa czas generowania oscyluje między 180ms a 210ms. Mogą być jeszcze inne powody w przypadku windowsa, udało mi się jakiś czas temu zauważyć właśnie ten problem z tymi ścieżkami..
Niktoś
Cytat
Wszystko pięknie brzmi tylko, że w tej sytuacji to nie jest nasz serwer. Serwer należy do klienta, a ta druga strona postawiona na IIS (asp .net) nie jest moim dziełem.


Trzeba klientów uświadamiać,że mogą występować lepsze rozwiązania niż dwa opasłe serwery.
soska66
Cytat(by_ikar @ 16.11.2011, 14:51:40 ) *
Z tego co czytam, to w sumie najwięcej czasu schodzi na pobranie obrazków/styli/skryptów js. Podałeś że zarówno arkusze jak i style masz więcej niż w kilku plikach. Proponuje ci połączyć wszystkie style do jednego arkusza, to samo tyczy się skryptów js. Poczytaj o css sprites. Może być tak że tych obrazków masz dużo, layout pocięty w jakieś malutkie części i tutaj już nie tyle ważna jest kwestia rozmiaru takich obrazków, co ich ilość; ponieważ przeglądarki mają ograniczoną ilość żądań dla jednej domeny. Możesz rozmieszczać pliki na kilku subdomenach, wtedy zapewniasz równoległe pobieranie kilku plików. xdebug wygenerował ci plik, który można sobie przeanalizować chociażby w webgrind. Załącz ten plik, z chęcią zobaczę ile czasu ci się tam ten session_start generuje.

Nie dam sobie co do tego ręki uciąć, ale często zdarza mi się spotykać z opinią (linków pod ręką nie mam na szybkiego) że apache będzie chodził wolniej pod windowsem, dlatego że w głównej mierze został napisany na systemy *.nixowe. Dodatkowo windows ma jedną wadę i zaletę jednocześnie. Każdą ścieżkę do pliku możesz podać zarówno z małych liter jak i z dużych. Windows jakby dwa lub nawet więcej razy, sprawdza tą samą ścieżkę do pliku, uwzględniając różne kombinacje wielkości liter. Sam zauważyłem jakieś 30-40% różnicy w czasie generowania skryptu jeżeli chodzi o windowsa w stosunku do *.nixa. Przykładowo ten sam skrypt na podobnej konfiguracji apache/mysql/php w przypadku windowsa generuje się w jakieś ~300ms, w przypadku *.nixa czas generowania oscyluje między 180ms a 210ms. Mogą być jeszcze inne powody w przypadku windowsa, udało mi się jakiś czas temu zauważyć właśnie ten problem z tymi ścieżkami..


Dzieki za sugestie. Wiem, ze Windows czyta troche wolniej ale zakładam, że nawet a ramach tego wolniejszego czytania powinien być konsekwentny.
Jeśli chodzi o obrazki, js i css... Faktyczenie mógłbym to poprawić ale patrząc na analizy ładowania choćby w firebug, nie wygląda to na podstawowy problem. Ładowanie css, js i obrazków następuje dopiero po załadowaniu logiki php i, z pewnymi wyjątkami, trwa chwile. Mnie najbardziej martwi process płatności na stronie. To prawie nie zawiera obrazków i bardzio mało js a mimo to potrafi się wy-time-out'owac - tak przynajmniej twierdza klienci sklepu.

Zanim zaczniemy, jeśli oczywiście będziecie dalej chętni pomóc, szukać dalej, chciałbym się upewnić apropos żądań i zapytań do bazy. 100 requestów na strone i też kolo 100 prostych zapytań do bazy to chyba nie jest jakoś strasznie dużo prawda? Jak pisałem wcześniej mysql i apache są bardzo daleka od zużycia zasobów pamięci i procesora. Czy możecie wskazać parametry konfiguracji, które mogłyby być ważnym czynnikiem w mojej sytuacji? Wolałbym rozwiać wszelkie swoje wątpliwości na poziomie konfiguracji mysql i apache zanim zaczne analizować sam system Windows
by_ikar
100 zapytań to jest i dużo i mało. Wszystko zależy od rodzaju zapytań, bo mogą być nie optymalne, oraz innych czynników już od strony samej bazy danych, jak chociażby indeksowanie i tym podobne zabiegi które ziarko do ziarka potrafią dość sporo czasu zabrać. Domyślne ustawienia mysql nie do końca są świetne, do testów jak najbardziej, ale już na serwerze produkcyjnym osobiście zawsze w ustawieniach o ile mogę to włączam cache (żeby nie pisać tego samego, odsyłam do pierwszego wyniku jaki znalazłem: http://www.jasinski.us/2011/cache-w-mysql/ ). Dodatkowo nie wspomniałeś o tym czy masz zainstalowany jakiś akcelerator php? To też trochę pomaga.

Cytat
Mnie najbardziej martwi process płatności na stronie. To prawie nie zawiera obrazków i bardzio mało js a mimo to potrafi się wy-time-out'owac - tak przynajmniej twierdza klienci sklepu.

A jak tą płatność wykonałeś? Na szybkiego możesz limit czasu wykonywania skryptu zwiększyć, tak żeby od razu coś zaradzić, a najlepiej właściwie jak podasz kod w jaki sposób masz zaimplementowaną tą płatność, lub jeżeli nie bardzo możesz, zarzuć plikiem który ci wygenerował xdebug.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.