troppe connessioni mysql in TIME_WAIT

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
nik600
Linux 2.x
Linux 2.x
Messaggi: 450
Iscritto il: lun 15 mar 2004, 0:00
Contatta:

troppe connessioni mysql in TIME_WAIT

Messaggio 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

Avatar utente
masalapianta
Iper Master
Iper Master
Messaggi: 2775
Iscritto il: lun 25 lug 2005, 0:00
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian
Località: Roma
Contatta:

Messaggio 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)

Avatar utente
gianco
Linux 1.x
Linux 1.x
Messaggi: 172
Iscritto il: mar 31 ott 2006, 8:01
Nome Cognome: Giancarlo
Slackware: current
Kernel: 2.6.33.4-smp
Desktop: kde 4.4.5
Località: Pavia

Messaggio 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

Avatar utente
masalapianta
Iper Master
Iper Master
Messaggi: 2775
Iscritto il: lun 25 lug 2005, 0:00
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian
Località: Roma
Contatta:

Messaggio 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)

Avatar utente
gianco
Linux 1.x
Linux 1.x
Messaggi: 172
Iscritto il: mar 31 ott 2006, 8:01
Nome Cognome: Giancarlo
Slackware: current
Kernel: 2.6.33.4-smp
Desktop: kde 4.4.5
Località: Pavia

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

Rispondi