# Профилирование запроса

**URL:** <https://discuss.elastic.co/t/topic/123942>\
**Category:** Вопросы на русском языке\
**Created:** [March 14, 2018, 3:54pm UTC](https://discuss.elastic.co/t/topic/123942 "2018-03-14T15:54:10Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [March 14, 2018, 3:54pm UTC](https://discuss.elastic.co/t/topic/123942/1 "2018-03-14T15:54:10Z")

</div>

Доброго времени суток!  
Пропущу предысторию про тормоза )  
В общем, решил понять куда уходит время в запросе.  
Контрольный запрос выполняется за 1,14сек,.  
Запустил его с прифилированием, и получается, что на каждой шарде:  
"Родительский query time" + "rewrite\_time" + "collector time" не превышает 10мс.  
Т.е. даже если последовательно выполнять запрос на каждой шарде до 1,14 секунд очень далеко.  
Как понять куда еще ушло время?

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [March 15, 2018, 12:55am UTC](https://discuss.elastic.co/t/topic/123942/2 "2018-03-15T00:55:49Z")

</div>

Профайлер запросов не всегда хорошо работает, к сожалению. Я обычно пытаюсь запускать запросы по частям - например, убираем все аггрегации, смотрим сколько времени занял запрос, добавляем одну, сравниваем, и т.д.

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [March 16, 2018, 1:02pm UTC](https://discuss.elastic.co/t/topic/123942/3 "2018-03-16T13:02:52Z")

</div>

Более-менее разобрался... Пришлось теорию почитать. Ведь читал, но забыл. 🙂  
[https://www.elastic.co/guide/en/elasticsearch/guide/current/\_query\_phase.html](https://www.elastic.co/guide/en/elasticsearch/guide/current/_query_phase.html)  
Поиск осуществляется в две фазы, собственно поиск и получение документов.  
Я сдампил трафик и сопоставил его с полученным профилем (по последней ответившей шарде).  
Получается, что в профиль поиска по шарде попадет только непосредственно поиск.  
_ **query.time+rewrite\_time+collector.time+agregations.time.** _  
Поднятие документов с диска сюда не входит, что собственно логично, хотя и можно было бы и отразить.

_1521195638.920560 - Начало запроса_  
_1521195638.920597 - последний пакет с запросом_

_1521195638.921435 - indices:data/read/search[phase/query]_  
_1521195638.941408 - начало ответа шарды_  
_1521195638.941888 - конец ответа_

_1521195638.973933 - indices:data/read/search[phase/fetch/id]_  
_1521195639.337249 - начало ответа шарды_  
_1521195641.282545 - конец ответа шарды_

_1521195641.283771 - Начало ответа_  
_1521195641.363141 - Весь ответ получен_

**Весь запрос (От начала запроса до начала ответа): 2.36321115494**  
От получения запроса до запроса на дата-ноды: 0.000838041305542

**Фаза поиска:**  
Запросы ушли на все ноды в течение: 0.00032901763916 сек.  
**Поиск за: 0.0199728012085 сек \<-- Только это попадает в профиль**  
Вся фаза: 0.0204529762268

Между фазами: 0.0320448875427 сек

**Фаза получения:**  
Все fetch запросы ушли за: 0.000550031661987 сек.  
От запроса до ответа: 0.363316059113  
**Вся фаза подъема: 2.30861210823 \<- Не попадает в профилировщик**

Получается, что дольше всего я отдаю сами документы.  
Насколько критично, что один индекс 40 млн документов 700Г (без реплики)?  
Может пора резать?  
P.S. Вопрос именно про поиск, складываю медленно, но верно )

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [March 16, 2018, 2:43pm UTC](https://discuss.elastic.co/t/topic/123942/4 "2018-03-16T14:43:04Z")

</div>

А что вы получаете в этом запросе?

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [March 16, 2018, 2:59pm UTC](https://discuss.elastic.co/t/topic/123942/5 "2018-03-16T14:59:15Z")

</div>

Грубо говоря - это реестр документов.  
Соответственно два индексируемых поля:

- Имя документа
- Тело документа,

И несколько не индексируемых:

- Пользователь
- Родительский документ
- Права

Запрос возвращает список: UUID'ы с именем и свойствами. т.е. без тела.  
Правда полотенце получается иногда на пару мегабайт.

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [March 16, 2018, 8:12pm UTC](https://discuss.elastic.co/t/topic/123942/6 "2018-03-16T20:12:20Z")

</div>

Меня больше инетересовало, сколько документов вы возвращаете назад, от куда поля беруться (\_source, doc\_values, stored fields) и какое отношение размеров uuid относительно размера всего документа.

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [March 20, 2018, 3:18pm UTC](https://discuss.elastic.co/t/topic/123942/7 "2018-03-20T15:18:27Z")

</div>

Пропустил ответ(  
В общем, \_source, doc\_values, stored fields - используются с дефолтными настройками (если используются). Соотношение получается 3500 хитов в 8 мегабайтовой json-ине.

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [March 21, 2018, 2:11pm UTC](https://discuss.elastic.co/t/topic/123942/8 "2018-03-21T14:11:08Z")

</div>

> Соотношение получается 3500 хитов в 8 мегабайтовой json-ине.

Это вы про вывод или исходный документ? Я просто к тому, что если вы только одно получаете, то может иметь смысл хранить это поле с doc values и вытаскивать его из doc values вместо \_source

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [March 21, 2018, 2:32pm UTC](https://discuss.elastic.co/t/topic/123942/9 "2018-03-21T14:32:33Z")

</div>

Это выдача поиска - список подходящих документов. Каждый элемент: UUID документа, имя документа и список не индексируемых свойств (владельцы,иерархия и т.п.). вот этот список получается достаточно объемный.  
Конечно от запроса зависит. Тут я специально искал слово которое часто встречается, чтобы увеличить время для замера. Сами документы - всякие текстовые документы в среднем около 16К.

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [March 21, 2018, 3:00pm UTC](https://discuss.elastic.co/t/topic/123942/10 "2018-03-21T15:00:17Z")

</div>

16K - это не так много, поэтому будет ли результат сказать сложно. А вы не могли бы запустить [hot\_threads](https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-nodes-hot-threads.html) пока запрос работатет (а еще лучше если несколько запросов работают паралельно и запустить hot\_threads несколько раз). Было бы интересно посмотреть, где застревает.

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [March 21, 2018, 4:26pm UTC](https://discuss.elastic.co/t/topic/123942/11 "2018-03-21T16:26:52Z")

</div>

Вот в 10 параллельных запросов бомблю: [https://pastebin.com/byCgnNLU](https://pastebin.com/byCgnNLU)

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [March 21, 2018, 6:12pm UTC](https://discuss.elastic.co/t/topic/123942/12 "2018-03-21T18:12:00Z")

</div>

Да, похоже, что все время тратиться на то, чтобы загрузить и парсить source. Я думаю, что имеет смысл попробовать хранить данные, которые вам нужны в большом количестве отдельно как stored fields или docvalues.

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [March 21, 2018, 6:24pm UTC](https://discuss.elastic.co/t/topic/123942/13 "2018-03-21T18:24:03Z")

</div>

индекс на много вырастет?

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [March 21, 2018, 7:39pm UTC](https://discuss.elastic.co/t/topic/123942/14 "2018-03-21T19:39:39Z")

</div>

Если у вас эти поля проиндексированы как keyword, то у вас уже должны быть docvalues. Если нет - то все зависит от размера и разношерстности данных. Экспериментировать надо.

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [March 21, 2018, 7:52pm UTC](https://discuss.elastic.co/t/topic/123942/15 "2018-03-21T19:52:48Z")

</div>

Ok. Спасибо большое. Последний вопрос, стоит заморачиваться с раздельными алиасами для индексации и посика?

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [March 21, 2018, 10:44pm UTC](https://discuss.elastic.co/t/topic/123942/16 "2018-03-21T22:44:29Z")

</div>

Раздельные алиасы полезны при переиндексации данных на лету (без остановки поиска, например). Я не знаю вашу ситуацию, поэтому затрудняюсь сказать будет ли вам они полезны или нет.

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [March 22, 2018, 10:39am UTC](https://discuss.elastic.co/t/topic/123942/17 "2018-03-22T10:39:14Z")

</div>

Я то больше интересовался в плане производительности.  
Т.е. каджый месяц я делаю новый индекс и меняю алиасы:  
index\_alias -\> docs-2018-05  
search\_alias -\> docs\*

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [March 22, 2018, 1:35pm UTC](https://discuss.elastic.co/t/topic/123942/18 "2018-03-22T13:35:46Z")

</div>

На производительность алиасы сами по себе никак не влияют. Создание нового индекса каждый месяц - влиять будет, но как вы к этому индексу обращаться будете - через алиас или напрямую по имени, особого значения для производительности не имеет, алиасы - они просто для удобства.

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [March 22, 2018, 1:55pm UTC](https://discuss.elastic.co/t/topic/123942/19 "2018-03-22T13:55:47Z")

</div>

Я думаю, что бесконечно индексы не могут расти и оперировать гигантскими сегментами будет сложнее и сложнее.

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [April 19, 2018, 1:55pm UTC](https://discuss.elastic.co/t/topic/123942/20 "2018-04-19T13:55:59Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
