2015-03-06 4 views
1

Краткая история: я не могу запускать более двух одновременных поисков на solr5 (то же самое с 4.10) из одного и того же клиентского процесса. Есть ли какой-либо флаг в файле конфигурации, который я пропустил? Это проверенный факт, что это не проблема с аппаратным обеспечением или проблема с программным обеспечением (клиентом). См. Ниже полную историю.Увеличение Solr search concurrency

Длинная история:

Мне нужно построить слово на основе поисковой системы (поля содержат вообще только одно слово/значение - даже если это поле многозначным, все значения будут только одно слово) и 60-70% поисков без подстановочных знаков. Ожидаемый размер ядра составляет около 50 тыс. Документов со средним значением 20 полей. Ожидается, что коллекция будет обновляться примерно один раз в неделю (возможно, даже меньше), поэтому мне не очень важно время индексирования. Я думаю, мы можем с уверенностью предположить, что писать не будет, просто прочитайте - поэтому мы сможем минимизировать вероятность блокировок и других проблем параллелизма. Кроме того, самый «дорогой» запрос в моем тесте (по времени solr's qtime) составляет около 150. У меня есть партия из 10 килограммовых поисковых запросов и независимо от того, что я делаю, я не могу закончить их менее чем за 5 минут , Независимо от того, сколько потоков я открываю на стороне клиента, независимо от того, какое значение я устанавливаю в файлах конфигурации ... и процессор составляет около 30-40%, только с 30% -ой памятью;

То, что я пробовал:

  1. solr5 + причал на одноядерном виртуальной машине с 3ГБ оперативной памяти;
  2. solr5 + причал на двухъядерной виртуальной машине с 6 ГБ оперативной памяти (4 ГБ для Java);
  3. solr5 + tomcat6 на двухъядерной виртуальной машине с 6 ГБ ОЗУ;

использование netstat -a -n | grep @port для # 1 и # 2 я видел только 2 активных соединений (Введено) в любой момент времени - но не более, и # 3 У меня был около этих 2 активных соединений других 10-15 в режиме TIME_WAIT (не активен).

Я как-то проиграл в этом ... Я не ниндзя Java, и я не уверен в связанных с Java продуктах и ​​их конфигурации. Я использовал 2 разных контейнера сервлетов с почти той же проблемой. ИМО, очевидно, что кто-то дросселирует активные соединения - и я не знаю, что делать, чтобы узнать, кто и почему.

В качестве побочного примечания - я не уверен, что это важно или нет. Я скопировал один и тот же инструмент на другой машине, одновременно начал тест «стресс» с одним на моей машине, и я заметил, что количество активных соединений удваивается (через netstat), ресурсы немного выше, чем в одномоторном тесте, а время выполнения идентично для обеих машин: 5 минут.

Итак, что мне делать, чтобы удалить этот предел - или, по крайней мере, увеличить его?

ответ

1

Как обычно, проблема лежит между креслом и клавиатурой. :(

Клиент был сделан в C# с помощью простого старого WebRequest класса -., Который подчиняется лимиту системы одновременных HTTP вызовов, сделанных по тому же адрес (чтобы избежать DOS)

После прочтения this статьи, я понял, ., где эта проблема Таким образом, следующий твик в app.config решается вопрос:.

<system.net> 
    <connectionManagement> 
     <add address = "*" maxconnection = "300" /> 
    </connectionManagement> 
</system.net> 

Он закончил все эти запросы примерно в одну минуту с 16 открыли темы Активные соединения были также видны в NetStats

.