THE ORB
Uruchamiam studio

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.

groupsWszystko zamiera w szczyciecodePotrzebny programista

Zrób najpierw to

Jakiś skrypt odpytuje bazę o wiele za często. Tu trzeba, żeby ktoś znalazł który.

bug_reportWklej zamiast tego całą konsolę

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. 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. 2

    Zapytania w handlerze dołączania gracza

    playerConnecting wykonuje się przy każdym wejściu; wolne zapytanie tam trzyma połączenie przez cały handshake, a fala wejść trzyma je wszystkie.

  3. 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. 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. 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 Fixer

Dla tego rodzaju błędu Script Optimizer wyłapuje wzorce zapytań, które to powodują.

Błędy, które chodzą z tym w parze