Strona 1 z 1

Częste zawieszanie się PHP

: 27 lipca 2010, 14:02
autor: drakerc
Witam.

Mam na serwerze serwer lighttpd w najnowszej wersji wraz z PHP5-cgi. Mam tam dosyć popularną stronę (około 6000uu dziennie) opartą na Joomli. Jednak dziś dwukrotnie zdarzył mi się dziwny problem: procesy /usr/bin/php5-cgi zajmują 100% użycia procesora do czasu aż zresetuję cały serwer lub lighttpd. Po resecie przez około 2 godziny jest normalnie, a potem znów 100% użycia procesora przez php5.

Czy mógłby mi ktoś doradzić, co mam z tym zrobić? Resetowanie lighttpd nie jest dla mnie wygodną opcją, bo na stronie prowadzę serwis z pobieraniem plików, a przez to użytkownikom przerywa się pobieranie dużych plików (mody do gier). Jak to naprawić? Opcjonalnie - czy istnieje jakiś sposób resetowania samego php5, a nie lighttpd?

Załączam mój konfig PHP, być może on jest winny?

http://pastebin.com/N23h6Qd7

Dziękuję za odpowiedź. W załączniku zrzut ekranu z programu htop podczas 100% użycia.

: 27 lipca 2010, 17:18
autor: grzesiek
Zainteresuj się ustawieniami, jak długo może być wykonywany skrypt, czy coś w tym stylu. Może to być wina jakiegoś skryptu, jeżeli aplikacja serwera nie była ostatnio zmieniana, a problem pojawił się nagle.

: 27 lipca 2010, 17:52
autor: drakerc
Ustawiłem max_execution_time na 30 i od dłuższego czasu problem znikł. Dzięki za odpowiedź.

Byłbym wdzięczny za niezamykanie jeszcze tematu, bo nie wiem, czy to tylko było tymczasowe rozwiązanie, czy problem jest już rozwiązany.

: 27 lipca 2010, 19:45
autor: Bastian
Generalnie nie słyszałem o przypadku, gdy obciążanie serwera przez skrypt byłoby związane, z krótkim czasem na wykonanie skryptów. Zazwyczaj krótkie czasy na wykonanie skryptu powodują, iż skomplikowany skrypt nie zdąża się wykonać i tyle. W twoim przypadku wygląda to tak jakby jakiś skrypt powodował obciążenie. Może masz jakąś pętlę czy coś. Zauważ, że pojedyńczy skrypt obciąża czas procesora w ok 20% a to jest generalnie możliwe, jeżeli jest mocno skomplikowany. Często tak się dzieje, gdy skrypt mocno męczy bazę danch, chociaż na moje oko to powinien wtedy proces bazy danych pojawić gdzieś w górnej pozycji, więc pewności nie mam.

: 27 lipca 2010, 21:09
autor: drakerc
Akurat ze względu na to, że mamy bardzo potężną bazę danych to korzystamy ze zdalnego MySQL-a na innym serwerze w tej samej serwerowni, bo przedtem było bardzo duże zużycie RAM-u i procesora.

Wcześniej miałem naprawdę duży max_execution_time, chyba kilka tysięcy sekund. Może ktoś z konkurencji chciał nam zrobić na złość i coś robili - nie wiem. Na szczęście do tej pory jest wszystko w porządku, a zmniejszenie max_execution_time'u raczej nie odbiło się u nas zbytnio na niczym (tak w ogóle to jeśli przykładowo wgrywam duży plik w PHP, to to czy się "wgra" zależy od max_input_time, mam rację?).

Sprawdziłem również logi błędów lighttpda i trochę dziwne rzeczy działy się tam podczas, gdy serwer padał. Jeśli ktoś jest zainteresowany ich przejrzeniem i wysunięciem wniosku, to dostępne są tutaj:
http://modbase.pl/error.log.txt
Problemy z tego co pamiętam były koło 9:50 i prawdpodobnie (spałem) około 6:10.

: 28 lipca 2010, 09:05
autor: Bastian
tak w ogóle to jeśli przykładowo wgrywam duży plik w PHP, to to czy się "wgra" zależy od max_input_time, mam rację?
Tak.

Nie znam się na logach lighttpd, ale to wygląda tak jakbyś miał w konfiguracji ustawione logowanie tylko błędów.

: 28 lipca 2010, 10:34
autor: drakerc
Oczywiście załączyłem jedynie log błędów, wolałem, aby access_log pozostał u mnie, poza tym mam ponad 40000 wyświetleń strony dziennie i access_log waży naprawdę sporo.

Na razie temat można już zamknąć - od wczoraj wszystko jest w porządku. Jak coś znów będzie to skontaktuję się z kimś z moderatorów o otworzenie tematu.

Edycja:
Jeszcze jedno pytanie, czy jest jakiś sposób na "reset" lighttpda w taki sposób, aby tylko wczytał nowy konfig, a nie wyłączał się i włączał (przez wyłączenie moim użytkownikom wyłącza się pobieranie plików) lub jakoś bez przerywania połączeń klientów?

: 30 lipca 2010, 18:21
autor: life
Wysyłanie plików do użytkowników robisz przez PHP

Kod: Zaznacz cały

readfile();
czy normalnie przez HTTP? Jak przez readfile to przy dużych plikach i dużej ilości odwiedzin będzie to mordercze.

Z wgrywaniem plików możesz pokombinować przez FTP. Dać użytkownikom dostęp a potem skryptem tylko przetwarzać pliki z konta użytkownika itp.