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?