Poprawiam swoją stronę główną pod kątem wydajności, obecnie obsługuje ona około 200 żądań na sekundę w 3.14.by, która zjada 6 zapytań SQL, i 20 req / sekundę w 3.14.by/forum, które jest forum phpBB.
O dziwo, liczby są prawie takie same na niektórych serwerach VPS i dedykowanym serwerze Atom 330.
Oprogramowanie serwera to: Apache2 + mod_php prefork 4 childs (tutaj wypróbowano różne numery), php5, APC, nginx, memcached do przechowywania sesji PHP.
MySQL jest skonfigurowany do zużywania około 30% dostępnej pamięci RAM (~ 150 Mb na VPS, 700 Mb na dedykowanym serwerze)
Wygląda na to, że gdzieś jest wąskie gardło, które nie pozwala mi iść wyżej, jakieś sugestie? (tj. wiem, że wykonanie mniej niż 6 SQLów przyspieszyłoby to, ale nie wygląda to na czynnik ograniczający, ponieważ sqld zjada nie więcej niż kilka% w górę z powodu zapytań buforowanych)
Czy ktoś przetestował, że kopanie gotowego apache2 i pozostawienie samego nginx + php jest znacznie szybsze?
Więcej testów porównawczych
Small 40-byte static file: 1484 r/s via nginx+apache2, 2452 if we talk to apache2 directly.
Small "Hello world" php script: 458 r/s via ngin+apache2.
Aktualizacja: Wydaje się, że wąskim gardłem jest wydajność MySQL na buforowanych danych. Strona z pojedynczym kodem SQL pokazuje 354 req / s, z 6 kodami SQL - 180 req / s. Jak myślisz, co mogę tu ulepszyć? (Mogę rozwidlić 100-200 Mb dla MySQL)
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
default-character-set=cp1251
collation-server=cp1251_general_cs
skip-character-set-client-handshake
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
skip-external-locking
bind-address = 127.0.0.1
key_buffer = 16M
max_allowed_packet = 8M
thread_stack = 64K
thread_cache_size = 16
sort_buffer_size = 8M
read_buffer_size = 1M
myisam-recover = BACKUP
max_connections = 650
table_cache = 256
thread_concurrency = 10
query_cache_limit = 1M
query_cache_size = 16M
expire_logs_days = 10
max_binlog_size = 100M
[mysqldump]
quick
quote-names
max_allowed_packet = 8M
[mysql]
[isamchk]
key_buffer = 8M
!includedir /etc/mysql/conf.d/
źródło
Odpowiedzi:
Oczywiście możesz wiele spróbować. Najlepszym rozwiązaniem jest gonienie dzienników w poszukiwaniu zapytań, które nie korzystają z indeksów (włącz dzienniki dla nich) i innych niezoptymalizowanych zapytań. Przez lata opracowałem ogromną listę opcji związanych z wydajnością, więc zamieściłem tutaj mały podzbiór dla twojej informacji - mam nadzieję, że to pomaga. Oto kilka ogólnych uwag na temat rzeczy, które możesz wypróbować (jeśli jeszcze tego nie zrobiłeś):
MySQL
Apacz
PHP
Poprawki systemu operacyjnego
źródło
Jeśli wąskim gardłem nie jest procesor, to jego we / wy - sieć lub dysk. Więc ... musisz zobaczyć, jak dużo się dzieje. Nie pomyślałbym, że to sieć (chyba, że używasz łącza półdupleksowego 10 Mb / s, ale warto sprawdzić przełącznik na wypadek, gdyby automatyczne wykrywanie nie działało prawidłowo).
To pozostawia dyskowe operacje we / wy, co może być dużym czynnikiem, szczególnie w przypadku VPS. Użyj sar lub iostat, aby spojrzeć na dyski, a następnie google, jak znaleźć więcej szczegółów, jeśli dysk jest intensywnie używany.
źródło
Zajrzałbym do buforowania za pomocą Nginx ( memcached ) lub Varnish .
Przynajmniej powinieneś serwerować pliki statyczne z Nginx, jak powiedział SaveTheRbtz.
źródło
Ponieważ serwer nie wydaje się stanowić problemu, być może generator obciążenia jest. Spróbuj uruchomić go na kilku komputerach.
źródło
Wydaje mi się, że osiągasz maksymalną liczbę połączeń, które pozwala Apache. Spójrz na konfigurację Apache. Zwiększenie limitu serwera i maksymalnej liczby klientów powinno pomóc, jeśli nie jesteś już związany jakimś innym limitem, takim jak We / Wy lub pamięć. Spójrz na obecne wartości dla modułu mpm_prefork_module lub mpm_worker_module i dostosuj odpowiednio do swoich potrzeb.
źródło
Czy to obciążenie jest generowane przez narzędzie lub obciążenia w świecie rzeczywistym?
Możesz sprawdzić memcached. Widziałem problemy z wysoką prędkością połączenia powodujące opóźnienia w aplikacji.
Jeśli korzystasz z generatora obciążenia, co otrzymujesz po wejściu na małą stronę statyczną?
Podczas ładowania możesz sprawdzić stos sieciowy pod kątem warunków TIME_WAIT. Być może zapełniasz kolejkę połączeń.
Istnieje około 100 innych powodów i przedmiotów, na które możesz spojrzeć, ale bez dodatkowych informacji, w tej chwili rzucam domysły.
źródło
99% procent problemów związanych z czasem pojawi się w bazie danych. Najpierw upewnij się, że Twoje indeksy uderzeń. Jeśli to nie zadziała, zacznij buforować wszystko, co możesz.
źródło
Zalecam użycie (jeśli to możliwe) puli połączeń, aby baza danych była połączona z aplikacjami internetowymi (nie trzeba ponownie łączyć się przy każdym żądaniu). To może zrobić ogromną różnicę prędkości.
Spróbuj także przeanalizować wszystkie zapytania za pomocą EXPLAIN (a dlaczego nie profilować swoich zapytań za pomocą SHOW PROFILE?).
źródło