Spec-Zone.ru › MySQL 5.7

14.8.5 Настройка одновременности потоков для InnoDB

InnoDB использует операционную систему для обработки запросов от транзакций пользователя. (Транзакции могут выдать множество запросов к InnoDB перед подтверждением или откатом.) На современных операционных системах и серверах с многоядерными процессорами, где контекстная смена эффективна, большинство рабочих нагрузок выполняются хорошо без каких-либо ограничений на количество одновременных потоков. Улучшения масштабируемости в MySQL 5.5 и выше снижают необходимость ограничивать количество одновременно выполняемых потоков внутри InnoDB.

В ситуациях, когда желательно минимизировать контекстную смену между потоками, InnoDB может использовать ряд техник для ограничения количества одновременно выполняемых потоков операционной системы (и, следовательно, количества запросов, обрабатываемых в любой момент времени). Когда InnoDB получает новый запрос от сессии пользователя, если количество одновременно выполняемых потоков достигает предварительно определенного предела, новый запрос переходит в состояние ожидания на короткое время, прежде чем попытаться снова. Потоки, ожидающие блокировок, не учитываются в количестве одновременно выполняемых потоков.

Вы можете ограничить количество одновременных потоков, установив параметр конфигурации innodb_thread_concurrency. После того, как количество выполняемых потоков достигнет этого предела, дополнительные потоки переходят в состояние ожидания на определенное количество микросекунд, заданное параметром конфигурации innodb_thread_sleep_delay, прежде чем быть помещенными в очередь.

Ранее требовалось проводить эксперименты для поиска оптимального значения для innodb_thread_sleep_delay, и оптимальное значение могло меняться в зависимости от рабочей нагрузки. В MySQL 5.6.3 и более поздних версиях вы можете установить параметр конфигурации innodb_adaptive_max_sleep_delay в наибольшее значение, которое вы бы допустили для innodb_thread_sleep_delay, и InnoDB автоматически корректирует innodb_thread_sleep_delay вверх или вниз в зависимости от текущей активности планирования потоков. Эта динамическая корректировка помогает механизму планирования потоков работать плавно как при небольшой загрузке системы, так и при работе близко к полной мощности.

Значение по умолчанию для innodb_thread_concurrency и предполагаемый предел на количество одновременных потоков были изменены в различных версиях MySQL и InnoDB. Значение по умолчанию для innodb_thread_concurrency равно 0, поэтому по умолчанию нет ограничений на количество одновременно выполняемых потоков.

InnoDB заставляет потоки переходить в состояние ожидания только тогда, когда количество одновременных потоков ограничено. Когда нет ограничений на количество потоков, все они равноправно конкурируют за планирование. То есть, если innodb_thread_concurrency равно 0, значение innodb_thread_sleep_delay игнорируется.

Когда есть ограничение на количество потоков (когда innodb_thread_concurrency больше 0), InnoDB снижает издержки контекстной смены, позволяя нескольким запросам, сделанным во время выполнения одного SQL-запроса, попадать в InnoDB без соблюдения предела, установленного innodb_thread_concurrency. Поскольку SQL-запрос (например, объединение) может включать несколько операций с записями в InnoDB, InnoDB назначает заданное количество “билетов”, которые позволяют потоку планироваться повторно с минимальными затратами.

Когда начинается новый SQL-запрос, у потока нет билетов, и он должен соблюдать innodb_thread_concurrency. Как только поток получает право войти в InnoDB, ему назначается определенное количество билетов, которые он может использовать для последующего входа в InnoDB для выполнения операций с записями. Если билеты заканчиваются, поток исключается, и innodb_thread_concurrency соблюдается снова, что может поместить поток обратно в очередь ожидания «первым пришёл — первым обслужен». Когда поток снова получает право войти в InnoDB, билеты назначаются снова. Количество назначаемых билетов задается глобальным параметром innodb_concurrency_tickets, который по умолчанию равен 5000. Потоку, ожидающему блокировку, предоставляется один билет после того, как блокировка становится доступной.

Правильные значения этих переменных зависят от вашей среды и рабочей нагрузки. Попробуйте различные значения, чтобы определить, какое из них подходит для ваших приложений. Прежде чем ограничивать количество одновременно выполняемых потоков, проверьте параметры конфигурации, которые могут улучшить производительность InnoDB на компьютерах с несколькими ядрами и процессорами, такие как innodb_adaptive_hash_index.

Для общей информации о обработке потоков MySQL см. Раздел 5.1.11.1, «Интерфейсы подключений».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/innodb-performance-thread_concurrency.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API