MySQL MyISAM многоядерная оптимизация

Я заметил, что наше приложение не отвечает на запросы, когда выполняется требовательный запрос. Бег top кажется, чтобы определить источник проблемы:

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                

Мне кажется, что mysql загружает весь процессор, на котором он работает (99,1%). Это означает, что одно из наших ядер привязано на 100%, а остальные 7 (семь!) Бездействуют на 0%.

Я понимаю, что если бы наши таблицы были InnoDB, нагрузка была бы распределена между ядрами. Это правильно?

Есть ли способ распределить рабочую нагрузку между ядрами, в которых наши таблицы используют MyISAM?

Я смотрю совсем не в том месте? В то время как ресурсоемкий запрос перегружает один ЦП, разве MySQL не сможет использовать другие ЦП для отдельных запросов? Или это ограничено нашим использованием MyISAM?

1 ответ

Ваше понимание InnoDB и нагрузки, распределяемой между несколькими ядрами, неверно, но близко.

Таблицы MyISAM выполняют "блокировку на основе таблиц", что означает, что любой запрос, который блокирует таблицу, обязательно блокирует все другие запросы, которые должны были бы получить блокировку.

InnoDB использует "блокировку на основе строк" ​​для большинства операций, что позволяет другим запросам, которым не требуется блокировать эту точную строку, продолжать параллельно.

Один большой запрос все еще будет использовать только одно ядро, будь то MyISAM или InnoDB, но несколько запросов, попадающих в одну и ту же таблицу, должны иметь возможность выполнять одновременно на разных ядрах, если они не заблокированы блокировками на уровне строк.

Другие вопросы по тегам