Неравномерное время выполнения запросов

Добрый день! Имеется конфигурация, к которой 1 сервер мантикоры в качестве прокси (все запросы от клиентов поступают на него) и несколько серверов в качестве агентов, на которые прокси распределяет эти запросы. Версия 6.3.6.

К примеру индекс на прокси выглядит как то так:

index distributed
{
    type = distributed
    ha_strategy = nodeads
}
index my_super_index:distributed
{
    agent = 10.129.0.1:9312|10.129.0.2:9312|10.129.0.3:9312|10.129.0.4:9312|10.129.0.5:9312:my_super_index
}

На прокси 4 ядра и 4 Gb памяти, конфиг (оставил значимые настройки)

searchd
{
	listen			                = 9306:mysql
	net_workers			            = 6
	threads 						= 5
	agent_connect_timeout	        = 100
    agent_query_timeout		        = 10000
    agent_retry_count		        = 5
    agent_retry_delay		        = 0
    ha_period_karma		            = 60
    ha_ping_interval		        = 1000
    network_timeout		            = 5
    client_timeout		            = 300
    sphinxql_timeout		        = 86400
}

На прокси команда выдает такие результаты:

mysql> show status like 'work%';
+---------------------+-------+
| Counter             | Value |
+---------------------+-------+
| workers_total       | 5     |
| workers_active      | 52    |
| workers_clients     | 52    |
| workers_clients_vip | 0     |
| work_queue_length   | 54    |
+---------------------+-------+

Не смогли найти в документации подробное описание работы manticore в режиме прокси. В нашем представлении работает так:
Директива threads задает число потоков для обработки запросов (workers_total). net_worker при получении запроса либо передает его на исполнение в обработку (если потоки обработки свободны) либо ставит в очередь (work_queue). Далее workers выбирает одно из зеркал и отправляет на него запрос и ждет ответ. Т.о. одновременно могут обрабатываться максимум 5 запросов, остальные ждут в очереди.
Процессор на агентах нагружен скачкообразно, то 20% то 70%. Сейчас у нас проблема в том, что время ответа от прокси временами вырастает вплоть до 2 секунд, в то время как обычно такие запросы укладываются в 40-50 мс, пытаемся установить причины такого поведения (то ли запросы проводит много времени в очереди, то ли застревают при agent_retry, т.к. периодически мы перезапускаем агенты по очереди для обновления дисковых индексов, то ли по иной причине).

Вопросы:

  1. Что значят показатели workers_active, workers_clients, work_queue_length? Вроде выходит что всего воркеров 5, из них активны 52, что странно. work_queue_length всегда на 2-3 единицы больше чем workers_active и никогда не бывает пустая.
  2. Совпадает ли наше представление о работе с реальностью?
  3. Следует ли на прокси поднять threads до скажем 500, т.к. обработчики фактически лишь переправляют запрос на агенты и ждут ответ (не нагружены)
  4. Есть ли какие то иные идеи, куда можно копать?

Директива threads задает число потоков для обработки запросов (workers_total)

Да

net_worker при получении запроса либо передает его на исполнение в обработку (если потоки обработки свободны) либо ставит в очередь (work_queue)

Нет, work_queue_length не связан с сетью. Сетевые треды, количество которых регулируется через net_workers не связаны напрямую с пулом тредов, контролирующимся через threads.

Далее workers выбирает одно из зеркал и отправляет на него запрос и ждет ответ. Т.о. одновременно могут обрабатываться максимум 5 запросов, остальные ждут в очереди.

Нет. В мантикоре используются корутины, так что после отправки запроса на удалённую ноду тред не стоит в ожидании, а может выполнять другие задачи.

  1. Что значят показатели workers_active, workers_clients, work_queue_length?

workers_clients - число подключений. active и queue_length сложны для понимания. Лучше смотреть по show threads option format=all и select * from @@system.sessions. Так должно быть яснее, кто подключен и что делают или не делают треды.

Вроде выходит что всего воркеров 5, из них активны 52, что странно. work_queue_length всегда на 2-3 единицы больше чем workers_active и никогда не бывает пустая.

Сейчас у нас проблема в том, что время ответа от прокси временами вырастает вплоть до 2 секунд, в то время как обычно такие запросы укладываются в 40-50 мс, пытаемся установить причины такого поведения

Нужно смотреть query log’и на мастере и на агентах. После этого обычно становится яснее. Полезный трюк - использовать комменты в запросах (select ... option comment=<query_id>). Маловероятно, что проблема на мастере.