Quale valore di thread_cache_size dovrei usare?


25

Sto usando Asp.Net insieme a MySQL. Nella stringa di connessione .Net, ho impostato Dimensione massima pool su 150.

Se eseguo quanto segue ottengo questi valori:

SHOW GLOBAL STATUS LIKE 'max_used_connections'; gives 66
SHOW GLOBAL STATUS LIKE 'Threads_created'; gives 66
SHOW GLOBAL STATUS LIKE 'connections'; gives 474

Che dà Threads_created / Connections = 0,1392.

Quindi da ciò sembra che debba aumentare thread_cache_size.

Ma se corro SHOW PROCESSLISTvedo sempre che ho molte connessioni aperte (la maggior parte delle quali in sospensione) a causa del pool creato da .Net. Devo ancora impostare il thread_cache_sizecome riutilizzerò ancora le connessioni dal pool di connessioni? Se la dimensione della piscina è 150 pensi che un buon valore sarebbe settare thread_cache_sizea 150+? Ciò influirebbe molto sulla CPU e sulla memoria?

Risposte:


43

Sulla base delle informazioni contenute nella documentazione di MySQL, dovresti effettuare le seguenti operazioni: Scopri qual è il numero più elevato di connessioni simultanee che mysqld ha avuto utilizzando Connections , Threads_created e Max_used_connections ,

  • SHOW GLOBAL STATUS LIKE 'Connections';
  • SHOW GLOBAL STATUS LIKE 'Threads_created';
  • SHOW GLOBAL STATUS LIKE 'Max_used_connections';

Prova a calcolare quanto segue

Threads_created / Connections: Se supera 0,01, aumenta thread_cache_size. Per lo meno, thread_cache_sizedovrebbe essere maggiore di Max_used_connections.


Grazie per l'ottimo commento! Ho aggiornato un po 'la mia domanda.
Martin,

Penso che tu intendessi mysql> MOSTRA LO STATO GLOBALE COME "connessioni"; (hai scritto max_used_connections due volte)
Alekc l'

1
Voglio solo aggiungere che facendo riferimento a questo dev.mysql.com/doc/refman/5.7/en/… dovresti aggiungere 8 a Max_used_connections per il valore thread_cache_size (senza superare 100)
CME64

1
In realtà, il manuale suggerisce un valore predefinito di (1% di mac_used_connections) + 8 .... o 100 ... a seconda di quale dei due è inferiore.
Christopher McGowan,

Per me i # sono 264/103134, che funziona a 0,0026, che è molto meno di 0,01 Ma il mio MaxUsedConnections è 72, quindi l'ultima frase è terribilmente in conflitto
Boatcoder

11

Secondo i documenti MySQL, è necessario impostare in thread_cache_sizemodo tale che la maggior parte delle nuove connessioni utilizzi i thread della cache anziché i thread appena creati. Ciò consente di risparmiare un certo sovraccarico di creazione di thread, sebbene normalmente non crei un miglioramento significativo delle prestazioni:

Le richieste di thread vengono soddisfatte riutilizzando i thread presi dalla cache, se possibile, e solo quando la cache è vuota viene creato un nuovo thread. Questa variabile può essere aumentata per migliorare le prestazioni se si dispone di molte nuove connessioni. Normalmente, ciò non fornisce un notevole miglioramento delle prestazioni se si dispone di una buona implementazione del thread. Tuttavia, se il tuo server rileva centinaia di connessioni al secondo, dovresti normalmente impostare thread_cache_size abbastanza in alto in modo che la maggior parte delle nuove connessioni utilizzino i thread memorizzati nella cache . (fonte)

Ciò significherebbe che dovresti impostare il tuo in thread_cache_sizemodo che Threads_created / Connections(la% di connessioni che portano alla creazione di nuovi thread) sia piuttosto bassa. Se prendi letteralmente i documenti MySQL ("la maggior parte"), il valore dovrebbe essere <50%. La risposta di RolandoMySQLDBA dice <1%. Non so chi sia più vicino alla verità.

Si dovrebbe non impostare thread_cache_sizesuperiore Max_used_connections. L'ultima frase nella risposta di RolandoMySQLDBA ("Per lo meno, thread_cache_size dovrebbe essere maggiore di Max_used_connections") non sembra sensata perché dice che dovresti tenere più thread nella cache di quanti il ​​tuo server abbia mai usato. MySQL non inserirà mai così tanti thread nella cache - non inserisce preventivamente i thread nella cache - li inserisce solo dopo che un client ha creato un thread e si disconnette. Se non hai mai X client connessi contemporaneamente, non avrai mai X thread nella cache:

Quando un client si disconnette, i thread del client vengono inseriti nella cache se vi sono meno thread thread_cache_size. (fonte)

Vedi anche questa risposta di Michael:

L'impostazione di thread_cache_size su un valore maggiore di max_connections sembra un consiglio tremendamente inutile ... la cache non può eventualmente aumentare di dimensioni superiori a max_connections e persino una cache in qualsiasi punto vicino a quella dimensione potrebbe avere senso solo se hai una tremenda quantità di churn sui tuoi thread ... che, in un'applicazione ben educata, non sarà il caso.

/dba//a/28701


credo di si! dopo aver testato questa configurazione, "thread_cache_size dovrebbe essere maggiore di Max_used_connections" non utile.
CK.Nguyen,

-2

Nel comune giorno lavorativo, un "nuovo assunto" avrebbe forse bisogno di una connessione? La maggior parte dei maghi non saprà quante persone potrebbero essere assunte nei prossimi giorni. V 8 di MySQL suggerisce CAP thread_cache_size a 100 per prevenire il sovraccarico indipendentemente da max_used_connections. Per me, 100 è una buona PAC.

Vedi questo link, per favore.

https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_thread_cache_size
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.