zriedkavy problem s naviazanim TCP spojenia

Marian Cerny jojo at matfyz.cz
Thu Feb 7 22:49:30 CET 2008


Miroslav Lachman wrote:
> > zacalo to tym, ked som si vsimol, ze sa mi v logoch z casu na cas
> > objavuje warning:
> > 
> > PHP Warning:  mysql_connect(): Can't connect to MySQL server on 'claire' (4)
> > 
> > Chyba (4) znamena EINT, ktoru mysql pouziva, ak vyprsi timeout na
> > pripojenie (u mna v PHP 30 sekund).
> > 
> > Spojenie na databazu sa vytvara v PHP skriptoch na front-end serveri
> > (mohinder, FreeBSD 6.2R, pf) a databaza je na back-end serveri (claire,
> > FreeBSD 6.3R, pf).
> > 
> > Snazil som sa tento problem analyzovat. Vytvoril som si testovaci
> > skript, ktory sa snazi opakovane pripajat na MySQL server. Zistil som,
> > ze bezne trva pripojenie 3-4 ms, ale obcas pripojenie trva niekolko
> > sekund (1-30 sekund) a niekedy sa spojenie vobec nepodari (timeout po 30
> > sekundach). Napriklad z 2626 spojeni (kazdu sekundu) trvalo 7 spojeni
> > viac ako 0.1 sekundy (3, 3, 9, 9, 9, 9, 13, 23 sekund) a jedno spojenie
> > sa nepodarilo (timeoutovalo po 31 sekundach). Vypadkom konektivity to
> > nie je - pocas trvania timeoutu je mozne vytvorit nove spojenie.
> > 
> > Tak som pustil tcpdump na backend serveri a zachytil taketo dlhotrvajuce
> > spojenie a timeoutujuce spojenie. Zistil som, ze k tomuto problemu
> > dochadza, ked sa pouzije rovnaky zdrojovy port, aky bol pouzity pred
> > chvilou. 
> 
> Dochazi k tomu i v pripade vypnuti PF?
> Zkusil byl nejaky tuning v pf.conf s volbami
> set timeout
> set limit

Diki za tip.

V pripade vypnutia PF nedochadzalo k oneskorenym TCP spojeniam ani k
timeoutom. Mam ale podozrenie, ze ten timeout nastat moze, pretoze
problem s oneskorenymi spojeniami sa mi podarilo objasnit a odstranit aj
so zapnutym PF, ale timeouty sa aj tak obcas objavia (zda sa, ze mam dva
rozne problemy).

Problem s oneskorenymi TCP spojeniami je sposobeny tym, ze PF si
udrziava stavy jednotlivych spojeni. Ked sa spojenie uzavrie, prejde
spojenia v PF do stavu "closed", v ktorom zotrva defaultne 90 sekund
(timeout tcp.closed). V pripade, ze pocas tohto timeoutu dojde SYN paket
dalsieho spojenia s rovnakym zdrojovym portom, tak je tento ignorovany.
Vo FreeBSD je ale net.inet.tcp.MSL (Maximum Segment Lifetime) nastavene
na 30 sekund a ked sa uzavrie TCP spojenie, tak by sa ten isty port
nemal pouzit po dobu 2*MSL = 60 sekund. To zrejme zaistuje stav
TIME_WAIT TCP spojenia. Ak je teda druhe spojenie vytvorene do 30
sekund, budu jeho SYN pakety po tuto dobu ignorovane.

Zatial som to vyriesil znizenim timeoutu tcp.closed na 20 sekund.

Ale aj tak obcas k tomu timeoutu dojde. K oneskorenym spojeniam uz
nedochadza, iba obcas k 3 sekundovemu (ked sa strati prvy SYN paket).
Vyskusam to este raz s vypnutym PF dlhsie a pripadne budem este dalej
analyzovat pripady, ked dojde k tomu timeoutu.

Mimochodom, preco zdrojove porty TCP spojeni pouzivaju iba rozsah
49152-65635 (viz net.inet.ip.portrange.*)? Teda iba cca 1/4 rozsahu?
Je mozne tento rozsah rozsirit napriklad na 10000-65535, alebo s tym
mozu byt spojene nejake problemy?

Marian



More information about the Users-l mailing list