Too many connections / connection pool exhausted
Za dużo rzeczy naraz odpytało bazę i przestała przyjmować kolejne. Zwykle uderza w najbardziej ruchliwym momencie.
Zrób najpierw to
Jakiś skrypt odpytuje bazę o wiele za często. Tu trzeba, żeby ktoś znalazł który.
Co to znaczy
MySQL odmówił nowego połączenia, bo jest już na max_connections, albo pula oxmysql nie ma wolnego miejsca i czekanie się przedawniło. Na żywym serwerze wygląda to tak, że wszystko, co oparte o bazę, zamarza naraz, zwykle w szczycie populacji.
Co to powoduje
Uszeregowane według tego, jak często są odpowiedzią.
- 1
Zapytanie w pętli ticka
Wątek z
Wait(0)albo krótkim odstępem, który odpytuje bazę w każdej iteracji. Jedna taka pętla na gracza wystarczy, żeby wyczerpać dowolną pulę. - 2
Zapytania w handlerze dołączania gracza
playerConnectingwykonuje się przy każdym wejściu; wolne zapytanie tam trzyma połączenie przez cały handshake, a fala wejść trzyma je wszystkie. - 3
Pula jest mniejsza, niż serwer potrzebuje
Domyślne ustawienia oxmysql są skromne. Serwer na 200 slotów robiący zapis per gracz potrzebuje więcej.
- 4
Długo działające zapytania trzymające połączenia
Brakujący indeks zamienia zapytanie 2 ms w zapytanie 2 s, a połączenie jest trzymane przez całe te 2 s.
- 5
Inna aplikacja dzieli tę instancję MySQL
Panel webowy, bot Discorda, phpMyAdmin.
Jak poznać, który jest twój
SHOW PROCESSLIST;
w trakcie problemu. Powtarzające się identyczne zapytania znaczą pętlę. Duże wartości Time znaczą brakujące indeksy. Potem sprawdź, na co pozwala MySQL:
SHOW VARIABLES LIKE 'max_connections';
Gdzie szukać
Każdy CreateThread, który odpytuje bazę, i każdy handler playerConnecting.
Jak to naprawić
Buforuj zamiast odpytywać w pętli, podnieś limity i zindeksuj to, po czym filtrujesz:
# server.cfg set mysql_connection_string "mysql://user:pass@host/db?connectionLimit=20" -- MySQL SET GLOBAL max_connections = 300; CREATE INDEX idx_users_identifier ON users (identifier);
Wciąż utknąłeś na własnym kodzie?
Ta strona mówi, co ten błąd zwykle oznacza. Wklej swoją konsolę do Server Fixera, a uszereguje wszystko, co w niej jest, i powie, co zrobić najpierw; a jeśli wolisz tego nie ruszać, ORBIE naprawi skrypt i odda ci zasób gotowy do wrzucenia.
bug_reportOtwórz Server FixerDla tego rodzaju błędu Script Optimizer wyłapuje wzorce zapytań, które to powodują.