![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 132 Pomógł: 1 Dołączył: 3.02.2005 Ostrzeżenie: (0%) ![]() ![]() |
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 Ten post edytował soska66 16.11.2011, 15:16:21 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 798 Pomógł: 307 Dołączył: 13.05.2009 Skąd: Gubin/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 3.10.2025 - 08:52 |