Назад | Перейти на главную страницу

Какое значение thread_cache_size мне следует использовать?

Я использую Asp.Net вместе с MySQL. В строке подключения .Net я установил максимальный размер пула равным 150.

Если я запустил следующее, я получу эти значения:

SHOW GLOBAL STATUS LIKE 'max_used_connections'; gives 66
SHOW GLOBAL STATUS LIKE 'Threads_created'; gives 66
SHOW GLOBAL STATUS LIKE 'connections'; gives 474

Что дает Threads_created / Connections = 0,1392.

Итак, мне кажется, что мне нужно увеличить thread_cache_size.

Но если я убегу SHOW PROCESSLIST Я всегда вижу, что у меня открыто много подключений (большинство из них спят) из-за пула, созданного .Net. Мне все еще нужно установить thread_cache_size как я все еще буду повторно использовать соединения из пула соединений? Если размер пула равен 150, как вы думаете, хорошим значением будет установить thread_cache_size до 150+? Будет ли это сильно влиять на процессор и память?

Основываясь на информации в документации MySQL, вы должны сделать следующее: Выяснить, какое наибольшее количество одновременных подключений было у mysqld с использованием Подключения, Threads_created, и Max_used_connections,

  • SHOW GLOBAL STATUS LIKE 'Connections';
  • SHOW GLOBAL STATUS LIKE 'Threads_created';
  • SHOW GLOBAL STATUS LIKE 'Max_used_connections';

Попробуйте вычислить следующее

Threads_created / Connections : Если это больше 0,01, увеличьте thread_cache_size. По крайней мере, thread_cache_size должно быть больше чем Max_used_connections.

Согласно документации MySQL, вы должны установить thread_cache_size так что большинство новых подключений используют потоки из кеша, а не вновь созданные потоки. Это сокращает накладные расходы на создание потоков, хотя обычно не приводит к значительному повышению производительности:

Запросы на потоки удовлетворяются за счет повторного использования потоков, взятых из кеша, если это возможно, и только когда кеш пуст, создается новый поток. Эта переменная может быть увеличена для повышения производительности, если у вас много новых подключений. Обычно это не дает заметного улучшения производительности. если у вас есть хорошая реализация потока. Однако, если ваш сервер видит сотни соединений в секунду, вы должны обычно устанавливать thread_cache_size достаточно высоким, чтобы большинство новых подключений используют кешированные потоки. (источник)

Это будет означать, что вам следует установить thread_cache_size так что Threads_created / Connections (процент соединений, которые приводят к созданию новых потоков) довольно низкий. Если вы понимаете документацию MySQL буквально ("большинство"), значение должно быть <50%. В ответе RolandoMySQLDBA указано <1%. Не знаю, кто ближе к истине.

Вам следует не устанавливать thread_cache_size выше чем Max_used_connections. Последнее предложение в ответе RolandoMySQLDBA («По крайней мере, thread_cache_size должно быть больше, чем Max_used_connections») не кажется разумным, потому что в нем говорится, что вы должны хранить в кеше больше потоков, чем ваш сервер. Когда-либо использует. MySQL в любом случае никогда не будет помещать такое количество потоков в кеш - он не помещает потоки в кеш заранее, а только помещает их туда. после клиент создает поток и отключается. Если у вас никогда не будет X клиентов, подключающихся одновременно, у вас никогда не будет X потоков в кеше:

Когда клиент отключается, потоки клиента помещаются в кеш, если там меньше потоков thread_cache_size. (источник)

Смотрите также этот ответ от Майкла:

Установка thread_cache_size на значение, превышающее max_connections, кажется чрезвычайно бесполезным советом ... кеш не может увеличиваться больше, чем max_connections, и даже кеш где-либо близко к этому размеру может иметь смысл только в том случае, если у вас есть огромное количество оттока ваших потоков ... чего не будет в приложении с хорошим поведением.

https://dba.stackexchange.com/a/28701

В обычный рабочий день, возможно, потребуется подключение «новому сотруднику»? Большинство фокусников не знают, сколько людей можно нанять в ближайшие дни. MySQL V 8 предлагает CAP thread_cache_size равным 100 для предотвращения перегрузки независимо от max_used_connections. Для меня 100 - хороший CAP.

См. Эту ссылку, пожалуйста.

https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_thread_cache_size