Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

MYSQL_INNODB_TUNING Linux / DevOps

Тюнинг InnoDB Buffer Pool в MySQL: buffer_pool_size, instances и chunk_size

Обновлено: 21.08.2026
  • Низкая скорость выполнения SELECT-запросов из-за постоянного чтения страниц с диска (высокий Innodb_buffer_pool_reads).
  • Высокая утилизация дискового I/O (iowait) при наличии свободной оперативной памяти на сервере.
  • Дедлоки и задержки мьютексов буферного пула (Buffer Pool Mutex Contention) на многоядерных процессорах.

1. Расчет оптимального размера innodb_buffer_pool_size

Для выделенного сервера БД рекомендуется выделять 60-80% от общего объема физической RAM хоста.

2. Формула согласования параметров (Правило кратности)

Размер буферного пула должен быть строго кратен произведению innodb_buffer_pool_instances * innodb_buffer_pool_chunk_size:

# Пример для сервера с 32GB RAM (выделяем 24GB под пул):
# 24GB / 8 instances = 3GB на один инстанс.
# Chunk size по умолчанию = 128MB (3072MB кратно 128MB).

3. Конфигурация в /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]
# Размер буферного пула (24GB)
innodb_buffer_pool_size = 24G

# Количество инстансов (рекомендуется 1 инстанс на каждые 1-2GB пула, от 8 до 16 для мощных CPU)
innodb_buffer_pool_instances = 8

# Размер динамического блока расширения
innodb_buffer_pool_chunk_size = 128M

# Сохранение состояния кэша при перезапуске для быстрого прогрева (Warm-up)
innodb_buffer_pool_dump_at_shutdown = 1
innodb_buffer_pool_load_at_startup = 1

4. Динамическое изменение размера буферного пула на лету (Online Resize)

-- Изменение без перезагрузки MySQL
SET GLOBAL innodb_buffer_pool_size = 25769803776; -- 24 * 1024 * 1024 * 1024

-- Мониторинг процесса перестроения
SHOW STATUS LIKE 'Innodb_buffer_pool_resize_status';

5. Проверка эффективности кэширования (Buffer Pool Hit Rate)

SHOW ENGINE INNODB STATUS\G
-- Ищите секцию: Buffer pool hit rate 999 / 1000 (должно быть не ниже 990-995)
💡 Практика специалистов: Если размер innodb_buffer_pool_size меньше 1GB, значение innodb_buffer_pool_instances всегда принудительно устанавливается ядром MySQL в 1 независимо от конфигурационных файлов.

Частые вопросы (FAQ)

Почему нельзя задавать innodb_buffer_pool_size на 90-95% от всей памяти сервера?

Помимо буферного пула, MySQL выделяет память на сессионные буферы (sort_buffer, join_buffer, read_rnd_buffer) для каждого подключения, а также память операционной системы. Превышение лимита вызовет завершение процесса mysqld демоном Linux OOM Killer.

Зачем разделять буферный пул на innodb_buffer_pool_instances?

Каждый инстанс работает со своим собственным списком страниц LRU и мьютексами, что предотвращает взаимные блокировки потоков при параллельной обработке сотен запросов на многопоточных серверах.

Полезные материалы
Рекомендуем