Wydajny Linux Jakub Woźniak KN Sieci Komputerowych i Systemów Rozproszonych Tenesys
Po co analizować wydajność? redukcja kosztów, poznanie limitów systemu operacyjnego, eliminacja wąskich gardeł.
Jak system wpływa na wydajność?
Nasz świat jest skomplikowany
Od czego zależy wydajność aplikacji? CPU RAM I/O dyski twarde połączenie sieciowe Inne aplikacje (np. baza danych)
Monitorowanie wydajności
Monitorowanie - podstawowe narzędzia top uptime mpstat iostat vmstat free
uptime - average load 1, 5, 15 minut, zlicza wątki gotowe, wykonywane + czekające na I/O
top
htop - top na sterydach
mpstat - znajdź nierównomierny rozkład
iostat - sprawdźmy dyski!
free
nicstat
vmstat
netstat
tcpdump
iptraf
iperf
iftop
Dodatkowe narzędzia monitorix munin cacti zabbix / nagios wszystko co umie rysować wykresy, bo wykresy są fajne ;)
Testowanie aplikacji Obciążenie jmeter gatling locust.io Profilowanie perf callgrind (vallgrind)
Jak zabrać się za identyfikowanie problemów z wydajnością?
Analiza wydajności obciążenie aplikacji, sprawdzenie CPU, I/O, zajętości RAM, komunikacji sieciowej, poprawa konfiguracji usług pośredniczących, analiza kodu aplikacji, profilowanie wnioski? skalowanie pionowe/poziome, przebudowa projektu :<
Co poprawić w Linuksie? modyfikacja parametrów jądra systemu operacyjnego jest kompletnie niezalecana, monitorowanie wydajności pozwala na identyfikację problemów, ale nie wyeliminowanie ich, większość problemów sprawia nasza aplikacja!
Gdzie szukać problemów? W przypadku aplikacji webowych najczęstszym (według mojego doświadczenia) problemem jest komunikacja z bazą danych. Zapytania realizowane przez aplikację (często przy pomocy ORM) są nieoptymalne, zakładają bardzo dużo zamków i utrudniają współbieżność. Jeżeli Twoja aplikacja ma problem z CPU, a nie z I/O, to masz niesamowite szczęście!
Bazy danych - co jest ważne? Bazy danych są bardzo wymagające pod względem zasobów. Pożądane zasoby to: pamięć operacyjna, IOPS
Bazy danych - co robimy z RAM? im więcej RAMu tym lepiej, dostosowanie konfiguracji SBD do dostępnych zasobów, parametry związane z buforami, cache, itd http://pgtune.leopard.in.ua/ https://github.com/tdi/postgres-config
Bazy danych - co z dyskiem? Zwiększyć liczbę dostępnych IOPSów można przez: wykorzystanie szybszych dysków (SAS, SSD) budowanie macierzy RAID pod kątem wydajności lub jeżeli to chmura - przesunąć suwak i zapłacić więcej ;)
Redukcja obciążenia Read replica - kierujemy odczyty na inny serwer HTTP cache - stawiamy Varnisha i oszukujemy naszych użytkowników memcache - dodajemy do aplikacji możliwość zapamiętywania niektórych operacji w pamięci operacyjnej serwera www optymalizacja zapytań!
Read replica
Inne problemy wydajnościowe sieć komputerowa (infrastruktura, przepustowość) tworzenie zbyt dużej liczby wątków (narzut związany z przełączeniem kontekstu) + konfiguracja workerów php/uwsgi/etc., obciążenie pamięci operacyjnej zbędnymi bibliotekami, wycieki pamięci.
Dodatkowe metody Skalowanie poziome, czyli dorzucanie kolejnych węzłów aplikacyjnych. Wymaga przemyślanej architektury aplikacji.
Load balancing Dla HTTP: nginx haproxy Ogólne: clusterip lvs
Content Delivery Network
Podsumowanie
Podsumowanie system operacyjny dostarcza nam narzędzia pozwalające na identyfikację problemów wydajnościowych, moc obliczeniowa zazwyczaj nie jest najważniejszym problemem, aplikacje powinniśmy projektować z myślą o skalowaniu poziomym, czasami warto odciążyć naszą infrastrukturę (CDN), zwiększenie dostępnych zasobów nie jest lekiem na całe zło ;) unikaj SOAP, konsola jest fajna!
Koło Naukowe Sieci Komputerowych i Systemów Rozproszonych https://dsg.cs.put.poznan.pl/wiki/ Spotkania w środy, 18:30
Dziękuję za uwagę! Pytania? ;)