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

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
    в каментах рассуждают, что параллелить запрос надо количеством шардов. (репоиками организовывают отказоустойчивость).
    Можно проверить по твоей мтодологии. Сделать запрос и смотреть не кэши.

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

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

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

Oracle Cloud Control 12c/13c modify target setup Life Cycle Status (emcli, multiple targets)

https://pardydba.wordpress.com/2012/10/17/how-and-why-you-should-set-target-lifecycle-status-properties-in-em12c/+&cd=1&hl=ru&ct=clnk&gl=ru Итак есть куча таргетов middleware, host и т.д ... Менять руками  LifeCycle Status для всех таргетов внутри middleware это геморой поэтому сделать надо это скриптом. По ссылке выше предлагается это сделать для хостов. Ниже будет описано как это сделать для всех таргетов. В краце инструкция такова: Ставим emcli: oracle@omshost$ export JAVA_HOME=$OMS_HOME/../jdk16/jdk oracle@omshost$ export PATH=$JAVA_HOME/bin:$PATH oracle@omshost$ export ORACLE_HOME=$OMS_HOME oracle@omshost$ cd $ORACLE_HOME oracle@omshost$ mkdir emcli oracle@omshost$ java -jar $ORACLE_HOME/sysman/jlib/emclikit.jar client -install_dir=$ORACLE_HOME/emcli Oracle Enterprise Manager 12c Release 2. Copyright (c) 1996, 2012 Oracle Corporation. All rights reserved. EM CLI client-side install completed successfully. oracle@omshost$ $ORACLE_HOME/emcli/emcli setup -u

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 snapshot.     options:       repository: elbackup       # Leaving name blank will result in the default 

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 должен выглядеть как EMAIL :ptm