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, но несколько запросов, попадающих в одну и ту же таблицу, должны иметь возможность выполнять одновременно на разных ядрах, если они не заблокированы блокировками на уровне строк.