E ai pessoal, todos bem? Espero que sim! Hoje gostaria de compartilhar a funcionalidade de mais uma option do mysql, sendo esta a innodb_thread_concurrency, então vou explicar um pouco sobre o que essa option faz e como que eu posso configura-la dentro do meu ambiente de MySQL. Espero que gostem e que essa informação ajude no dia a dia de quem trabalha com esse SGDB.
Introdução
- O InnoDB utiliza threads do sistema operacional para processar solicitações das transações de usuário. Essas transações podem acabar emitindo muitas solicitações ao InnoDB antes de um commit ou um rollback).
- Em situações onde é útil minimizar a troca de contexto entre threads, o InnoDB pode utilizar diversas técnicas para limitar o número de threads do sistema operacional em execução simultânea.
- Basicamente o que essa option irá fazer no mysql será controlar quantas threads estão sendo executadas em parelelo nas CPUs, ou seja, nos processos que estiverem vindo do MySQL.
- O default dessa option é 0, o que significa que ela não terá um limite e poderá executar imediatamente tudo que chegar na CPU de forma paralela.
- O problema é que dependendo da carga que estiver executando, isso pode deixar a cpu em 100%, consequentemente impactando no seu ambiente.
- Portanto, nos casos em que há alta concorrência e contenção de recursos, definir um limite específico no número de threads que podem ser executados simultaneamente pode ser benéfico.
- Podemos administrar essa variável da seguinte forma:
Para eu visualizar o valor setado para essa option no meu ambiente
mysql> show global variables like 'innodb_thread_concurrency';+---------------------------+-------+| Variable_name | Value |+---------------------------+-------+| innodb_thread_concurrency | 0 |+---------------------------+-------+1 row in set (0.04 sec)mysql>
Para configurar um valor para ela dentro do meu servidor (Nesse caso irei definir como 8)
mysql> set global innodb_thread_concurrency = 8;Query OK, 0 rows affected (0.00 sec)mysql>mysql> show global variables like 'innodb_thread_concurrency';+---------------------------+-------+| Variable_name | Value |+---------------------------+-------+| innodb_thread_concurrency | 8 |+---------------------------+-------+1 row in set (0.00 sec)mysql>
Uma dica legal para administrar a quantidade de processos que você tem em fila para definir um valor ideal para essa option é utilizando o comando ‘show engine innodb status;‘ e procurando a parte de Row Operation do output para verificar as queries em fila, o relatório irá aparecer mais ou menos igual na imagem abaixo:
----------------ROW OPERATIONS----------------0 queries inside InnoDB, 0 queries in queue0 read views open inside InnoDBProcess ID=841, Main thread ID=140503651489344, state=sleepingNumber of rows inserted 0, updated 0, deleted 0, read 00.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/sNumber of system rows inserted 8, updated 331, deleted 8, read 48740.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s----------------------------END OF INNODB MONITOR OUTPUT============================
Só lembrando que o ideal é já trocar a option pelo próprio arquivo de /etc/mysql/my.cnf também.
[mysqld]bind-address = 192.168.15.160port = 3306# Aumentando para 1Ginnodb_buffer_pool_size= 1Ginnodb_flush_method=O_DIRECTinnodb_io_capacity = 750innodb_io_capacity_max = 1000innodb_buffer_pool_size = 2147483648innodb_buffer_pool_instances = 16#innodb_thread_concurrencyinnodb_thread_concurrency = 8
Após isso, basta reinicializar o mysql sudo systemctl restart mysql
Conclusão
Ao realizar ajustes na variável innodb_thread_concurrency, você vai querer considerar as familiaridades que o seu servidor possuí para realizar a melhor configuração possível, incluindo hardware e carga de trabalho, por exemplo. Todas as alterações devem ser testadas para garantir que a mudança seja efetiva e não cause problemas para o seu ambiente.
Recursos de hardware: Ao definir o valor da innodb_thread_concurrency, é necessário considerar os recursos de hardware do servidor (como o número de núcleos da CPU e a memória disponível).
Um nível mais alto de concorrência pode necessitar de um sistema com mais núcleos de CPU e memória, enquanto um nível de concorrência mais baixo pode acabar sendo mais adequado para sistemas com menores recursos.
Monitoramento e Teste: É essencial monitorar o desempenho do seu sistema depois de ajustar o valor de innodb_thread_concurrency. Realize os testes primeiro para determinar o valor ideal para o seu caso de uso específico.
Carga de trabalho: É importante considerar o tipo de carga de trabalho que seu banco de dados está manipulando. Se sua carga de trabalho envolve muitas operações de leitura e gravação com alta contenção, definir um limite específico para a option innodb_thread_concurrency poderá ajudar a prevenir a contenção de recursos e melhorar o desempenho