Qual valor de thread_cache_size devo usar?

25

Estou usando o asp.net com o MySQL. Na cadeia de conexão .Net, configurei o Tamanho máximo do pool como 150.

Se eu executar o seguinte, obtenho esses valores:

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

O que fornece Threads_created / Connections = 0,1392.

Então, a partir disso, parece que eu preciso aumentar thread_cache_size.

Mas se eu correr SHOW PROCESSLIST, sempre vejo que tenho muitas conexões abertas (a maioria delas dormindo) por causa do pool criado pelo .Net. Ainda preciso definir o thread_cache_sizecomo ainda reutilizarei as conexões do pool de conexões? Se o tamanho da piscina for 150, você acha que um bom valor seria definir thread_cache_size150+? Isso afetaria muito a CPU e a memória?

Martin
fonte

Respostas:

43

Com base nas informações na documentação do MySQL, você deve fazer o seguinte: Descubra qual o maior número de conexões simultâneas que o mysqld teve usando 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';

Tente calcular o seguinte

Threads_created / Connections: Se esse valor for superior a 0,01, aumente thread_cache_size. No mínimo, thread_cache_sizedeve ser maior que Max_used_connections.

RolandoMySQLDBA
fonte
Obrigado pelo ótimo comentário! Atualizei minha pergunta um pouco.
1937 Martin
Eu acho que você estava pretendendo mysql> SHOW GLOBAL STATUS LIKE 'connections'; (você escreveu max_used_connections duas vezes) #
Alekc 11/11
1
Eu só quero acrescentar que, referindo-se a este dev.mysql.com/doc/refman/5.7/en/…, você deve adicionar 8 ao Max_used_connections para o valor thread_cache_size (sem exceder 100)
CME64
1
Na verdade, o manual sugere um padrão de (1% das conexões_ mac_used) + 8 .... ou 100 ... o que for menor.
Christopher McGowan
Para mim, as # 's são 264/103134 que funciona a 0,0026 que é a maneira menos de 0,01 Mas meus MaxUsedConnections é de 72, assim que a última frase é terrivelmente conflito
boatcoder
11

De acordo com os documentos do MySQL, você deve configurar thread_cache_sizepara que a maioria das novas conexões use threads do cache em vez de threads recém-criados. Isso economiza alguma sobrecarga na criação de encadeamentos, embora normalmente não crie uma melhoria significativa no desempenho:

As solicitações de encadeamentos são atendidas reutilizando encadeamentos retirados do cache, se possível, e somente quando o cache está vazio é que um novo encadeamento é criado. Essa variável pode ser aumentada para melhorar o desempenho se você tiver muitas novas conexões. Normalmente, isso não fornece uma melhoria notável no desempenho se você tiver uma boa implementação de encadeamento. No entanto, se o servidor visualizar centenas de conexões por segundo, você normalmente deverá definir o thread_cache_size alto o suficiente para que a maioria das novas conexões use threads em cache . (fonte)

Isso significa que você deve definir o seu thread_cache_sizepara que Threads_created / Connections(a% de conexões que levam à criação de novos threads) seja bastante baixa. Se você pegar os documentos do MySQL literalmente ("most"), o valor deve ser <50%. A resposta de RolandoMySQLDBA diz <1%. Não sei quem está mais perto da verdade.

Você não deve definir thread_cache_sizemais alto que Max_used_connections. A sentença final na resposta de RolandoMySQLDBA ("No mínimo, thread_cache_size deve ser maior que Max_used_connections") não parece sensata porque diz que você deve manter mais threads no cache do que o servidor usa. O MySQL nunca colocará tantos threads no cache de qualquer maneira - ele não coloca preventivamente threads no cache - apenas os coloca depois que um cliente cria um thread e se desconecta. Se você nunca tiver clientes X conectados ao mesmo tempo, nunca terá X threads no cache:

Quando um cliente é desconectado, os encadeamentos do cliente são colocados no cache se houver menos do que encadeamentos thread_cache_size. (fonte)

Veja também esta resposta de Michael:

Definir thread_cache_size com um valor maior que max_connections parece um conselho tremendamente inútil ... o cache não pode crescer maior que max_connections e mesmo um cache em qualquer lugar próximo a esse tamanho só faria sentido se você tiver uma tremenda quantidade de rotatividade em seus threads ... que, em uma aplicação bem-comportada, não será o caso.

/dba//a/28701

Tomasz P. Szynalski
fonte
acho que sim! depois de testar essa configuração, "thread_cache_size deve ser maior que Max_used_connections", não útil.
CK.Nguyen
-2

No dia útil de trabalho, um 'novo contratado' possivelmente precisaria de uma conexão? A maioria dos mágicos não sabe quantas pessoas podem ser contratadas nos próximos dias. A V 8 do MySQL sugere CAP thread_cache_size em 100 para evitar sobrecarga, independentemente de max_used_connections. Para mim, 100 é um bom CAP.

Veja este link, por favor.

https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_thread_cache_size
Wilson Hauck
fonte