Высокое использование ЦП
Elasticsearch использует пулы потоков для управления ресурсами ЦП при одновременных операциях. Высокое использование ЦП, как правило, означает, что один или несколько пулов потоков работают с низким уровнем ресурсов.
Если пул потоков исчерпан, Elasticsearch будет отклонять запросы, связанные с этим пулом потоков. Например, если пул потоков search исчерпан, Elasticsearch будет отклонять запросы поиска, пока не станет доступно больше потоков.
Высокое использование ЦП может наблюдаться, если уровень данных, а следовательно, и узлы, назначенные этому уровню, испытывают больший трафик, чем другие уровни. Такое неравномерное использование ресурсов также известно как узкое место.
Диагностика высокого использования ЦП
Проверка использования ЦП
Вы можете проверить использование ЦП на каждом узле с помощью API cat nodes:
resp = client.cat.nodes(
v=True,
s="cpu:desc",
)
print(resp) response = client.cat.nodes( v: true, s: 'cpu:desc' ) puts response
const response = await client.cat.nodes({
v: "true",
s: "cpu:desc",
});
console.log(response); GET _cat/nodes?v=true&s=cpu:desc
Столбец cpu ответа содержит текущее использование ЦП в процентах. Столбец name содержит имя узла. Повышенное, но кратковременное использование ЦП является нормальным. Однако если использование ЦП повышено в течение длительного времени, это необходимо расследовать.
Для отслеживания использования ЦП во времени рекомендуется включить мониторинг:
-
(Рекомендуется) Включить журналы и метрики. При включенных журналах и метриках информация о мониторинге отображается на странице Мониторинга стека Kibana.
Вы также можете включить оповещение по порогу использования ЦП, чтобы получать уведомления о потенциальных проблемах по электронной почте.
-
В меню развертывания перейдите на страницу Производительность. На этой странице вы можете просмотреть две ключевые метрики:
- Использование ЦП: Использование ЦП вашего развертывания, представленное в процентах.
- Кредиты ЦП: Остаток кредитов ЦП, измеряемый во временных единицах использования ЦП.
Сервис Elasticsearch предоставляет кредит ЦП на каждое развертывание, чтобы предоставить небольшим кластерам повышение производительности при необходимости. Высокое использование ЦП может истощить эти кредиты, что может привести к снижению производительности и увеличению времени отклика кластера.
-
Включите мониторинг Elasticsearch. При включенных журналах и метриках информация о мониторинге отображается на странице Мониторинга стека Kibana.
Вы также можете включить оповещение по порогу использования ЦП, чтобы получать уведомления о потенциальных проблемах по электронной почте.
Проверка «горячих» потоков
Если у узла высокое использование ЦП, используйте API узлов «горячие» потоки для проверки ресурсоемких потоков, работающих на узле.
resp = client.nodes.hot_threads() print(resp)
const response = await client.nodes.hotThreads(); console.log(response);
GET _nodes/hot_threads
Этот API возвращает подробную информацию о любых «горячих» потоках в виде обычного текста. Высокое использование ЦП часто коррелирует с долго выполняемой задачей или очередью задач.
Сокращение использования ЦП
Следующие советы описывают наиболее распространенные причины высокого использования ЦП и их решения.
Масштабирование кластера
Высокая нагрузка индексирования и поиска может исчерпать ресурсы меньших пулов потоков. Для лучшего управления высокой нагрузкой добавьте больше узлов в свой кластер или модернизируйте существующие узлы для повышения емкости.
Распределение запросов Bulk
Хотя они эффективнее отдельных запросов, большие Bulk запросы индексирования или многократные запросы поиска по-прежнему требуют ресурсов ЦП. Если возможно, отправляйте меньшие запросы и делайте больше времени между ними.
Отмена длительно выполняемых запросов поиска
Длительно выполняемые запросы поиска могут блокировать потоки в пуле потоков search. Для проверки таких запросов используйте API управления задачами.
resp = client.tasks.list(
actions="*search",
detailed=True,
)
print(resp) response = client.tasks.list( actions: '*search', detailed: true ) puts response
const response = await client.tasks.list({
actions: "*search",
detailed: "true",
});
console.log(response); GET _tasks?actions=*search&detailed
В ответе столбец description содержит запрос поиска и его запросы. running_time_in_nanos показывает, как долго запрос поиска выполнялся.
{
"nodes" : {
"oTUltX4IQMOUUVeiohTt8A" : {
"name" : "my-node",
"transport_address" : "127.0.0.1:9300",
"host" : "127.0.0.1",
"ip" : "127.0.0.1:9300",
"tasks" : {
"oTUltX4IQMOUUVeiohTt8A:464" : {
"node" : "oTUltX4IQMOUUVeiohTt8A",
"id" : 464,
"type" : "transport",
"action" : "indices:data/read/search",
"description" : "indices[my-index], search_type[QUERY_THEN_FETCH], source[{\"query\":...}]",
"start_time_in_millis" : 4081771730000,
"running_time_in_nanos" : 13991383,
"cancellable" : true
}
}
}
}
} Для отмены поиска и освобождения ресурсов используйте конечную точку API _cancel.
resp = client.tasks.cancel(
task_id="oTUltX4IQMOUUVeiohTt8A:464",
)
print(resp) response = client.tasks.cancel( task_id: 'oTUltX4IQMOUUVeiohTt8A:464' ) puts response
const response = await client.tasks.cancel({
task_id: "oTUltX4IQMOUUVeiohTt8A:464",
});
console.log(response); POST _tasks/oTUltX4IQMOUUVeiohTt8A:464/_cancel
Дополнительные советы по отслеживанию и предотвращению ресурсоемких запросов поиска см. в разделе Избегайте дорогостоящих запросов поиска.
© 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-cpu-usage.html