CPU 使用率过高
编辑CPU 使用率过高
编辑Elasticsearch 使用线程池来管理并发操作的 CPU 资源。CPU 使用率过高通常意味着一个或多个线程池的资源不足。
如果线程池耗尽,Elasticsearch 将拒绝与该线程池相关的请求。例如,如果 search
线程池耗尽,Elasticsearch 将拒绝搜索请求,直到有更多线程可用。
如果一个数据层,以及分配给该层的节点,的流量高于其他层,您可能会遇到 CPU 使用率过高的情况。这种资源利用不平衡也称为热点。
诊断 CPU 使用率过高
编辑检查 CPU 使用率
您可以使用 cat nodes API 检查每个节点的 CPU 使用率。
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
列包含当前 CPU 使用率(以百分比表示)。name
列包含节点的名称。短暂的 CPU 使用率升高是正常的。但是,如果 CPU 使用率长时间升高,则应进行调查。
为了跟踪一段时间内的 CPU 使用率,我们建议启用监控
-
(推荐)启用日志和指标。启用日志和指标后,监控信息可在 Kibana 的堆栈监控页面上查看。
您还可以启用CPU 使用率阈值警报,以便通过电子邮件收到有关潜在问题的通知。
-
从您的部署菜单中,查看性能页面。在此页面上,您可以查看两个关键指标
- CPU 使用率:您的部署的 CPU 使用率,以百分比表示。
- CPU 积分:您剩余的 CPU 积分,以 CPU 时间秒数衡量。
Elasticsearch Service 为每个部署授予CPU 积分,以便在需要时为较小的集群提供性能提升。CPU 使用率过高会耗尽这些积分,这可能会导致性能下降和集群响应时间增加。
-
启用Elasticsearch 监控。启用日志和指标后,监控信息可在 Kibana 的堆栈监控页面上查看。
您还可以启用CPU 使用率阈值警报,以便通过电子邮件收到有关潜在问题的通知。
检查热线程
如果节点 CPU 使用率过高,请使用nodes hot threads API检查节点上运行的资源密集型线程。
resp = client.nodes.hot_threads() print(resp)
const response = await client.nodes.hotThreads(); console.log(response);
GET _nodes/hot_threads
此 API 以纯文本形式返回任何热线程的详细信息。CPU 使用率过高通常与长时间运行的任务或积压的任务相关。
降低 CPU 使用率
编辑以下提示概述了导致 CPU 使用率过高的最常见原因及其解决方案。
扩展您的集群
繁重的索引和搜索负载会耗尽较小的线程池。为了更好地处理繁重的工作负载,请向集群添加更多节点或升级现有节点以增加容量。
分散批量请求
虽然比单个请求更有效率,但大型批量索引或多搜索请求仍然需要 CPU 资源。如果可能,请提交较小的请求,并留出更多的时间间隔。
取消长时间运行的搜索
长时间运行的搜索会阻塞 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
有关如何跟踪和避免资源密集型搜索的其他提示,请参阅避免昂贵的搜索。