Pagina 1 di 1

troppe connessioni mysql in TIME_WAIT

Inviato: lun 25 giu 2007, 12:23
da nik600
Ciao

ho un server web che raggiunge facilmente il limite massimo delle connessioni mysql contemporanee.

Ho provato ad alzare il limite massimo ma senza ottenere grossi risultati.

In pratica se do un netstat (mail è il nome della macchina):

Codice: Seleziona tutto

tcp        0      0 mail:49988              mail:mysql              TIME_WAIT   
tcp        0      0 mail:49991              mail:mysql              TIME_WAIT   
tcp        0      0 mail:49990              mail:mysql              TIME_WAIT   
tcp        0      0 mail:49985              mail:mysql              TIME_WAIT   
tcp        0      0 mail:49984              mail:mysql              TIME_WAIT   
tcp        0      0 mail:49987              mail:mysql              TIME_WAIT   
tcp        0      0 mail:49986              mail:mysql              TIME_WAIT   
tcp        0      0 mail:49997              mail:mysql              TIME_WAIT   
tcp        0      0 mail:49996              mail:mysql              TIME_WAIT   
tcp        0      0 mail:49999              mail:mysql              TIME_WAIT   
tcp        0      0 mail:49998              mail:mysql              TIME_WAIT   
tcp        0      0 mail:49993              mail:mysql              TIME_WAIT   
tcp        0      0 mail:49992              mail:mysql              TIME_WAIT   
tcp        0      0 mail:49994              mail:mysql              TIME_WAIT   
tcp        0      0 mail:50005              mail:mysql              TIME_WAIT   
tcp        0      0 mail:50004              mail:mysql              TIME_WAIT   
tcp        0      0 mail:50006              mail:mysql              TIME_WAIT   
tcp        0      0 mail:50001              mail:mysql              TIME_WAIT   
tcp        0      0 mail:50000              mail:mysql              TIME_WAIT   
tcp        0      0 mail:50003              mail:mysql              TIME_WAIT   
tcp        0      0 mail:50002              mail:mysql              TIME_WAIT   
tcp        0      0 mail:50013              mail:mysql              TIME_WAIT   
tcp        0      0 mail:50012              mail:mysql              TIME_WAIT   
tcp        0      0 mail:50015              mail:mysql              TIME_WAIT   
tcp        0      0 mail:50014              mail:mysql              TIME_WAIT   
tcp        0      0 mail:50009              mail:mysql              TIME_WAIT   
tcp        0      0 mail:50008              mail:mysql              TIME_WAIT   
tcp        0      0 mail:50011              mail:mysql              TIME_WAIT   
tcp        0      0 mail:50010              mail:mysql              TIME_WAIT   
tcp        0      0 mail:mysql              mail:49893              TIME_WAIT   

... (sono circa 400)

per il momento non posso modificare il codice php (forse usando le pconnect potrei migliorare qualcosa), come posso impostare un timeout per le connessioni in TIME_WAIT per mysql?

grazie

Inviato: lun 25 giu 2007, 15:10
da masalapianta
un timeout globale puoi impostarlo tramite mysql.connect_timeout in PHP_INI_SYSTEM, ma la cosa migliore e' usare connessioni persistenti via mysql_pconnect (per farlo ti serve anche che sia abilitato mysql.allow_persistent sempre in PHP_INI_SYSTEM); btw occhio in quest'ultimo caso alla gestione dei lock sulle tabelle e alle transazioni (se uno script termina inaspettatamente prima di aver slockato una tabella o terminato una transazione, lo script che dopo di lui usera' quella connessione si trovera' sul groppone i lock o le transazioni di cui sopra)

Inviato: mar 26 giu 2007, 1:22
da gianco
Una buona cosa sarebbe evitre l'uso di connessioni persistenti, aprendo lo script php con una connect e chiudendolo con una close. In questo modo la connessione rimane aperta solo per il tempo strettamente necessario all'esecuzione della/delle query. Un'altro consiglio per aumentare (di poco a dire il vero) le prestazioni è l'uso della funzione mysql_free_result() per ripulire la memoria (cosa che non c'entra un tubo con le connessioni ). :D

Inviato: mar 26 giu 2007, 11:11
da masalapianta
gianco ha scritto:Una buona cosa sarebbe evitre l'uso di connessioni persistenti
perche'?
, aprendo lo script php con una connect e chiudendolo con una close. In questo modo la connessione rimane aperta solo per il tempo strettamente necessario all'esecuzione della/delle query. Un'altro consiglio per aumentare (di poco a dire il vero) le prestazioni
non ho capito, quindi l'uso di connessioni persistenti diminuisce le performance?? Quello che diminuisce le performance e' dover creare ogni volta un socket e gestire la connessione tcp (soprattutto al layer 7 del protocollo, con autenticazione e compagnia cantante)

Inviato: mer 27 giu 2007, 0:48
da gianco
masalapianta ha scritto: non ho capito, quindi l'uso di connessioni persistenti diminuisce le performance?? Quello che diminuisce le performance e' dover creare ogni volta un socket e gestire la connessione tcp (soprattutto al layer 7 del protocollo, con autenticazione e compagnia cantante)
Hai ragione, ho detto una semi caxxata :( . Non mi riferivo all'uso della pconnect (ho usato impropriamente il termine "connessione persistente") ma alla buona pratica di usare esplicitamente la mysql_close() ,nel caso si usasse la mysql_connect, prima della fine dello script, anche se, in effetti, la connessione dovrebbe venire killata in uscita, cosa che però dipende dal parametro mysql.allow_persistent che, se settato a On, impedisce tale comportamento, cosa non documentata, infatti:

Dal manuale di PHP:
Note: The link to the server will be closed as soon as the execution of the script ends, unless it's closed earlier by explicitly calling mysql_close().
La successiva chiamata a mysql_connect() però, in questo caso (e solo in questo) non riusa la connessione precedente ma alloca una nuova risorsa, lasciando così una connessione aperta (la precedente) e così via...

Se il sito è molto trafficato, si possono verificare casi come quello descritto.