Мне представили несколько выделенных серверов MySQL, которые никогда не используют более одного ядра. Я больше разработчик, чем администратор баз данных для MySQL, поэтому нужна помощь
Настроить
Серверы довольно здоровенные с нагрузкой типа OLAP / DataWarehouse (DW):
- Основной: 96 ГБ ОЗУ, 8 ядер + один массив RAID 10
- Тест: 32 ГБ ОЗУ с 4 ядрами
- Самая большая БД составляет 540 ГБ, общий объем около 1,1 ТБ и в основном таблицы InnoDB.
- Солярис 10 Intel-64
- MySQL 5.5.x
Примечание. Самая большая БД является реплицированной с сервера OLTP DR, и с нее загружается DW. Это не полный DW: только последние 6 месяцев до 6 недель, поэтому он меньше, чем OLTP DB.
Наблюдения на тестовом сервере
- 3 отдельных соединения
- у каждого есть одновременно (и разные)
ALTER TABLE...DROP KEY...ADD INDEX
- 3 таблицы имеют 2,5, 3,8 и 4,5 миллиона строк
- Загрузка процессора увеличивается до 25% (одно ядро максимально) и не выше
- 3 АЛЬТЕРЫ занимают 12-25 минут (сингл на наименьшем занимает 4,5)
Вопросов
- Какие настройки или патчи требуются для использования более одного ядра?
То есть, почему MySQL не использует все доступные ядра? (как и другие РСУБД) - Это следствие репликации?
Другие заметки
- Я понимаю разницу между «потоком» СУБД и «потоком» ОС
- Я не спрашиваю о какой-либо форме параллелизма
- Некоторые системные переменные для InnoDB и потоков являются неоптимальными
(в поисках быстрого выигрыша) - В краткосрочной перспективе я не могу изменить расположение дисков
- ОС можно настроить при необходимости
- Один ALTER TABLE на самом маленьком столе занимает 4,5 минуты (шокирующая IMO)
Редактировать 1
- Значение innodb_thread_concurrency равно 8 для обоих. Да, это неправильно, но MySQL не будет использовать несколько ядер
- Размер innodb_buffer_pool_size составляет 80 ГБ на основном сервере, 10 ГБ на тесте (другой экземпляр отключен). Это нормально на данный момент.
- innodb_file_per_table = ON
Редактировать 2
- innodb_flush_log_at_trx_commit = 2
- innodb_use_sys_malloc = ON
- innodb_flush_method должен быть O_DIRECT (но SHOW VARIABLES не показывает это)
- innodb_doublewrite = OFF
- Файловая система = ZFS (и мой системный администратор нашел это: http://blogs.oracle.com/realneel/entry/mysql_innodb_zfs_best_practices )
Тестировать
- innodb_flush_method не отображается как O_DIRECT, когда это должно быть
- будет следовать настройкам RolandoMySQLDBA
Дайте мне знать, если я пропустил что-то важное
ура
Обновить
Изменено innodb_flush_method + 3 настройки потока в ответе RolandoMySQLDBA.
Результат:> 1 ядро, использованное для тестов = положительный результат
\G
. Кроме того, я думаю, что SHOW INNODB STATUS
не рекомендуется в пользу SHOW ENGINE INNODB STATUS
версии 5.5 (я получаю сообщение об ошибке при запуске первого в командной строке.