MySQL MyISAM otimização multi-core

2

Percebi que nosso aplicativo não responde a solicitações quando uma solicitação exigente está em execução. A execução de top parece identificar a origem do problema:

top - 13:54:25 up 1 day, 13:43,  2 users,  load average: 1.02, 0.98, 0.83
Tasks: 110 total,   1 running, 109 sleeping,   0 stopped,   0 zombie
Cpu(s): 11.9%us,  1.1%sy,  0.0%ni, 86.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.2%st
Mem:   3145728k total,  2329220k used,   816508k free,        0k buffers
Swap:   131072k total,   128164k used,     2908k free,  1585060k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
26073 mysql     20   0  397m 209m 3452 S 99.1  6.8   3:02.49 mysqld             
16419 mailnull  20   0  9848 3288 2664 S  2.3  0.1   1:17.63 exim               
 2085 nobody    20   0 44312  10m 3436 S  1.3  0.3   4:50.98 litespeed          
24727 nobody    20   0  320m  50m  41m S  0.3  1.7   0:06.86 lsphp5             
26314 root      20   0  2428 1104  832 S  0.3  0.0   0:00.36 top                

Parece-me que o mysql está sobrecarregando toda a CPU em que está sendo executado (99,1%). Isso significa que um de nossos núcleos está atrelado a 100% enquanto os outros 7 (sete!) Ficam ociosos a 0%.

Eu entendo que se nossas tabelas fossem InnoDB, a carga seria distribuída entre os núcleos. Está correto?

Existe alguma maneira de distribuir a carga de trabalho entre os núcleos que nossas tabelas estão usando MyISAM?

Estou procurando no lugar errado por completo? Enquanto a consulta com recursos pesados está sobrecarregando uma CPU, o MySQL não deveria ser capaz de utilizar as outras CPUs para consultas separadas? Ou isso é limitado pelo uso do MyISAM?

    
por rinogo 14.06.2013 / 22:14

1 resposta

3

Sua compreensão do InnoDB e da carga distribuída entre mais núcleos está incorreta, mas próxima.

As tabelas MyISAM fazem o 'bloqueio baseado em tabela', o que significa que qualquer consulta que bloqueie a tabela necessariamente bloqueia todas as outras consultas que precisem de um bloqueio.

O InnoDB usa o 'bloqueio baseado em linha' para a maioria das operações, o que permite que outras consultas que não precisam bloquear a linha exata continuem em paralelo.

Uma única consulta grande ainda usará apenas um núcleo, seja MyISAM ou InnoDB, mas várias consultas na mesma tabela poderão ser executadas simultaneamente em núcleos separados, desde que não estejam bloqueadas por bloqueios no nível de linha. .

    
por 14.06.2013 / 23:23