Monitorowanie obciążenia (load) serwera linux, raportowanie na mail
h2. Pamiętnik znaleziony w Logu - część 1
W tym odcinku poznamy sposób aby dostawać na swój mail codzienny raport z uptime i wartościa load serwera z poprzedniego dnia.
*Czym jest load?* To uśredniona ilość korzystających z lub oczekujących na zasoby procesów z ostatnich 1, 5 i 15 minut. Wartość ta w idealnym świecie nie powinna przekraczać 1 (jak podaje życzliwy komentator dopuszcza się load 2 per rdzeń procesora), co oczywiście jest trudne przy dużych stronach i słabszych serwerach. Z moich obserwacji wynika, że jeśli nasz serwer w momencie szczytowego obciążenia będzie mieścił się w wartości 3 per rdzeń to raczej nie ma co panikować, choć przy takim load nasi użytkownicy prawdopodobnie odczują jakiś dyskomfort podczas korzystania z serwisu.
WARUNKI
* Debian etch,
* lighttpd,
* mysql,
* postfix,
* php5 po fastCGI.
WSTĘP
Przyznam, że kupując dedykowany serwer pod stronę, zagrałem bardzo ryzykownie. Z linuxem miałem dotąd wspólnego tyle, że dwa razy zainstalowałem sobie Ubuntu jako desktop. Nie znałem więcej niż 3 polecenia konsoli - ls, cd i exit.
No ale serwer kupiony, na admina mnie i basoofkę nie stać, co poradzić, trzeba się tego Debiana nauczyć bo kasa leci a amerykanie się zbroją!
Najpierw postanowiłem dowiedzieć się czy serwer jaki kupiłem jest wystarczający do obsłużenia mojej strony.
PO CO NAM TO?
Musimy jakoś mierzyć, czy zakupiona maszyna radzi sobie z ruchem na stronie. Jeśli zrobimy to szybko, być może unikniemy kosztów opłacania zbyt słabego serwera i zamówimy mocniejszy. Poza tym codzienne sprawdzenie tej wartości pozwoli nam w przyszłości odkryć czy nasza strona nie zaczyna zbliżać sie do jakiejś wartości krytycznej i z wyprzedzeniem zabezpieczyć środki i czas na odpowiednie kroki - czy to wymianę sprzętu czy optymalizację strony.
Ja postanowiłem zrobić to na początku za pomocą dostępnych w każdym Debianie, bardzo prymitywnych metod. Jest to sposób nie wymagający zewnętrznych narzędzi, ale też mało wyrafinowany. Pamiętajmy jednak, że wymyśliłem go po kilku dniach zabawy z linuxem, a mam naleciałości windowsowe, gdzie wyrafinowanie jest rzadziej spotykane. Dlatego proszę wszystkich linuksowych mastahów o komentarze krytyczne a nie prześmiewcze.
DO ROBOTY
Po pierwsze musimy przekierować pocztę przychodzącą na konto root tak, aby trafiała do naszej skrzynki zewnętrznej. W moim wypadku wyedytowałem plik aliases:
# nano /etc/aliases
i wpisałem tam linijkę
root:mojadres@mail.com
a wszystkie inne usługi przekierowałem na root'a, a więc
admin:root
www-data:root
ftp:root
i tak dalej...
Następnie na moim koncie mailowym stworzyłem filtr kierujący pocztę z serwera do osobnego folderu, gdzie zaglądam co rano i sprawdzam pocztę.
Ale aby coś tam trafiło należy na serwerze to skonfigurować. Ja użyłem crontab'a aby raportował mi obciążenie serwera do pliku a raz na dobę wysłał mi ostatnie kilkadziesiąt linijek.
Najpierw stwórzmy plik uptime komendą:
# touch /var/log/uptime
Następnie wejdźmy w w edycję crontab'a
# crontab -e
Teraz dopiszmy dwie linijki odpowiadającą za dopisanie do pliku informacji o obecnym obciążeniu serwera
50 * * * * uptime >> /var/log/uptime
1,10,20,30,40 16-23 * * * uptime >> /var/log/uptime
co oznaczają linie? Pierwsza wywołuje polecenie uptime co godzinę, w 50-tej minucie. Dane wyjściowe są dopisywane (znak >> oznacza dopisanie a > nadpisanie) na końcu pliku /var/log/uptime. Druga linia robi to samo, ale co 10 minut między godzina 16 a 23. W tym czasie jest największy ruch, stąd chcemy mieć bardziej szczegółową informację.
Ostatni krok to dodanie linijki wywołującej polecenie tail:
55 5 * * * tail -n 64 /var/log/uptime
Spowoduje ona wysłanie o godzinie 5:55 rano ostatnich 64 linijek z pliku /var/log/uptime na skrzynkę root, a co za tym idzie na moją prywatną skrzynke pocztową.
Co za informację dostajemy? Bardzo podstawową, składającą się z uptime serwera, ilości zalogowanych użytkowników i wartości load serwera.
Przykładowy wycinek z codziennego maila:
bq. 14:50:01 up 14 days, 2:00, 0 users, load average: 2.44, 1.25, 0.86
15:50:01 up 14 days, 3:00, 0 users, load average: 0.36, 0.35, 0.40
16:01:01 up 14 days, 3:11, 0 users, load average: 0.74, 0.54, 0.47
16:10:01 up 14 days, 3:20, 0 users, load average: 0.74, 0.67, 0.55
16:20:01 up 14 days, 3:30, 0 users, load average: 0.69, 1.06, 0.81
16:30:01 up 14 days, 3:40, 0 users, load average: 0.94, 0.92, 0.81
Oczywiście przedstawiona metoda jest bardzo prostacka, ale na razie działa. Jeśli znacie dobry i lekki system monitorujący, to polećcie.
Wkrótce kolejny wpis do dzienniczka, tym razem o kopiach zapasowych.

