Eu fiz check-in com a equipe de desenvolvimento do MySQL Cluster e a Frazer Clement forneceu essa resposta detalhada. Deixe-nos saber como vai o seu teste. Um bom lugar para fazer perguntas específicas ao MySQL Cluster é o fórum: forums.mysql.com/list.php?25
Esse CPU não tem Hyperthreading
Por isso, tem dois núcleos reais.
De acordo com isto: link , o MaxNoOfExecutionThreads deve ser definido como 2 para um host de 2 núcleos.
Ele também afirma que, quando definido como 2, haverá:
1 local query handler (LQH) thread
1 transaction coordinator (TC) thread
1 transporter thread
1 subscription manager (SUMA) thread
Com ndbd simples, todas essas funções estão em 1 thread, com ndbmtd e MaxNoOfExecutionThreads = 2, elas são divididas conforme mostrado. Note que esta é uma divisão 'funcional' - cada thread tem uma função diferente e, portanto, requer uma quantidade diferente de CPU para realizar sua parte do trabalho. Para um determinado throughput, a quantidade de CPU consumida por cada tipo de thread será diferente.
Valores mais altos de MaxNoOfExecutionThreads aumentarão o número de encadeamentos LQH, que devem ter uma participação igual no trabalho 'LQH' e devem ser balanceados um em relação ao outro. No entanto, os outros segmentos terão quantidades diferentes de consumo de CPU.
Finalmente, a linha LockExecuteThreadToCpu = 0,1 é usada pelo ndbmtd em uma espécie de estilo round-robin. Infelizmente, existem muitos encadeamentos de execução (4) para o número de CPUs fornecidas para fornecer um equilíbrio equilibrado. Então, o que acontece é que o único encadeamento LQH recebe uma CPU e os outros três encadeamentos compartilham a outra CPU. Isso pode explicar o desequilíbrio visto.
Observe que o mapeamento de threads para o cpus é produzido no stdout (ndb_out log) de cada processo ndbmtd quando é iniciado. Usando configuração semelhante, vejo o seguinte:
NDBMT: num_threads = 4
Instanciando DBSPJ instanceNo = 0
Bloqueie threadId = 3936 para a ID da CPU = 0
Bloqueie threadId = 3935 para a ID da CPU = 0
Bloqueie threadId = 3937 para a ID da CPU = 0
AVISO: Poucas CPUs são especificadas com LockExecuteThreadToCPU. Apenas 2 especificados, mas 4 foram necessários, isso pode causar contenção.
Atribuir encadeamentos LQH a CPU (s) dedicada (s) e outros encadeamentos compartilhará o restante thr: 2 tid: 3940 cpu: 0 OK PGMAN (1) DBACC (1) DBLQH (1) DBTUP (1) BACKUP (1) DBTUX (1) RESTORE (1)
thr: 3 tid: 3933 cpu: 1 OK CMVMI (0)
thr: 1 tid: 3939 cpu: 1 OK BACKUP (0) DBLQH (0) DBACC (0) DBTUP (0) SUMA (0) DBTUX (0) TSMAN (0) LGMAN (0) PGMAN (0) RESTORE (0) DBINFO (0) PGMAN (5)
thr: 0 tid: 3938 cpu: 1 OK DBTC (0) DBDIH (0) DBDICT (0) NDBCNTR (0) QMGR (0) NDBFS (0) TRIX (0) DBUTIL (0) DBSPJ (0)
Podemos ver que um thread de execução (3940) está bloqueado para CPU 0, e os outros são bloqueados para CPU 1. 3940 é um thread de trabalho LQH (como tem um bloco DBLQH com um número > 0 (DBLQH 1))).
Os encadeamentos CMVMI (receptor IO de rede), DBLQH (0) / SUMA (0) e DBTC (0) estão todos bloqueados para a CPU 1 neste exemplo.
Portanto, dependendo do tráfego usado, a quantidade de CPU consumida no CPU 0 vs CPU1 estará fora de equilíbrio. Observe que os encadeamentos de 'manutenção' também são bloqueados para a CPU 0 que, se a CPU 0 estiver saturada, pode piorar as coisas.
Se o gargalo para esse tipo de tráfego for o processamento de LQH, aumentar o MaxNoOfExecutionThreads para 4 ou mais resultará em 2 LQH 'workers', que receberão um núcleo. No entanto, os outros threads também estarão usando um dos núcleos, o que limitará os recursos do trabalhador LQH nesse núcleo.
Se os funcionários do LQH não forem o gargalo, ter funcionários extras do LQH pode reduzir a CPU disponível para outros encadeamentos e reduzir o throughput.
Eu recomendo testar a carga de tráfego, verificar a saída do ndbmtd para entender o mapeamento e medir o throughput e a latência atingíveis, bem como observar o equilíbrio e a utilização dos núcleos da CPU.