Cache de Threads – thread_cache_size
Um dos pontos mais críticos para o workload do MySQL é a criação contínua de threads e sabendo-se que a cada conexão que uma aplicação ou um cliente qualquer realiza com o MySQL, uma nova *thread* é criada – imaginem um servidor com essa quantidade de requisições:
mysql> \s -------------- mysql Ver 14.14 Distrib 5.5.17, for Linux (x86_64) Connection id: 100407 Current database: Current user: root@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.5.17-log MySQL Community Server (GPL) Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: latin1 Db characterset: latin1 Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /var/lib/mysql/mysql.sock Uptime: 8 days 17 hours 49 min 6 sec Threads: 696 Questions: 292951068 Slow queries: 225 Opens: 498354 Flush tables: 1 Open tables: 256 Queries per second avg: 387.836 --------------
A saída do comando \s ou status acima nos mostra que temos 696 threads atualmente conectadas (ativas ou em sleep). O mais interessante é saber que através da variável thread_cache_size nós podemos solicitar que tais threads já criadas sejam limpas após uma desconexão e após isso, serem armazenadas em cache para reutilização. Assim, o MySQL não precisam mais criar novas threads a todo momento que uma nova conexão é requisitada. No exemplo abaixo, no mesmo servidor, aonde o número de conexões simultâneas batem em quase 1000, deixei o valor padrão de thread_cache_size configurado como 8, sendo um valor bem baixo para a demanda atual.
mysql> show variables like 'thread_cache%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | thread_cache_size | 8 | +-------------------+-------+ 1 row in set (0.00 sec)
Mais uma vez, através das variáveis de status, podemos checar que o MySQL reutiliza o objeto thread para novas conexões:
mysql> show status like 'Thread%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_cached | 7 | | Threads_connected | 799 | | Threads_created | 90435 | | Threads_running | 1 | +-------------------+-------+ 4 rows in set (0.00 sec) mysql> show status like 'Thread%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_cached | 6 | | Threads_connected | 799 | | Threads_created | 90435 | | Threads_running | 2 | +-------------------+-------+ 4 rows in set (0.00 sec)
Nos dois resultados acima, podemos ver que:
- o número de threads em cache são 7, apontados por Threads_cached,
- o número de threads conectadas é 799, o que mostra Threads_connected,
- o número de threads já criadas desde a última reinicialização é de 90435,
- o número de threads que atualmente tem o status diferente de Sleep, Threads_running.
[mysqld] thread_cache_size = 1000
mysql> show status like 'Threads%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_cached | 273 | | Threads_connected | 727 | | Threads_created | 4659 | | Threads_running | 101 | +-------------------+-------+ 4 rows in set (0.00 sec)
You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
Leave a Reply