К основному контенту

Weblogic Diagnostic Framework Run Bash Script (reboot managed server) - (bad practices)

Вообщем переодически сервер дохнет по: The WebLogic Server encountered a critical failure java.lang.OutOfMemoryError: Metaspace Reason: There is a panic condition in the server. The server is configured to exit on panic И хотя это гавно пишет типа  Reason: There is a panic condition in the server. The server is configured to exit on panic чёт ни хуя он ни куда не exit.... Вообщем т.к разбираться с тем чем он жрётся нет ни времени ни желания (оно обязательно появится)... как вариант можно приделать костыль... костыль будет заключаться в ребуте сервера при возникновении этой ошибки. Что значит для этого надо... Желания и понимание что так жить нельзя, и вообще... Делаем новый модуль называем скажем:  Reboot-OOMMetaSpace Идём в в новый модуль делаем Policy: Называем его OOM-Metaspace и говорит что это Server log: Жмём next в Configuration Policy пишем: log.logMessage.contains('java.lang.OutOfMemoryError: Metaspace'...

Elasticsearch segments count, heap usage, and query performance

короче elasticsearch 1.4.2 но возможно пригодится для любого.

Бля ну вообщем пост должен быть был бы если бы...
Короче о другом...
curl -XGET 'http://localhost:9200/_nodes/stats/indices/segments?human&pretty' {
  "cluster_name" : "test",
  "nodes" : {
    "8Pq7sp65RteplAbVTeat8g" : {
      "timestamp" : 1463136778214,
      "name" : "test1",
      "transport_address" : "inet[/123123:9313]",
      "host" : "test1",
      "ip" : [ "inet[/sdfsdf:9313]", "NONE" ],
      "indices" : {
        "segments" : {
          "count" : 699,
          "memory" : "4.5gb",
          "memory_in_bytes" : 4902715254,
          "index_writer_memory" : "0b",
          "index_writer_memory_in_bytes" : 0,
          "index_writer_max_memory" : "815.8mb",
          "index_writer_max_memory_in_bytes" : 855506844,
          "version_map_memory" : "1.2kb",
          "version_map_memory_in_bytes" : 1328,
          "fixed_bit_set" : "63.6mb",
          "fixed_bit_set_memory_in_bytes" : 66745592
        }
      }
    }
  }

}

Чёт как то до хуя получается...
Попробуем уменьшить кол-во сегментов, на шард...
Для начала необходимо выяснить какой индекс имеет больше всех сегментов:
curl --silent 'http://localhost:9200/_cat/segments?v'|awk 'NR!=1 {a[$1]++}END {for (i in a) print i,a[i]}'|sort -k 2 -n
compare 31
catalog_230 33
reglament 37
ssa 47
house_2(mar_23) 96
house_3(apr_6) 104

Итого видим что больше всех сегментов у индекса house_3(apr_6) поэтому начнём с него...
curl -XPOST 'http://localhost:9200/house_3(apr_6)/_optimize?max_num_segments=2' 
 опять же следует обратить внимание что это кол-во на шард!
(тут следует адский процесс...)
мониторить кол-во сегментов можно так же командой
curl --silent 'http://localhost:9200/_cat/segments?v'|awk 'NR!=1 {a[$1]++}END {for (i in a) print i,a[i]}'|sort -k 2 -n)

Заметочка: Если мониторить через kopf размер индекса будет расти по мере merge сегментов. Т.к. kopf похоже так же суммируется еще не доступный для поиска сегмент в который происходит merge.




Походу выполнения можно добавить настройки:
indices.store.throttle.type: none - индексировать на столько быстро насколько позволяет диск
indices.store.throttle.max_bytes_per_sec: 100mb - или ограничить

Вообщем то так же можно посмотреть сколько занимает в памяти каждый сегмент ну и прочую херню по нему:
curl -XGET 'http://localhost:9201/test/_segments?verbose=true'

