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

25

Я использую 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+? Это сильно повлияет на процессор и память?

Мартин
источник

Ответы:

43

Основываясь на информации в документации MySQL, вы должны сделать следующее: выяснить, какое наибольшее количество одновременных подключений было у mysqld с использованием Connections , 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.

RolandoMySQLDBA
источник
Спасибо за отличный комментарий! Я немного обновил свой вопрос.
Мартин
Я думаю, что вы намеревались mysql> SHOW GLOBAL STATUS LIKE 'соединения'; (вы написали max_used_connections дважды)
Алек
1
Я просто хочу добавить, что, ссылаясь на этот dev.mysql.com/doc/refman/5.7/en/… вы должны добавить 8 к Max_used_connections для значения thread_cache_size (не превышая 100)
CME64
1
На самом деле, руководство предлагает значение по умолчанию (1% от mac_used_connections) + 8 .... или 100 ... в зависимости от того, что меньше.
Кристофер МакГоуэн
Для меня # это 264/103134, что соответствует 0,0026, что намного меньше 0,01. Но у меня MaxUsedConnections - 72, поэтому последнее предложение ужасно противоречиво
Боудкодер
11

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

/dba//a/28701

Томаш П. Шинальски
источник
я так думаю! после того, как я проверил этот конфиг, «thread_cache_size должен быть больше, чем Max_used_connections», не помогло.
CK.Nguyen
-2

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