Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Устранение неполадок ›Устранение распространённых проблем кластера

Высокая нагрузка на память JVM

Высокое использование памяти JVM может ухудшить производительность кластера и вызвать ошибки защитного механизма. Чтобы предотвратить это, рекомендуем принять меры по снижению нагрузки на память, если использование памяти JVM узла постоянно превышает 85%.

Если вы используете Elastic Cloud Hosted, то можете использовать AutoOps для мониторинга кластера. AutoOps значительно упрощает управление кластером благодаря рекомендациям по производительности, отображению использования ресурсов, обнаружению проблем в реальном времени и путям решения проблем. Для получения дополнительной информации см. Мониторинг с помощью AutoOps.

Диагностика высокой нагрузки на память JVM

Проверка нагрузки на память JVM

В меню развертывания нажмите Elasticsearch. В разделе Instances каждый экземпляр отображает индикатор нагрузки на память JVM. Когда нагрузка на память JVM достигает 75%, индикатор становится красным.

Также можно использовать API узлов статистики для расчета текущей нагрузки на память JVM для каждого узла.

resp = client.nodes.stats(
    filter_path="nodes.*.jvm.mem.pools.old",
)
print(resp)
response = client.nodes.stats(
  filter_path: 'nodes.*.jvm.mem.pools.old'
)
puts response
const response = await client.nodes.stats({
  filter_path: "nodes.*.jvm.mem.pools.old",
});
console.log(response);
GET _nodes/stats?filter_path=nodes.*.jvm.mem.pools.old

Используйте ответ для расчета нагрузки на память следующим образом:

Нагрузка на память JVM = used_in_bytes / max_in_bytes

Для расчета текущей нагрузки на память JVM для каждого узла используйте API узлов статистики.

resp = client.nodes.stats(
    filter_path="nodes.*.jvm.mem.pools.old",
)
print(resp)
response = client.nodes.stats(
  filter_path: 'nodes.*.jvm.mem.pools.old'
)
puts response
const response = await client.nodes.stats({
  filter_path: "nodes.*.jvm.mem.pools.old",
});
console.log(response);
GET _nodes/stats?filter_path=nodes.*.jvm.mem.pools.old

Используйте ответ для расчета нагрузки на память следующим образом:

Нагрузка на память JVM = used_in_bytes / max_in_bytes

Проверка журналов сборки мусора

По мере увеличения использования памяти частота сборки мусора возрастает, и она занимает больше времени. Вы можете отслеживать частоту и длительность событий сборки мусора в elasticsearch.log. Например, следующее событие указывает, что Elasticsearch потратил более 50% (21 секунду) из последних 40 секунд на сборку мусора.

[timestamp_short_interval_from_last][INFO ][o.e.m.j.JvmGcMonitorService] [node_id] [gc][number] overhead, spent [21s] collecting in the last [40s]

Сохранение дампа кучи JVM

Чтобы определить точную причину высокой нагрузки на память JVM, сохраните дамп кучи JVM во время высокой нагрузки на память, а также сохраните журналы сборщика мусора за тот же период времени.

Снижение нагрузки на память JVM

Этот раздел содержит некоторые общие рекомендации по снижению нагрузки на память JVM.

Уменьшение количества фрагментов

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

Избегайте ресурсоёмких запросов

Ресурсоёмкие запросы могут использовать большое количество памяти. Для лучшего отслеживания ресурсоёмких запросов в кластере включите медленные журналы.

Ресурсоёмкие запросы могут иметь большой size аргумент, использовать агрегации с большим количеством корзинок или включать ресурсоёмкие запросы. Для предотвращения ресурсоёмких запросов рассмотрите следующие изменения настроек:

  • Уменьшите предел size, используя настройку индекса index.max_result_window.
  • Уменьшите максимальное количество разрешённых корзин агрегаций, используя кластерную настройку search.max_buckets.
  • Отключите ресурсоёмкие запросы, используя кластерную настройку search.allow_expensive_queries.
  • Установите значение по умолчанию для таймаута поиска, используя кластерную настройку search.default_search_timeout.
resp = client.indices.put_settings(
    settings={
        "index.max_result_window": 5000
    },
)
print(resp)

resp1 = client.cluster.put_settings(
    persistent={
        "search.max_buckets": 20000,
        "search.allow_expensive_queries": False
    },
)
print(resp1)
response = client.indices.put_settings(
  body: {
    'index.max_result_window' => 5000
  }
)
puts response

response = client.cluster.put_settings(
  body: {
    persistent: {
      'search.max_buckets' => 20_000,
      'search.allow_expensive_queries' => false
    }
  }
)
puts response
const response = await client.indices.putSettings({
  settings: {
    "index.max_result_window": 5000,
  },
});
console.log(response);

const response1 = await client.cluster.putSettings({
  persistent: {
    "search.max_buckets": 20000,
    "search.allow_expensive_queries": false,
  },
});
console.log(response1);
PUT _settings
{
  "index.max_result_window": 5000
}

PUT _cluster/settings
{
  "persistent": {
    "search.max_buckets": 20000,
    "search.allow_expensive_queries": false
  }
}

Предотвращение взрыва карты

Определение слишком большого количества полей или слишком глубокое вложение полей может привести к взрыву карты, использующей большое количество памяти. Чтобы предотвратить взрыв карты, используйте настройки лимитов карты для ограничения количества сопоставлений полей.

Распределяйте запросы bulk

Хотя они более эффективны, чем отдельные запросы, большие bulk операции индексирования или multi-search запросы всё ещё могут привести к высокой нагрузке на память JVM. Если возможно, отправляйте более мелкие запросы и позволяйте больше времени между ними.

Улучшите память узлов

Большие объемы индексирования и обработки запросов могут вызвать высокую нагрузку на память JVM. Для лучшей обработки больших нагрузок, модернизируйте узлы, чтобы увеличить объём памяти.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/high-jvm-memory-pressure.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API