タスクキューのバックログ

バックログのあるタスクキューは、タスクの完了を妨げ、クラスターを不健康な状態にする可能性があります。リソースの制約、一度にトリガーされるタスクの数が多いこと、長時間実行されるタスクがすべて、バックログのあるタスクキューに寄与する可能性があります。

タスクキューのバックログを診断する

スレッドプールの状態を確認する

枯渇したスレッドプールは、拒否されたリクエストを引き起こす可能性があります。

スレッドプールの枯渇は、特定のdata tierに制限される場合があります。ホットスポッティングが発生している場合、あるノードは他のノードよりも早く枯渇し、パフォーマンスの問題やタスクのバックログの増加を引き起こす可能性があります。

cat thread pool APIを使用して、各スレッドプールのアクティブなスレッドの数、キューにあるタスクの数、拒否されたタスクの数、完了したタスクの数を確認できます。

Python

  1. resp = client.cat.thread_pool(
  2. v=True,
  3. s="t,n",
  4. h="type,name,node_name,active,queue,rejected,completed",
  5. )
  6. print(resp)

Ruby

  1. response = client.cat.thread_pool(
  2. v: true,
  3. s: 't,n',
  4. h: 'type,name,node_name,active,queue,rejected,completed'
  5. )
  6. puts response

Js

  1. const response = await client.cat.threadPool({
  2. v: "true",
  3. s: "t,n",
  4. h: "type,name,node_name,active,queue,rejected,completed",
  5. });
  6. console.log(response);

Console

  1. GET /_cat/thread_pool?v&s=t,n&h=type,name,node_name,active,queue,rejected,completed
  1. **各ノードのホットスレッドを検査する**
  2. 特定のスレッドプールキューがバックアップされている場合、[Nodes hot threads](/read/elasticsearch-8-15/7640099fe2267892.md) APIを定期的にポーリングして、スレッドが進行するのに十分なリソースを持っているかどうかを判断し、どれだけ早く進行しているかを測定できます。
  3. #### Python
  4. ``````python
  5. resp = client.nodes.hot_threads()
  6. print(resp)
  7. `

Ruby

  1. response = client.nodes.hot_threads
  2. puts response

Js

  1. const response = await client.nodes.hotThreads();
  2. console.log(response);

Console

  1. GET /_nodes/hot_threads

長時間実行されるノードタスクを探す

長時間実行されるタスクもバックログを引き起こす可能性があります。タスク管理 APIを使用して、実行中のノードタスクに関する情報を取得できます。running_time_in_nanosを確認して、完了に過剰な時間がかかっているタスクを特定します。

Python

  1. resp = client.tasks.list(
  2. pretty=True,
  3. human=True,
  4. detailed=True,
  5. )
  6. print(resp)

Js

  1. const response = await client.tasks.list({
  2. pretty: "true",
  3. human: "true",
  4. detailed: "true",
  5. });
  6. console.log(response);

Console

  1. GET /_tasks?pretty=true&human=true&detailed=true

特定のactionが疑われる場合、タスクをさらにフィルタリングできます。最も一般的な長時間実行されるタスクは、バルクインデックスまたは検索関連です。

Python

  1. resp = client.tasks.list(
  2. human=True,
  3. detailed=True,
  4. actions="indices:data/write/bulk",
  5. )
  6. print(resp)

Js

  1. const response = await client.tasks.list({
  2. human: "true",
  3. detailed: "true",
  4. actions: "indices:data/write/bulk",
  5. });
  6. console.log(response);

Console

  1. GET /_tasks?human&detailed&actions=indices:data/write/bulk
  • 検索アクションをフィルタリング:

Python

  1. resp = client.tasks.list(
  2. human=True,
  3. detailed=True,
  4. actions="indices:data/write/search",
  5. )
  6. print(resp)

Js

  1. const response = await client.tasks.list({
  2. human: "true",
  3. detailed: "true",
  4. actions: "indices:data/write/search",
  5. });
  6. console.log(response);

Console

  1. GET /_tasks?human&detailed&actions=indices:data/write/search

APIの応答には、descriptionheaderなどの追加のタスク列が含まれている場合があります。これにより、タスクのパラメータ、ターゲット、およびリクエスターが提供されます。この情報を使用して、さらに診断を行うことができます。

長時間実行されるクラスタータスクを探す

タスクのバックログは、クラスター状態の同期の遅延としても現れる可能性があります。クラスター保留タスクAPIを使用して、実行中の保留中のクラスター状態同期タスクに関する情報を取得できます。

Python

  1. resp = client.cluster.pending_tasks()
  2. print(resp)

Js

  1. const response = await client.cluster.pendingTasks();
  2. console.log(response);

Console

  1. GET /_cluster/pending_tasks

timeInQueueを確認して、完了に過剰な時間がかかっているタスクを特定します。

タスクキューのバックログを解決する

利用可能なリソースを増やす

タスクが遅く進行し、キューがバックアップされている場合、CPU使用率を削減するための手段を講じる必要があるかもしれません。

場合によっては、スレッドプールのサイズを増やすことが役立つかもしれません。たとえば、force_mergeスレッドプールはデフォルトで1つのスレッドです。サイズを2に増やすことで、強制マージリクエストのバックログを減らすのに役立つかもしれません。

スタックしたタスクをキャンセルする

アクティブなタスクのホットスレッドが進行しておらず、バックログがある場合は、タスクをキャンセルすることを検討してください。