1000 объектов - детская игра для Solr, поэтому здесь происходит что-то подозрительное с чтением ~ 200ms Solr. Тем не менее, ваша самая непосредственная проблема заключается в том, что вы пишете Solr во время того, что выглядит как запрос GET - что с этим? Вы сохраняете объект поиска, который запускает автоиндекс Sunspot? Если вам необходимо обновить модели во время запроса GET (что, возможно, следует выполнить в фоновом режиме, если это возможно), вы можете отключить автоматическую индексацию в Sunspot:
searchable :auto_index => false
# sunspot setup
end
Тогда вам нужно явно вызвать my_model.index
в ваших контроллерах, когда вы действительно хотите обновить их в Solr.
Наконец, это большое обновление в конце - это фиксация Solr, которая говорит Solr записывать неустановленные изменения на диск и загружать новый поисковик, который отражает эти изменения. Коммиты стоят дорого; Sunspot :: Rails по умолчанию выполняет фиксацию в конце любого запроса, который пишет Solr, но это поведение нацелено на принцип наименьшего удивления для новых пользователей Sunspot, а не на живое приложение в производстве. Вы хотите отключить его в вашем config/sunspot.yml
:
auto_commit_after_request: false
Затем вы, вероятно, захотите настроить autoCommit в своем solr/conf/solrconfig.xml
- он закомментирован в стандартном выпуске Sunspot Solr, и там тоже есть объяснение. Я обнаружил, что раз в минуту это хорошее место для начала.
После внесения этих изменений я бы посмотрел, все ли ваши чтения все еще медленны - я думаю, вполне возможно, что причина в том, что каждый раз, когда вы выполняете поиск, ваша запись / коммит в Solr заставляя его загружать свежий диск с диска. Таким образом, он не может позволить любому из своих внутренних кешей нагреться и т. Д., И, как правило, испытывает огромное напряжение.
Надеюсь, это поможет!