Durante um recente problema/desaceleração com um de nossos bancos de dados escravos, notei isso quando executei o arquivo SHOW ENGINE INNODB STATUS
. Estou recebendo o seguinte:
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 822986039, signal count 17045541908
--Thread 140562108442368 has waited at row0sel.c line 2930 for 0.00 seconds the semaphore:
S-lock on RW-latch at 0x7fd752e55c40 created in file buf0buf.c line 938
a writer (thread id 140562088974080) has reserved it in mode exclusive
number of readers 0, waiters flag 1, lock_word: 0
Last time read locked in file row0sel.c line 2930
Last time write locked in file /tmp/buildd/mysql-5.5-5.5.44/storage/innobase/buf/buf0buf.c line 3168
Na verdade, existem cerca de 15 instâncias disso.
Olhando para as transações, há apx 200 transações listadas, das quais apx metade aparece como waiting in InnoDB queue
, e a outra metade é fetching data
.
Todas as transações são SELECT
consultas e nenhuma delas mostra nenhum arquivo locks
.
Alguém pode me dizer o que o SEMAPHORES
(acima) se relaciona?
Os semáforos têm a ver com a espera de bloqueios de thread internos no sistema operacional
Você pode encontrar uma boa discussão no passo a passo SHOW INNODB STATUS de Peter Zaitsev
A meu ver, isso está relacionado a duas coisas
Meu palpite é que você definiu innodb_thread_concurrency para um número diferente de zero. Isso faz com que o mecanismo de armazenamento InnoDB limite seu uso de threads internos. Consequentemente, isso fará com que as transações fiquem na fila.
Em 2011, escrevi posts sobre isso
Sep 12, 2011
: Possível fazer o MySQL usar mais de um núcleo?Aug 16, 2011
: Por que os encadeamentos do MySQL geralmente mostram o status "liberando itens" quando o cache de consulta está desativado?May 26, 2011
: Sobre o desempenho de bancos de dados de thread único versus multithreadFui ao Percona Live NYC em 2011. Ronald Bradford me disse durante um workshop para deixar innodb_thread_concurrency em zero(0). Por quê ?
Como mencionei na postagem de 16 de agosto de 2011 :
Se você tiver innodb_thread_concurrency como um valor diferente de zero, defina-o como 0 ou remova-o de
my.cnf
. Observe que o MySQL 5.6 permite 5.000 tickets , enquanto o MySQL 5.5 permite apenas 500 .Se você deseja alterar esses valores, pode fazê-lo dinamicamente com
Eu recomendaria não configurar innodb_concurrency_tickets .
Eu também recomendaria a leitura de Pythian MAIS UMA VEZ SOBRE INNODB-CONCURRENCY-TICKETS