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