Le performance MySQL su una networking (locale) molto più lenta di quanto mi aspetterei

Le query MySQL nel mio ambiente di produzione stanno prendendo molto più tempo di quanto mi aspettassi troppo. Il sito in questione è un sito di Drupal abbastanza grande, con molti moduli installati. Il server web (Nginx) e il server di database (mysql) sono ospitati su macchine separate, collegate da una connessione LAN 100mbps (ospitata da Rackspace).

Ho lo stesso sito in esecuzione sul mio computer porttile per lo sviluppo. Ovviamente, sul mio computer porttile, il server web e il server di database sono nella stessa casella.

  • Scalabilità di database con applicazioni heavy-write
  • Strumenti di monitoraggio MySQL
  • L'aggiornamento del sistema ha introdotto un errore di privilegi di MySQL insolito
  • Come posso visualizzare le size della coda di invio e ricezione TCP in Windows?
  • Motore CSV sul server MySQL
  • Vernice che esce da porte aperte, un sacco di connessioni SYN_SENT
  • Ecco i risultati dei miei tempi di query del database:


    Produzione:

    Esegue 291 query in 320.33 millisecondi. (Home page)

    Esegue 517 query in 999,81 millisecondi. (pagina dei contenuti)

    Sviluppo:

    Eseguito 316 query in 46,28 millisecondi. (Home page)

    Eseguito 586 domande in 79,09 millisecondi. (pagina dei contenuti)


    Come si può chiaramente vedere da questi risultati, il tempo che interagisce con la query del database MySQL è molto più breve sul mio computer porttile, where il server MySQL è in esecuzione sullo stesso database del server web.

    Perchè è questo?!

    Un fattore deve essere la latenza della networking. In media, un viaggio di andata e return da server web al server di database richiede 0.16ms (indicato da ping). Quello deve essere aggiunto a each singola query MySQL. Quindi, prendendo l'esempio di pagina dei contenuti sopra, where sono state eseguite 517 query. La sola latenza di networking aggiungerà 82ms al tempo totale di interrogazione. Tuttavia, ciò non spiega la differenza che vedo (79ms sul mio computer porttile vs 999ms sulle caselle di produzione).

    Quali altri fattori dovrei guardare? Avevo pensato di aggiornare la NIC a una connessione gigabit, ma chiaramente c'è qualcos'altro coinvolto.

    Ho eseguito lo script di tuning delle performance di MySQL da http://www.day32.com/MySQL/ e mi dice che il mio server di database è configurato bene (meglio del mio computer porttile apparentemente). L'unico problema riportto è "Di 4394 tabelle di temp, il 48% è stato creato su disco". Questo è vero in entrambi gli ambienti e nell'ambiente di produzione ho anche provato a aumentare max_heap_table_size e Current tmp_table_size a 1GB, senza modifiche (credo sia perché ho alcune colonne BLOB e TEXT).

  • 'Nessun file di input specificato' - NginX / fcgi - quando si richiede un file .php inesistente
  • Come faccio a migliorare le performance del mio sito di Drupal con molti utenti concorrenti?
  • umask viene ignorato su Gentoo durante la creazione di nuovi file
  • Configurazione di mod_auth_sspi per trovare l'utente remoto
  • server di server farm per un grande sito di Drupal
  • PHP5 è installato, ma Apache visualizza PHP come text non interpretato. Come posso farlo per elaborarlo come PHP?
  • 6 Solutions collect form web for “Le performance MySQL su una networking (locale) molto più lenta di quanto mi aspetterei”

    È perché se il DB non è sullo stesso server del frontend bisogna fare un giro per each query (potenzialmente più, a seconda della dimensione della risposta). Può richiedere fino a 1 ms per ping un altro server nello stesso datacenter. Molto less se i due server sono sullo stesso rack, ma 1 ms è una buona regola del pollice.

    Ciò significa che per ~ 300 piccole query si dovrebbe aspettare ~ 300ms, abbastanza vicino a quello che stai vedendo.

    Se i due server si trovano sulla stessa macchina, devi solo fare alcuni interruttori di context tra i processi per spostare i dati dal process DB al frontend. Di solito un interruttore di context (con tutti i flussi tipici) prende ~ 40us (molto ampiamente parlando) e hai bisogno di alless un paio di essi (il frontend richiede dati, DB legge le richieste e prepara e serve i dati, e il frontend legge indietro dati). Quindi mi aspettavo ~ 80us per each query (cerchiamo di arrotondarla a 0.1ms per facilitare la math). È quindi ansible aspettare ~ 30ms per 300 piccole query, che è anche abbastanza vicino a quello che stai vedendo.

    È davvero difficile darti una risposta definitiva. Non credo veramente che la networking è il collo di bottiglia, beh, a less che tu non abbia un traffico veramente pesante sul server.

    Avete la stessa configuration esatta sulla macchina di sviluppo e sul server di produzione?

    Sei sicuro che tutti gli indici siano stati creati correttamente sul server di produzione?

    Potrebbe essere la quantità di dati nel tuo server di produzione. Voglio confrontare i risultati tra le macchine di produzione e di sviluppo, dovresti avere lo stesso numero di righe nelle tabelle, è questo il caso?

    Hai utilizzato gli stessi file di installazione per configurare MySQL sulla macchina di sviluppo e sul server di produzione? Voglio dire che hai la stessa versione di MySQL sia su macchine per lo sviluppo che per la produzione? È per lo stesso sistema operativo? Anche 32bit o 64bit? Probabilmente un bug nella versione di MySQL installato sul server.

    Le possibilità sono infinite, senza più dettagli sarà molto difficile darti una risposta informativa.

    L'unico problema riportto è "Di 4394 tabelle di temp, il 48% è stato creato su disco". Questo è vero in entrambi gli ambienti e nell'ambiente di produzione ho anche provato a aumentare max_heap_table_size e Current tmp_table_size a 1GB, senza modifiche (credo sia perché ho alcune colonne BLOB e TEXT).

    È ansible inserire MySQLs tmpdir su un fileys basato su RAM (ad es. Tmpfs) per migliorare le performance.

    Saluti

    PS

    Forse il colpo di performance è RAID scrive in Production.

    Hai abilitato la cache di query? Guarda l'output di:

    SHOW VARIABLES LIKE 'query_cache_size'; 

    Se è maggiore di zero, è acceso. Questo renderà piuttosto una differenza per la performance di un sito web supportto da MySQL, anche se non so se ha qualcosa a che fare con il tuo problema specifico qui.

    Non credo che ci sia modo di catturare l'insieme delle query e di eseguirle da un login sul server di database MySQL, per vedere se le cose sono diverse?

    Un altro problema ansible è che se non si sta eseguendo la cache della session, si apre una nuova session each volta che si effettua una chiamata di database. Sai se sei la cache della session? L'apertura di una nuova session per each chiamata può diventare costosa in tutta la networking.

    Cosa farei per identificare where si trova il collo di bottiglia: faccio un profilo della query: http://dev.mysql.com/doc/refman/5.0/en/show-profiles.html

    Se i numbers sono molto inferiori a quello che puoi vedere dalla stessa query eseguita sul tuo server web, allora è un problema di "trasporto". (Latenza di networking Rackspace, switch config, grandi set di dati (SELECT *) con i campi TEXT / BLOB restituiti ecc.)

    Se i numbers sono quasi simili, è necessario ottimizzare le query e migliorare il file di configuration. Ecco un link che può aiutare: https://stackoverflow.com/questions/1191067/how-to-test-mysql-query-speed-with-less-inconsistencies/1191506#1191506

    BTW, quando il mio server è passato da 100Mbs a 1Gb, l'aumento delle performance è stato incredibile!

    La configuration e la rottura della connessione TCP è molto più costosa della connessione di socket quando si lavora su localhost. Controllare quante connessioni al database vengono avviate in un carico di pagina.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.