2015-03-03 28 views
13

Zrobiłem sporo czytania przed pytaniem o to, więc pozwól mi wstępnie powiedzieć, że nie kończą mi się połączenia, pamięć lub procesor, i co mogę powiedzieć, nie kończą mi się też deskryptory plików.Usterki połączenia PHP/MYSQL pod dużym obciążeniem przez mysql.sock

Oto co PHP rzuca się na mnie, kiedy MySQL jest pod dużym obciążeniem:

nie można połączyć się z lokalnego serwera MySQL poprzez gniazdo „/var/lib/mysql/mysql.sock” (11 „Zasoby chwilowo niedostępne ")

Dzieje się to przypadkowo pod obciążeniem - ale im częściej naciskam, tym częściej php wyrzuca mi to. Podczas gdy tak się dzieje, zawsze mogę połączyć się lokalnie za pomocą konsoli i od PHP do 127.0.0.1 zamiast "localhost", który używa szybszego gniazda unix.

Oto kilka zmiennych systemowych aby wyeliminować typowe problemy:

cat /proc/sys/fs/file-max = 4895952 
lsof | wc -l = 215778 (during "outages") 

Najwyższa wykorzystanie dostępnych połączeń: 26% (261/1000)

InnoDB rozmiar puli bufora/data: 10,0 g/3,7 g (o wiele pokój)

  • miękkie nofile 999999
  • trudno nofile 999999

Jestem rzeczywiście działa MariaDB (wersja Server: 10.0.17-MariaDB MariaDB Server)

Wyniki te są generowane zarówno przy normalnym obciążeniu, i uruchamiając mysqlslap poza godzinami pracy, tak, powolne zapytania nie są problem - tylko wysokie połączenia.

Każda rada? Mogę zgłosić dodatkowe ustawienia/dane w razie potrzeby - mysqltuner.pl mówi, że wszystko jest w porządku -

i znowu, odkrywcza rzecz polega na tym, że łączenie się przez IP działa dobrze i jest szybkie podczas tych przerw - po prostu nie mogę dowiedzieć się, dlaczego.

Edycja: tutaj jest mój my.ini (niektóre wartości mogą wydawać się nieco wysoki z moich ostatnich zmian dotyczących rozwiązywania problemów, a należy pamiętać, że nie ma żadnych błędów w dziennikach MySQL, logi systemowe, lub dmesg)

socket=/var/lib/mysql/mysql.sock 
skip-external-locking 
skip-name-resolve 
table_open_cache=8092 
thread_cache_size=16 
back_log=3000 
max_connect_errors=10000 
interactive_timeout=3600 
wait_timeout=600                        
max_connections=1000 
max_allowed_packet=16M 
tmp_table_size=64M 
max_heap_table_size=64M 
sort_buffer_size=1M 
read_buffer_size=1M 
read_rnd_buffer_size=8M 
join_buffer_size=1M 
innodb_log_file_size=256M 
innodb_log_buffer_size=8M 
innodb_buffer_pool_size=10G 

[mysql.server] 
user=mysql 

[mysqld_safe] 
log-error=/var/log/mysqld.log 
pid-file=/var/run/mysqld/mysqld.pid 
open-files-limit=65535 
+0

Jaki jest Twój dysk I/O jak? jeśli twoje wąskie gardło nie zostanie uderzone w pamięć, procesor lub połączenia, najprawdopodobniej jest związane z dyskowymi operacjami We/Wy pod obciążeniem, które nie nadążają za .sock. Czy próbowałeś nie używać gniazda? – user3036342

+0

W moim najgorszym najgorszym było jeszcze 0% iowait (i strony html serwują ładnie i szybko, konsola jest szybka, itd., Więc nie jest to problem z dyskiem IO) - mogę spróbować nie używać lokalnego gniazda - ale to tylko powoduje problemy sieciowe przez wprowadzenie większej ilości ładuje stos TCP już zajętego serwera. Wolałbym pozostać przy szybszej i zalecanej metodzie lokalnych gniazd. –

+0

Jest to możliwe błąd. Spróbuj zmienić wersję –

Odpowiedz

7

Najprawdopodobniej jest to spowodowane net.core.somaxconn Jaka jest wartość /proc/sys/net/core/somaxconn

net.core.somaxconn 

# The maximum number of "backlogged sockets". Default is 128. 

połączeń w kolejce, które nie są jeszcze podłączone. Każda rzecz nad tą kolejką zostanie odrzucona. Podejrzewam to w twojej sprawie. Spróbuj zwiększyć to w zależności od obciążenia.

metę jako użytkownik root

echo 1024 > /proc/sys/net/core/somaxconn 
+0

Ustawiono na 4096, zmieniłem go wczoraj, kiedy znalazłem go jako rozwiązanie problemu php-fpm/nginx z lokalnymi gniazdami. Teraz, gdy ruch jest niski, miałem okazję spróbować go ponownie i odkryłem, że błędy zniknęły! Mam zamiar nagrodzić cię nagrodą, ponieważ uważam, że masz rację! To najprawdopodobniej sprawca, dzięki! –

+1

Była to ostateczna lista Zmienione ustawienia dotyczące net.core: net.core.somaxconn = 4096 net.core.netdev_max_backlog = 4096 net.core.rmem_max = 16777216 = 16777216 net.core.wmem_max –

+0

dobrze wiedzieć że twój problem został naprawiony. Dziękuję Ci –

0

Jest to coś, co może i powinno zostać rozwiązane przez analizę. Nauka, jak to zrobić, jest wielką umiejętnością.

Analiza, aby dowiedzieć się, co dzieje się pod dużym obciążeniem ... liczba zapytań, czas wykonania powinien być pierwszym krokiem. Określ obciążenie, a następnie wprowadź odpowiednie ustawienia db config. Może się okazać, że musisz zoptymalizować zapytania sql!

Następnie upewnij się, że ustawienia sterownika db db są wyrównane, aby w pełni wykorzystać połączenia z bazą danych.

Oto link do dokumentacji wątków MariaDB. Wiem, że mówi wersja 5.5, ale nadal jest trafna, a strona zawiera wersję 10. Istnieje lista ustawień, które mogą nie znajdować się w pliku .cnf, z którego można korzystać.

https://mariadb.com/kb/en/mariadb/threadpool-in-55/

+0

Doceniam twoją szczerość, ale robię to od dłuższego czasu, przestrzegam najlepszych praktyk, czytam wiele książek na ten temat i nigdy wcześniej nie spotkałem się z tym problemem. Zamieszczam tutaj, ponieważ niezależnie od zapytania (o czym świadczy użycie tylko mysqlslap) do umieszczenia umiarkowanego (<25% obciążenia procesora) na komputerze, otrzymuję te błędy z PHP-FPM, cały czas baza danych szybko reaguje przez TCP lub wiersz poleceń.optymalizacja bazy danych nie ma wpływu na to zjawisko. Nie zamieszczam tu często pytań, tylko naprawdę trudne. –

+0

Nie chcę być niegrzeczny, ale nie szukam "przeczytania instrukcji" jako rozwiązania. Nie brakuje mi procesora, pamięci RAM lub deskryptorów plików, baza danych nie robi się wolna, reaguje cudownie. Nie ma błędów w dzienniku dmesg lub mysql. Jest to prawdopodobnie kwestia systemu operacyjnego lub php, nie jestem pewien, który z nich, jestem tutaj, aby uzyskać pomoc, ponieważ po intensywnych badaniach jestem zaskoczony - przeczytałem podręczniki. –

+0

Ta metodologia służy do rozwiązywania takich problemów. Chciałem tylko sprawdzić ustawienia, a nie RTFM. Dostosuj się. –

0

Z mojej głowie, mogę myśleć o max_connections jako możliwego źródła problemu. Zwiększałbym limit, aby przynajmniej wyeliminować tę możliwość.

Mam nadzieję, że to pomaga.

+0

Dzięki za odpowiedź. Wspomniałem wyżej, że śledzę to - Najwyższe wykorzystanie dostępnych połączeń: 26% (261/1000) –