# Помогите трактовать heapdump

**URL:** <https://discuss.elastic.co/t/heapdump/73191>\
**Category:** Вопросы на русском языке\
**Created:** [January 30, 2017, 10:48am UTC](https://discuss.elastic.co/t/heapdump/73191 "2017-01-30T10:48:13Z")\
**Posts on this page:** 18\
**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:** [January 30, 2017, 10:48am UTC](https://discuss.elastic.co/t/heapdump/73191/1 "2017-01-30T10:48:13Z")

</div>

Доброго времени суток!  
Имею следующую проблемму - постепенно полностью выедается куча.  
GC начинает безустанно трудистя и собственно всё плохо.  
Пробовал делать 8ГБ кучу - всё равно не хватает.  
Теперь пытаюсь понять, что собвенно выедает её.  
Снал дамп, скормил его Memory Analizer-у, но не очень его понимаю.  
Поэтому прошу помощи:

1. массив чаров - это общий буфер или один документ? Судя по содержимому, либо не один документ, либо мне присылают ерунду.
2. В дереве, по два раза указан и SnowballFilter и WordDelimiterFilter - это одно и тоже или складывать надо?
3. Если первое - это один документ, то получается что WordDelimiter побил мне его на \>40млн. токенов? (org.apache.lucene.util.AttributeSource$State) и собтвенно сюда ушла куча.

 ![](https://us1.discourse-cdn.com/elastic/original/2X/d/d53dad95e403d7e0d8dedc6ca59c9a5f23b247f5.png)

---

<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:** [January 30, 2017, 2:51pm UTC](https://discuss.elastic.co/t/heapdump/73191/2 "2017-01-30T14:51:06Z")

</div>

А версия Elasticsearch какая?

Вы не могли бы раскрыть `AttributeSource$State` и прислать еще одну картинку?

Можно посмотреть на mappings и settings?

Вы параметры thread pool для bulk или index меняли?

---

<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:** [January 30, 2017, 7:29pm UTC](https://discuss.elastic.co/t/heapdump/73191/3 "2017-01-30T19:29:16Z")

</div>

ES 2.4.3  
thread pool - раньше менял, но поведение системы не менялось.  
Поэтому давно всё вернуо по дефолту. Из всех настроек:  
discovery под uniscat и  
bootstrap.mlockall: true  
gateway.recover\_after\_time: 5m  
mapping и settings в личку пошлю.  
Скрин вот такой еще есть:

 ![](https://us1.discourse-cdn.com/elastic/original/2X/5/5dba3ec133328e312286c10d95f3544a2706ab9a.png)  
Если не путаю, в каждом $State : 24 char c каким-либо слово и RefInt.  
Если надо точнее - утром сделаю.

---

<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:** [January 30, 2017, 8:07pm UTC](https://discuss.elastic.co/t/heapdump/73191/4 "2017-01-30T20:07:51Z")

</div>

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

> [@GreenX](#):
>
> Если не путаю, в каждом $State : 24 char c каким-либо слово и RefInt.  
> Если надо точнее - утром сделаю.

Да, было бы хорошо посмотреть на внутренности нескольких $State.

---

<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:** [January 30, 2017, 8:39pm UTC](https://discuss.elastic.co/t/heapdump/73191/5 "2017-01-30T20:39:21Z")

</div>

> [@Igor\_Motov](#):
>
> ... Я не очень понимаю из вашей схемы чем оправдан этот выбор, но мне он кажется очень странным.

Это мне сложно комментировать, т.к. создавал схему не я.  
Мне этот проект недавно передали.  
Опыта у нас мало, возможно перемудрили.  
По большому счету, тут всё просто должно быть: имя файла и его содержимое для поиска.

---

<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:** [January 31, 2017, 6:33am UTC](https://discuss.elastic.co/t/heapdump/73191/6 "2017-01-31T06:33:32Z")

</div>

К сожалению, исходный дамп затёр. Сделал новый, ситуация 1 в 1.  
Только разный размер AttributeSource$State и их количество.  
Тут более 9 миллиона штук.

 ![](https://us1.discourse-cdn.com/elastic/original/2X/2/2630eb51f24286a47d41f588585f460d52c45edb.png)

P.S. Тут видимо еще наш конвертер глючит - DOC -\> TXT.

---

<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:** [January 31, 2017, 4:18pm UTC](https://discuss.elastic.co/t/heapdump/73191/7 "2017-01-31T16:18:28Z")

</div>

Я обсудил эту проблему со знатоком Lucene. Он сказал, что проблема, действительно, в использовании keyword tokenizer на очень больших полях. Я думаю, если вы его замените на `standard` то проблема с памятью должна исчезнуть. Однако для этого все данные надо будет переиндексировать.

---

<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:** [January 31, 2017, 7:46pm UTC](https://discuss.elastic.co/t/heapdump/73191/8 "2017-01-31T19:46:27Z")

</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:** [January 31, 2017, 7:55pm UTC](https://discuss.elastic.co/t/heapdump/73191/9 "2017-01-31T19:55:50Z")

</div>

> [@GreenX](#):
>
> Насколько я понимаю, это можно сделать достаточно прозрачно через алиас и реиндекс?

Прозрачно для поиска - да, но индексацию на это время надо будет прекратить.

> [@GreenX](#):
>
> а на первый мой вопрос точного ответа нет?

Это какой вопрос? Почему в буфере токены вроде "учреждениягрузополучателя" появляются? Судя по вашему меппингу это, скорее всего ваш конвертер "-" между словами убивает. Это очень просто проверить - поищите по этому словосочетанию и посмотрите какой документ был послан.

---

<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:** [January 31, 2017, 8:47pm UTC](https://discuss.elastic.co/t/heapdump/73191/10 "2017-01-31T20:47:57Z")

</div>

Не, на самый первый. Грубо говоря, что за 70-ти метровый char?

---

<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:** [January 31, 2017, 9:49pm UTC](https://discuss.elastic.co/t/heapdump/73191/11 "2017-01-31T21:49:24Z")

</div>

Это как раз токен, который KeywordTokenizer создал для поля целиком. То есть у вас где-то был документ, в котором одно из полей было 77М. Эти буферы кэшируются на уровне thread local, поэтому даже после того, как такой документ обработан - память все-равно занята. Это как-раз причина по которой я рекомендовал перейти на StandardTokenizer.

---

<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:** [February 1, 2017, 5:43pm UTC](https://discuss.elastic.co/t/heapdump/73191/12 "2017-02-01T17:43:11Z")

</div>

Не срастается у меня в голове: keyword tokenaizer - ладно, ну выжрал 77 метра. Но по аналайзеру то выходит, что больше съел AttributeSource$State. Что это?

---

<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:** [February 2, 2017, 4:23pm UTC](https://discuss.elastic.co/t/heapdump/73191/13 "2017-02-02T16:23:45Z")

</div>

Анализатор работает с каждым токеном произведенным токенизатором в цикле. Как только он с первым токеном разобрался, он его освобождает и переходит к следующему. Это работает хорошо с маленькими строками или когда используется стандартный токенизатор, который откусывает по маленькому токену за раз. Токенизатор кeyword откусывает все сразу и потом сует этот огромный кусок в фильтр word\_delimeter. Этот фильтр работает со всей строкой целиком с создает все токены для этой строки и держит их все в памяти до тех пор пока все не будет обработано. Токены эти гораздо больше чем исходная строка, потому что они содержат копию строки + дополнительные атрибуты (тип токена, положение токена в исходной строке, порядковый номер и т. д.). И это происходит на каждом треде из пула индексации.

---

<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:** [February 6, 2017, 5:39pm UTC](https://discuss.elastic.co/t/heapdump/73191/14 "2017-02-06T17:39:00Z")

</div>

> [@Igor\_Motov](#):
>
> > [@GreenX](#):
> >
> > Насколько я понимаю, это можно сделать достаточно прозрачно через алиас и реиндекс?
> 
> Прозрачно для поиска - да, но индексацию на это время надо будет прекратить. .

Вот тут еще не понял. При реиндексе нельзя писать в новый индекс пока он не закончится reindex?

---

<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:** [February 6, 2017, 6:07pm UTC](https://discuss.elastic.co/t/heapdump/73191/15 "2017-02-06T18:07:16Z")

</div>

> [@GreenX](#):
>
> Вот тут еще не понял. При реиндексе нельзя писать в новый индекс пока он не закончится reindex?

Можно, но нужно быть осторожным с установками reindex и с версиями записей которые добавляются в новый индекс. Есть несколько вариантов, в зависимости от того, как записи добавляются. У вас только новые записи всегда добавляются, или существующие записи будут обновляться во время ре-индексации?

---

<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:** [February 6, 2017, 6:19pm UTC](https://discuss.elastic.co/t/heapdump/73191/16 "2017-02-06T18:19:50Z")

</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:** [February 6, 2017, 7:24pm UTC](https://discuss.elastic.co/t/heapdump/73191/17 "2017-02-06T19:24:14Z")

</div>

Тут две проблемы - 1. не затереть новую версию старой и 2. куда писать обновленную запись, что бы ее можно было сразу найти и потом не потерять? Первую проблему можно решить установкой `"conflicts": "proceed"` и `"op_type": "create"`. Пример можно найти в [документации](https://www.elastic.co/guide/en/elasticsearch/reference/5.2/docs-reindex.html). Вторую проблему решить сложнее. Самый просто способ - во время ре-индексирования читать всегда из старого индекса, а писать все записи и в старый и в новый индексы.

---

<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:** [March 6, 2017, 7:24pm UTC](https://discuss.elastic.co/t/heapdump/73191/18 "2017-03-06T19:24:14Z")

</div>

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