Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1

    [MySql] Processi Sleep che rallentano

    Salve ragazzi,
    possiedo un sito molto visitato (circa 50.000 user al giorno) e con un DB MySql con circa 60.000 news e relativi 300.000 commenti hostato su un server condiviso (non dedicato).
    Purtroppo ogni tanto, in alcuni momenti sparsi per la giornata, il sito rallenta e ciò è dovuto ai numerosi processi in Sleep.
    Premetto che ho le tabelle indicizzate (nessun filesort) e le query spacchettate e ottimizzate.
    Mi è stato detto numerose volte, anche dal servizio di hosting, che il problema dovrebbe essere che non chiudo le connessioni ma io nel config.php ho il classico mysql_connect() e nel footer.php il classico mysql_close(). Addirittura al termine dei cicli in cui richiamo news/commenti metto mysql_free_result().
    Ho provato solamente oggi a mettere il mysql_pconnect() per vedere se a questo punto con le connessioni persistenti qualcosa possa migliorare.
    E' difficile capire cosa succeda perché questo avviene solo ogni tanto, oggi ad esempio è durato un'oretta dalle 14 alle 15, ho passato il tempo a killare i processi in coda mentre il servizio che mi "hosta" ogni tanto in automatico riavviava l'Sql non rendendo raggiungibile il mio sito per qualche secondo.

    Ho anche un widget del mio sito che è incorporato da due forum visitatissimi e sicuramente anche quelli appesantiscono le richieste al DB ma anche il widget fa riferimento allo stesso config.php e alla fine chiude con mysql_close().

    Non so più dove mettere le mani

  2. #2
    Controlla se sono connessioni locali...

    Poi imposta un timeout globale con il tempo massimo accettabile:
    SET @@GLOBAL.wait_timeout=5;
    e solo per le connessioni che devono eseguire query lunghe, imposta un timeout locale più alto:
    SET @@SESSION.wait_timeout=30;
    STK/Unit: Unit Test framework per MariaDB
    http://stk.wikidot.com/stk-unit

  3. #3
    Originariamente inviato da in the web
    Controlla se sono connessioni locali...

    Poi imposta un timeout globale con il tempo massimo accettabile:
    SET @@GLOBAL.wait_timeout=5;
    e solo per le connessioni che devono eseguire query lunghe, imposta un timeout locale più alto:
    SET @@SESSION.wait_timeout=30;
    Ciao, come posso controllare se le connessioni sono locali?
    E' successo anche stamattina, nei processi mi scrive:
    Rimuovi 2642301 Sql****** 62.***.141.136:44918 Sql******_1 Sleep

    Ho "asteriscato io."

    Quei SET credo di non poterli mettere:
    Access denied; you need (at least one of) the SUPER privilege(s) for this operation

    Sto su una macchina condivisa...

  4. #4
    Ops che stupido, dimenticavo che sei in hosting. Ma puoi comunque settarli a livello di sessione, ovviamente devi essere sicuro di farlo per tutte le connessioni che apri:

    SET @@SESSION.wait_timeout=5;
    (suppongo che, per la maggior parte delle tue connessioni, 5 secondi siano più che sufficienti... ripeto, se esegui anche delle query più lunghe, basta che aumenti il timeout)

    Per sapere se le connessioni sono locali, fai un show processlist. Ti copio il mio (in locale):

    MariaDB [test]> SHOW PROCESSLIST;
    +----+------+----------------+------+---------+------+-------+------------------
    +----------+
    | Id | User | Host | db | Command | Time | State | Info
    | Progress |
    +----+------+----------------+------+---------+------+-------+------------------
    +----------+
    | 2 | root | localhost:2001 | test | Query | 0 | NULL | SHOW PROCESSLIST
    | 0.000 |
    +----+------+----------------+------+---------+------+-------+------------------
    +----------+
    1 row in set (0.01 sec)

    Come vedi l'host è localhost, perciò so che viene dal mio computer (è la finestra che sto usando, chiaramente). Se fosse stato pincopallino:2001 mi preoccuperei perché non sono io
    STK/Unit: Unit Test framework per MariaDB
    http://stk.wikidot.com/stk-unit

  5. #5
    SET @@SESSION.wait_timeout=5;
    Le sessioni NON sono in locale.
    Io il mio config lo apro così:
    Codice PHP:
    //COLLEGAMENTO AL DB
    $db mysql_pconnect($db_host$db_user$db_password) or die ("Connessione al DB non riuscita: ".mysql_error());
    mysql_select_db($db_name$db) or die ("Il DB ".$db_name." non esiste."); 
    Come posso implementare il tuo SET @@SESSION.wait_timeout=5?
    L'ho provato da PhpMyAdmin e funziona, ma non capisco a livello PHP come posso implementarlo... Scusa l'ignoranza.

    Oppure devo metterlo prima di ogni query???

  6. #6
    Non usare le connessioni permanenti (tanto se ho capito bene il tuo problema rimane sia con sia senza le connessioni permanenti, giusto?)

    Eseguilo una sola volta dopo che ti connetti:

    //COLLEGAMENTO AL DB
    $db = mysql_pconnect($db_host, $db_user, $db_password) or die ("Connessione al DB non riuscita: ".mysql_error());
    mysql_query('SET @@GLOBAL.wait_timeout=5;');
    mysql_select_db($db_name, $db) or die ("Il DB ".$db_name." non esiste.");

    (anche se è molto meglio usare il modulo mysqli non mysql)
    STK/Unit: Unit Test framework per MariaDB
    http://stk.wikidot.com/stk-unit

  7. #7
    Originariamente inviato da in the web
    Non usare le connessioni permanenti (tanto se ho capito bene il tuo problema rimane sia con sia senza le connessioni permanenti, giusto?)

    Eseguilo una sola volta dopo che ti connetti:

    //COLLEGAMENTO AL DB
    $db = mysql_pconnect($db_host, $db_user, $db_password) or die ("Connessione al DB non riuscita: ".mysql_error());
    mysql_query('SET @@GLOBAL.wait_timeout=5;');
    mysql_select_db($db_name, $db) or die ("Il DB ".$db_name." non esiste.");

    (anche se è molto meglio usare il modulo mysqli non mysql)
    Sei gentilissimo, ho provato questa soluzione. Vediamo....

    Azz però da phpmyadmin mi restituisce:
    Access denied; you need (at least one of) the SUPER privilege(s) for this operation

    Mentre da PHP non dice niente, ma immagino sia "access denied" pure li

  8. #8
    Scusa ho fatto ben due errori!!! Ho messo global invece di session e ho usato pconnect invece di connect. Mea culpa.

    //COLLEGAMENTO AL DB
    $db = mysql_connect($db_host, $db_user, $db_password);
    mysql_query('SET @@SESSION.wait_timeout=5;');
    echo "\n\n\n" . '' . "\n\n\n";

    L'ultima riga l'ho messa solo per test, dovrebbe scrivere nell'HTML della pagina:



    (ovviamente devi aprire il sorgente della pagina per vederla)
    STK/Unit: Unit Test framework per MariaDB
    http://stk.wikidot.com/stk-unit

  9. #9
    Originariamente inviato da in the web
    Scusa ho fatto ben due errori!!! Ho messo global invece di session e ho usato pconnect invece di connect. Mea culpa.

    //COLLEGAMENTO AL DB
    $db = mysql_connect($db_host, $db_user, $db_password);
    mysql_query('SET @@SESSION.wait_timeout=5;');
    echo "\n\n\n" . '' . "\n\n\n";

    L'ultima riga l'ho messa solo per test, dovrebbe scrivere nell'HTML della pagina:



    (ovviamente devi aprire il sorgente della pagina per vederla)
    Perfetto, questo me lo permette e mi restituisce:

  10. #10
    Perfetto. Ora le tue connessioni possono restare inattive al massimo per 5 secondi, poi si chiudono.
    STK/Unit: Unit Test framework per MariaDB
    http://stk.wikidot.com/stk-unit

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.