In che modo l'utilizzo intensivo della CPU apre e chiude una connessione DB (per un'app Web) in MySQL
- ... quando il software DB è su localhost?
- ... quando il software DB è su un'altra macchina?
In che modo l'utilizzo intensivo della CPU apre e chiude una connessione DB (per un'app Web) in MySQL
Risposte:
Pensa alla quantità di memoria allocata per connessione DB. Quali cose devono essere allocate? Secondo la Guida allo studio sulla certificazione MySQL 5.0, pagina 357 :
Il server mantiene diversi buffer per ogni connessione client. Uno viene utilizzato come buffer di comunicazione per lo scambio di informazioni con il client. Altri buffer vengono mantenuti per client per la lettura di tabelle e l'esecuzione di operazioni di join e ordinamento.
Quali impostazioni regolano i buffer per connessione?
Ci vuole tempo per allocare e deallocare questi buffer quando viene stabilita una connessione. Non dimenticare di moltiplicare la somma di tali valori per max_connections . Come nota a margine , si prega di astenersi dall'utilizzare mysql_pconnect poiché PHP e le connessioni persistenti di MySQL non vanno d'accordo. Ecco due link informativi su questo argomento:
In un ambiente di lettura pesante e di scrittura pesante, come OLTP, ciò sarebbe costoso in termini di utilizzo della RAM e possibile inibizione dovuta allo scambio nel sistema operativo. Su un sito Web a basso contenuto di scrittura, non mi preoccuperei tanto.
Non sono sicuro che importi "quanto è più costoso". È certamente più costoso che riutilizzare la stessa connessione. Ciò che osserverai dipenderà dal corretto utilizzo del pool di connessioni, dalla saturazione del pool, dalle risorse disponibili sulla confezione, ecc.
In generale, se si sta eseguendo un ciclo per interagire con il database, sarà molto meglio riutilizzare la stessa connessione attiva rispetto all'apertura e alla chiusura all'interno del ciclo (un anti-pattern che vedo abbastanza spesso) .
Il dilemma tra riutilizzare un oggetto e demolirlo e ricostruirlo (entrambi con vantaggi e svantaggi) può spesso essere affrontato con un compromesso: mettere in cache l'oggetto, ma per un tempo limitato (cioè con scadenza). Se si accede frequentemente all'oggetto, continua a essere riutilizzato. Ma se non viene utilizzato per un po 'di tempo, un meccanismo di scadenza lo elimina, costringendolo a essere ricreato quando è necessario ancora una volta.
Un sistema può avere un hook globale per questo tipo di cache che viene invocato quando la memoria è insufficiente, il che fa scattare a tutti gli oggetti inutilizzati di recente.
Mysql memorizza nella cache connessioni (o thread) utilizzando la cache dei thread (thread_cache_size). Il valore massimo per questo è 100. Quando il client chiude la connessione, viene restituito alla cache. Quando si apre una nuova connessione, controlla la cache del thread. SU un sistema molto occupato, l'apertura della connessione di chiusura può diventare costosa, soprattutto se si hanno query di lunga durata.
https://dev.mysql.com/doc/refman/5.6/en/connection-threads.html Se puoi permetterti Mysql Enterprise, puoi utilizzare il plug-in Pool di thread implementato in Mysql 5.6.