Sziasztok,
Egy viszonylag nagy latogatottsagu honlapot uzemeltettunk, amely PHPben lett irva. A terheles 6 frontendre van szetdobalva hardwares tuzfallal. Minden frontenden van egy local mysql replika. A terheles novekedesevel azonban egy furcsa problemaval talalkoztunk:
Ha egy kicsit nagyobb terheles jon az oldalra, akkor a PHP nem tud kapcsolodni a local MySQLre (max_user_connections = 2000). Elkeztem egy kicsit nyomozni, es azt tapasztaltam, hogy nagyon sok mysqles kapcsolat all TIME_WAIT-al.
# ssh w1 netstat -n|grep :3306|awk '{print $6}'|sort|uniq -c
1 ESTABLISHED
1975 TIME_WAIT
Tudnatok esetleg valamit javasolni, hogyan tudnam ezt megszuntetni?
Udv,
Joci
- 1152 megtekintés
Hozzászólások
wait_timeout=
connect_timeout=
értékékek változtatásával tudod állítani a kapcsolatok timeoutját. Alapértelmezetten ez 8 óra ha jól emlékszem. Így elég sok kapcsolat fel tud gyűlni nagy forgalomnál, és rosszul megírt kódnál.
Gyakorlott szemű kolléga könnyen be tudja hangolni azt a MySQL szervert. Érdemes lenne az adatbázis és a lekérdezések optimalizálásán is elgondolkozni nagyobb forgalom esetén. Éles rendszernél nem javaslom a kisérletezgetést, keressetek egy hozzáértőt.
Ha PHP-t használtok érdemes lehet "perzisztens" kapcsolatkezelést használni.
- A hozzászóláshoz be kell jelentkezni
Csokkentettem a wait_timeoutot a connect_timeout eleg alacsonyan volt szoval ahhoz nem nyultam.
A kodban jelenleg nem erzek hibat, ha nem zarnank a mysql_close()al a kapcsolatot, akkor is megsemmisitene a php, de zarjuk. A processlistben mindig az aktualis nehany query latszik (1-2 db a 300q/s-bol). A perzisztens kapcsolatokat is probaltuk, de volt valamilyen problema amire sajnos most nem emlekszem. Koszonom a segitseget meg probalok keresgelni, es keressuk a hozzaerto kollegat :)
- A hozzászóláshoz be kell jelentkezni
network helyett siman unix socketen keresztul kapcsolodas? joval gyorsabb helyi gepen igy hasznalni es a tcp waitekkel sem lesz problemad. ha ez nem lehetseges valami miatt akkor en a sysctl beallitasokkal jatszanek meg a helyedben es ott is levennem a timeoutokat.
- A hozzászóláshoz be kell jelentkezni
Ez a PHP problémája lehet, mert anno én is belefutottam ugyanebbe. Végeztem teszteket is. Baromi egyszerű PHP script: nem csinál semmi mást, csak megnyit majd bezár egy mysql kapcsolatot. Utána kivétel nélkül minden esetben beállt TIME_WAIT-be a connection a szerveren, akár zártam a kapcsolatot, akár nem.
Ezután ugyanezt csináltam egy pár soros C programmal, a mysql API-val, de ott zárás után nem volt TIME_WAIT.
Eddig jutottam, utána már nem tudtam foglalkozni a dologgal, de ebből gondoltam hogy a PHP-val lehet esetleg valami bibi.
- A hozzászóláshoz be kell jelentkezni
ha van local mysql, akkor miert tcpvel kapcsolodnak? hasznaljak az unix socketet.
--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!
- A hozzászóláshoz be kell jelentkezni