Por que o cluster do mysql não usa múltiplos núcleos da CPU?

4

Eu tenho um problema com o processo ndbmtd. Quando uso a seguinte configuração, espero que ambos os núcleos em nosso servidor com o processador Intel (R) Pentium® CPU G6950 @ 2.80GHz sejam totalmente utilizados. Infelizmente isso não está acontecendo. Apenas core com id = 0 é usado. O segundo não tem carga.

Minha configuração:

[ndbd default]
MaxNoOfExecutionThreads=2
[ndbd]
HostName=192.168.1.4
NodeId=3
LockExecuteThreadToCPU=0,1
LockMaintThreadsToCPU=0

mpstat -P ALL

08:47:09 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
08:47:11 AM     all     44.64      0.00      1.75      1.25      0.00     52.37
08:47:11 AM       0     89.45      0.00      1.01      2.01      0.00      7.54
08:47:11 AM       1      0.99      0.00      1.98      0.00      0.00     97.03

No entanto, "top" mostra 90% de uso para o processo ndbmtd (por quê?)

Minha topologia - 2 nós de dados, ndb_mgmt na VM, o mysqld na VM.

A minha CPU não é capaz disso, eu tenho algo mal configurado ou o mysql-cluster não é capaz de carregar completamente processadores multi-core?

    
por John 10.08.2011 / 11:49

2 respostas

6

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.

    
por 10.08.2011 / 16:10
1

Acho que você deve definir MaxNoOfExecutionThreads = 4 quando tiver 2 núcleos em cpu, esta propriedade deve ser definida na seção ndbd

[ndbd] MaxNoOfExecutionThreads = 2

Eu não sei porque você deve definir este parâmetro 2xores, mas isso funciona

    
por 17.10.2011 / 15:34