Я заметил, что наше приложение не отвечает на запросы, когда выполняется требовательный запрос. Бег 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?
Ваше понимание InnoDB и распределения нагрузки между большим количеством ядер неверно, но близко.
Таблицы MyISAM выполняют «блокировку на основе таблиц», что означает, что любой запрос, блокирующий таблицу, обязательно блокирует все другие запросы, которые могут потребовать блокировки.
InnoDB использует «блокировку на основе строк» для большинства операций, что позволяет другим запросам, которым не требуется блокировать именно эту строку, продолжаться параллельно.
Один большой запрос по-прежнему будет использовать только одно ядро, будь то MyISAM или InnoDB, но несколько запросов, попадающих в одну и ту же таблицу, должны иметь возможность выполняться одновременно на разных ядрах, при условии, что они не блокируются блокировками на уровне строк.