Я использую 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, и даже кеш где-либо близко к этому размеру может иметь смысл только в том случае, если у вас есть огромное количество оттока ваших потоков ... чего не будет в приложении с хорошим поведением.
В обычный рабочий день, возможно, потребуется подключение «новому сотруднику»? Большинство фокусников не знают, сколько людей можно нанять в ближайшие дни. 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