"Wartość ta w idealnym
"Wartość ta w idealnym świecie nie powinna przekraczać 1" na kazdy rdzen w serwerze.
Jezeli serwer ma dwa rdzenie to load ponizej 2 jest ok, powyzej znaczy, ze procesy stoja w kolejce (ale to nadal nic zlego - generalnie load ponizej 2 * ilosc rdzeni jest ok i nie ma sie niczym przejmowac).
dzięki za zwrócenie uwagi,
dzięki za zwrócenie uwagi, już poprawiłem w treści artykułu
Witam. Dzięki za art. Mój
Witam.
Dzięki za art. Mój serwis posiada w godz. szczytowych ponad 20 load i strasznie się wolno ląduje... Nie wiem dokładnie od czego to zależy, mam zainst. OpenSuse, statystyki to 7 tys. uq dziennie przy serwerze Celeron D/215/220 1.20+ GHz 1 GB RAM. Czy to jest za słaby serwer na taki serwis? Czy może tak wysoki load jest wynikiem działania niepotrzebnego programu?
Pozdrawiam i z góry thx za odp.
Ugh duzo po czasie - ale
Ugh duzo po czasie - ale moze sie przyda innym. Proponuje :
1. Wylacznie zbednych usług,
2. Rekompilacja apache + php (dostosowanie do wlasnych potrzeb - ja osobiscie zrezygnowałem z apache na rzecz nginx-a),
3. Optymalizacja zapytań do bazy (u mnie w firmie okazalo sie ze mozna procedury w Sybase-ie zoptymalizowac z !!9 minut!! do okolo 30 sek ;))
4. Keszowac php,
Dla bardziej rozbudowanych serwisów reverse proxy - ja uzywam do tego (40K na dobe) 2x squida oraz nginx-a
dodatkowo mam wydzielony serwer obrazków :)
Znam inny, może lepszy sposób
Znam inny, może lepszy sposób - Lstat -> http://stary.dug.net.pl/...