Отсортировать по самым сожравшим память сегментам:
curl --silent 'http://localhost:9201/_cat/segments?v'|sort -k 10 -n

Суммарно по каждому индексу сколько сегменты отъели в памяти:
curl --silent 'http://test1:9244/_cat/segments?v'|awk '/10.64.191.71/ {a[$1]++;b[$1]=b[$1]+$10} END {for (i in a) {print i,a[i],b[i]/1024/1024}}'|sort -k 3 -n

Тут вообщем то всё просто в awk мы передаём IP нашей тачки, если у нас 2 ноды то IP той ноды на которой мы хотим посмотреть сколько занимают сегменты в памяти.
(на хуя всё это делать если можно посмотреть это в шардах ну да ладно).

Ну да хуй с ним едем дальше....

Часть 2. query performance


Эластику дано 32гига оперативки (серверов всего 4 соответственно у индекса 3 реплики).
Есть индекс типа catalog_1056. По нему гоняется запрос кучей фильтров
(запрос огромный так что я даже не буду сюда его копировать).
Как же работает кэш, запросы и реплики и т.д. ( а оговоримся что у нас какай то ебанутая версия с собственными пачами, но хуй его знает что там , мб оно и не влияет).

Смотрим как дела с кэшем
curl -XGET 'http://localhost:9201/_cat/indices/catalog_1056?h=i,docs.count,docs.deleted,fielddata.memory_size,filter_cache.memory_size,segments.count'
catalog_1056 12871645 3380630 0b 0b 83
 

Нас тут интересует последние 4 цифры, это  размер fielddata cache, filter cache и кол-во сегментов

Посмотрим туже херню по shard:
curl --silent 'http://localhost:9201/_cat/shards/catalog_1056?h=index,shard,prirep,node,fielddata.memory_size,filter_cache.memory_size'
catalog_1056 0 r ESM1 0b     0b
catalog_1056 0 p ESM3 0b    0b
catalog_1056 0 r ESM4 0b     0b
catalog_1056 0 r ESM2 0b     0b

Как мы видим всё пусто нет ни fielddata cache, ни filtercache.

1. Первый запрос.

{ "took": 12286, "timed_out": false, "_shards": { "total": 1, "successful": 1, "failed": 0 },

catalog_1056 0 r ESM1 90mb 12.3mb
catalog_1056 0 p ESM3     0b     0b
catalog_1056 0 r ESM4     0b     0b
catalog_1056 0 r ESM2     0b     0b

2. Второй запрос

"took": 16582, "timed_out": false, "_shards": { "total": 1, "successful": 1, "failed": 0 }

catalog_1056 0 r ESM1   90mb 12.3mb
catalog_1056 0 p ESM3 80.8mb   11mb
catalog_1056 0 r ESM4     0b     0b
catalog_1056 0 r ESM2     0b     0b

3. Третий запрос
"took": 8906, "timed_out": false, "_shards": { "total": 1, "successful": 1, "failed": 0 },

catalog_1056 0 r ESM1   90mb 12.3mb
catalog_1056 0 p ESM3 80.8mb   11mb
catalog_1056 0 r ESM4  102mb 12.7mb
catalog_1056 0 r ESM2     0b     0b

 

4. Четвертый запрос

"took": 6841, "timed_out": false, "_shards": { "total": 1, "successful": 1, "failed": 0 },

catalog_1056 0 r ESM1   90mb 12.3mb
catalog_1056 0 p ESM3 80.8mb   11mb
catalog_1056 0 r ESM4  102mb 12.7mb
catalog_1056 0 r ESM2 89.3mb 11.8mb

5. Пятый запрос Тут кэши на всех шардах заполнились и ура всё заработало.

"took": 1391, "timed_out": false, "_shards": { "total": 1, "successful": 1, "failed": 0   

Итого как мы видим, запрос отправляется не на все шарды, на один конкретный хотя всё запросы были сделаны с одной ноды(которая как говорит дока становится кординационной т.к мы на неё пуляем запросы). Если мы почистим кэш и выполним еще раз будет обсолютно тоже самое, т.е запрос будет "гулять" по нодам, как утверждает дока round robin.
Забавно но по моим наблюдениям если у вас запрос выдёт:
catalog_1056 0 r ESM1 95.9mb 12.3mb 0 0 0
catalog_1056 0 p ESM3 80.8mb   11mb 0 0 0
catalog_1056 0 r ESM4  102mb 12.7mb 0 0 0
catalog_1056 0 r ESM2 89.3mb 11.8mb 0 0 0
 
То и запрос к этому индексу будет раскидан аналогичным образом т.е:
1 - esm1 - ~1.5s
2 - esm3 - ~0.7s
3 - esm4 - ~1.4s
4 - esm2 - ~0.7s
Хуй знает от чего зависит время ответа, загруженность ноды сеть и т.д не знаю что придумать.

Далее было бы интересно посмотреть влияние кол-ва сегментов на запрос, поэтому не будем чистить кэш (он и сам почистится после merge) и просто выполним 2 команды.
 curl -XPOST 'http://localhost:9201/catalog_1056/_optimize?max_num_segments=1'
(для elastiсsearch 5 это называется force merge).
Выполняем тот же запрос видим  что кэши заполнились:
И сам запрос стал выполняться в разы быстрее:

"took": 2619, "timed_out": false, "_shards": { "total": 1, "successful": 1, "failed": 0 }, - это время при не заполненных кэшах.
curl --silent 'http://localhost:9201/_cat/shards/catalog_1056?h=index,shard,prirep,node,fielddata.memory_size,filter_cache.memory_size,sqc,sfc,gc,dc' 
(тут я добавил 4 поля текущее кол-во quary current, fetch current, get current, кол-во документов).
catalog_1056 0 r ESM1 72.4mb 10.7mb 0 0 0 12871645
catalog_1056 0 p ESM3 72.4mb 10.7mb 0 0 0 12871645
catalog_1056 0 r ESM4 72.4mb 10.7mb 0 0 0 12871645
catalog_1056 0 r ESM2 72.4mb 10.7mb 0 0 0 12871645

 
Блять пизда интернет сдох..... 
Короче после проверки(после того как на всех шардах кэш заполнен) по всем шардам запрос занимает от ~0.4-0.6s!!!
Что само по себе в разы лучше... Тем не менее всё равно долго...
To be continue ... (хотя я хуй знает что можно сделать...) переписать запрос???...

А и тут я придумал что надо проверить... Надо добавить индексу шардов т.е сейчас 1 pri и 3 rep.
Соответственно было бы интересно сделать скажем 2 pri.
Хотя где то была статья что это гавно идея... когда нить продолжу..


Часть 3. Fielddata vs Filtercache(el1.4) (node quary cache el5+)

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

Ну и вообщем то интересно проверить на запросе с кучей фильтром как оно будет жить.

1. Оба кэша "существуют" и считаем что они заполнены (fielddata preload!)

indices.cache.filter.size: 10%
indices.fielddata.cache.size: 40%
indices.breaker.fielddata.limit: 43%

На самом деле насрать какие тут настройки т.к у нас при выполнении запроса кэш заполняется на 80Mb
Выполняем запрос:
                                                      Fielddata Filter
catalog_1056 0 p oracleadmintst  80.8mb    8.7mb 0 0 0 12871645

  "took": 498, "timed_out": false, "_shards": { "total": 1, "successful": 1, "failed": 0 },


2. Вырубаем filter cache:

indices.cache.filter.size: 0
indices.fielddata.cache.size: 60%

indices.breaker.fielddata.limit: 61%


Выполняем запрос:
                                                      Fielddata Filter
catalog_1056 0 p oracleadmintst  80.8mb    0b 0 0 0 12871645

  "took": 703"timed_out": false"_shards": { "total": 1"successful": 1"failed": 0 },

Гавно какой то...
Вообщем следует признать что кэш нужен....


Чёт я еще хотел написать но решил что в пизду... Когда нибудь потом...

curl localhost:9201/_cat/thread_pool?h=host,search.active,search.queue,get.active,get.queue,bulk.active,bulk.queue,index.active,index.queue

Комментарии

  1. Воттутвот http://stackoverflow.com/questions/38757948/optimizing-elasticsearch-for-parallel-queries
    в каментах рассуждают, что параллелить запрос надо количеством шардов. (репоиками организовывают отказоустойчивость).
    Можно проверить по твоей мтодологии. Сделать запрос и смотреть не кэши.

    ОтветитьУдалить

Отправить комментарий

Популярные сообщения из этого блога

Weblogic Diagnostic Framework Run Bash Script (reboot managed server) - (bad practices)

Вообщем переодически сервер дохнет по: The WebLogic Server encountered a critical failure java.lang.OutOfMemoryError: Metaspace Reason: There is a panic condition in the server. The server is configured to exit on panic И хотя это гавно пишет типа  Reason: There is a panic condition in the server. The server is configured to exit on panic чёт ни хуя он ни куда не exit.... Вообщем т.к разбираться с тем чем он жрётся нет ни времени ни желания (оно обязательно появится)... как вариант можно приделать костыль... костыль будет заключаться в ребуте сервера при возникновении этой ошибки. Что значит для этого надо... Желания и понимание что так жить нельзя, и вообще... Делаем новый модуль называем скажем:  Reboot-OOMMetaSpace Идём в в новый модуль делаем Policy: Называем его OOM-Metaspace и говорит что это Server log: Жмём next в Configuration Policy пишем: log.logMessage.contains('java.lang.OutOfMemoryError: Metaspace'...

Oracle SOA email notification или какого х.. оно не работает.

От делать нех задокументируем.... Вообщем то всё рассписанно по ссылке: http://www.rubiconred.com/blog/email-notification-with-soa-suite-11g/ Ссылка походу сдохла!!! Придётся на всякий случай записать пока не забыл... Собственно основные настройки делаются на этой странице: Тут будет текст дабы не плодить картинок: MailAccessProtocol : POP3 RetryLimit : -1 MailDelFreq : 600 AutoDelete : not check Debug : not check CheckMailFreq : 30 ReceiveFolder: INBOX OutgoingMailServer :  mail4.ru OutgoingMailServerPort : 25 OutgoingMailServerSecurity : None OutgoingDefaultFromAddr :  pklmn@mail.ru OutgoingPassword: вроде ни чё не трогал... IncomingMailServer: mail3.ru IncomingMailServerPort: 110 IncomingMailServerSSL: not check IncomingMailIDs: pklmn@mail.ru IncomingUserIDs: pklmn IncomingUserPasswords: тут настраиваем пароль При настройке рекомендуется обращать внимания на всплывающие подсказки например: Sender Address должен выглядеть как E...

Backup elasticsearch with curator.

Сжато кратко, в падлу много расписывать... Вообщем пробуем забэкапить elasticsearch 5.0 с помощью curator 4.2 Что имеем: 2 ноды 1) vapp-cn1 2) vapp-cn2 Репозиторий для бэкапа есть на обоих хостах находится в /backup/el_backup/front права для пользователя под который запущен elasticsearch есть, на обоих нодах в конфиге elasticsearch.yml указанно: path.repo: ["/backup/el_backup/front"] Настройка curator, бэкапить будем все индексы поэтому: 1. snapshot-script.yml actions:   1:     action: snapshot     description: >-       Snapshot logstash- prefixed indices older than 1 day (based on index       creation_date) with the default snapshot name pattern of       'curator-%Y%m%d%H%M%S'.  Wait for the snapshot to complete.  Do not skip       the repository filesystem access check.  Use the other options to create       the snapsho...