跳至內容

如何對 OpenSearch Service 叢集 CPU 使用率過高的問題進行疑難排解?

3 分的閱讀內容
0

我的資料節點在 Amazon OpenSearch Service 叢集上顯示 CPU 使用率很高。

簡短描述

若要對叢集 CPU 使用率過高的問題進行疑難排解,請執行下列動作:

  • 使用自動化執行手冊來識別 CPU 使用率過高的原因。
  • 使用異常偵測識別模式。
  • 使用節點熱門執行緒 API 了解您的資源使用情況。
  • 檢查寫入作業或大量 API 執行緒集區。
  • 檢查搜尋執行緒集區。
  • 檢查 Apache Lucene 合併執行緒集區。
  • 檢查 Java 虛擬機器 (JVM) 記憶體壓力。
  • 檢閱您的碎片策略。
  • 擴展叢集。
  • 最佳化您的查詢。

最佳實務是將 CPU 使用率保持在夠低的範圍,以確保 OpenSearch Service 能順利執行其任務。CPU 使用率持續過高的叢集可能會導致效能問題。當叢集過載時,OpenSearch Service 可能無法回應,且您可能會收到請求逾時。

解決方法

使用自動化執行手冊

先決條件:確認您具有執行執行手冊所需的 AWS Identity and Access Management (IAM) 權限。如需詳細資訊,請參閱 AWSSupport-TroubleshootOpenSearchHighCPU 中的所需的 IAM 權限

執行 AWSSupport-TroubleshootOpenSearchHighCPU AWS Systems Manager 自動化執行手冊,以對 OpenSearch Service 的 CPU 使用率過高問題進行疑難排解。

輸出會顯示下列資訊:

  • 熱門執行緒
  • 正在執行的任務
  • 網域中每個節點的執行緒集區統計資料
  • 網域中節點的相關資訊,依其 CPU 使用情況排序
  • 對每個資料節點及其磁碟空間進行碎片分配
  • OpenSearch 服務網域的運作狀態和運作狀態資訊

使用執行手冊的輸出來確定 CPU 使用率過高的原因。

使用異常偵測識別模式

為了在問題造成中斷之前識別潛在風險,請使用 OpenSearch Service 的異常偵測功能,自動偵測 CPU 使用率等指標中的異常模式。如需詳細資訊,請參閱教學課程: 使用異常偵測來偵測高 CPU 使用率

使用節點熱門執行緒 API

如果您的 OpenSearch Service 叢集持續出現 CPU 激增的情況,請執行以下命令以查看叢集中所有節點的資訊:

GET/_nodes/hot_threads

輸出的長度取決於您 OpenSearch Service 叢集中運作的節點數目。如需更多有關節點熱門執行緒 API 的資訊,請參閱 OpenSearch 網站上的節點熱門執行緒 API

輸出範例:

GET _nodes/hot_threads
100.0% (131ms out of 500ms) cpu usage by thread 'opensearch[abc][search][T#62]'
10/10 snapshots sharing following 10
elements sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
java.util.concurrent.LinkedTransferQueue.awaitMatch(LinkedTransferQueue.java:737)

java.util.concurrent.LinkedTransferQueue.xfer(LinkedTransferQueue.java:647)

java.util.concurrent.LinkedTransferQueue.take(LinkedTransferQueue.java:1269)

org.opensearch.common.util.concurrent.SizeBlockingQueue.take(SizeBlockingQueue.java:162)

java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)

java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)

java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)

您也可以使用 CAT 節點 API 查看目前的資源詳細使用情況。若要查看 CPU 使用率最高的節點,請執行以下命令:

GET _cat/nodes?v&s=cpu:desc

輸出中的最後一欄會顯示節點名稱。如需更多有關 CAT 節點 API 的資訊,請參閱 OpenSearch 網站上的 CAT 節點 API

然後,對高 CPU 使用率的節點執行以下命令:

GET _nodes/node_id/hot_threads

**注意:**將 node_id 替換為節點 ID。

輸出會顯示該節點中使用最多 CPU 的 OpenSearch Service 程序。如果在輸出中看到 Apache Lucene 合併執行緒,請參閱檢查 Apache Lucene merge 執行緒集區以進行疑難排解。

輸出範例:

percentage of cpu usage by thread 'opensearch[nodeName][thread-name]'

檢查寫入作業或大量 API 執行緒集區

如果您收到「429」錯誤訊息,則叢集可能有過多的大量索引請求。當叢集中的 CPU 使用率持續發生激增時,OpenSearch Service 會拒絕大量索引請求。

寫入執行緒集區會處理索引請求,並包括大量 API 作業。若要確認您的網域是否因過多大量索引請求而過載,請檢查 IndexingRate Amazon CloudWatch 指標

如果叢集有過多大量索引請求,請採取以下措施:

  • 減少叢集上的大量請求數目。
  • 減少每個大量請求的大小,以便您的節點可以更有效率地處理這些請求。
  • 如果您使用 Logstash 將資料上傳到 OpenSearch Service 叢集,請減少批次大小或工作者的數量。
  • 如果叢集的擷取速率降低,請水平或垂直擴展您的叢集

檢查搜尋執行緒集區

高度使用 CPU 的搜尋執行緒集區,表示搜尋查詢會讓您的 OpenSearch Service 叢集不堪重負。單一長時間執行的查詢可能會使您的叢集不堪重負。叢集執行的查詢增加也會影響搜尋執行緒集區。

若要檢查單一查詢是否增加 CPU 使用率,請執行以下命令:

GET _tasks?actions=*search&detailed

任務管理 API 會顯示叢集上執行的所有作用中的搜尋查詢。如需相關資訊,請參閱 OpenSearch 網站上的列出任務 API

在輸出中,查看描述欄位以識別正在執行的查詢。running_time_in_nanos 欄位表示某項查詢執行的時間長度。

輸出範例:

{    "nodes": {
        "U4M_p_x2Rg6YqLujeInPOw": {
            "name": "U4M_p_x",
            "roles": [
                "data",
                "ingest"
            ],
            "tasks": {
                "U4M_p_x2Rg6YqLujeInPOw:53506997": {
                    "node": "U4M_p_x2Rg6YqLujeInPOw",
                    "id": 53506997,
                    "type": "transport",
                    "action": "indices:data/read/search",
                    "description": """indices[*], types[], search_type[QUERY_THEN_FETCH], source[{"size":10000,"query":{"match_all":{"boost":1.0}}}]""",
                    "start_time_in_millis": 1541423217801,
                    "running_time_in_nanos": 1549433628,
                    "cancellable": true,
                    "headers": {}
                }
            }
        }
    }
}

**注意:**對於搜尋任務,任務管理 API 輸出僅包含描述欄位。

若要降低 CPU 使用率,請執行以下命令以取消佔用高 CPU 的搜尋查詢:

POST _tasks/U4M_p_x2Rg6YqLujeInPOw:53506997/_cancel

**注意:**將 U4M_p_x2Rg6YqLujeInPOw:53506997 替換為您的任務 ID。

上述查詢會將任務標記為已取消,並釋放相依的 AWS 資源。如果叢集上執行多個查詢,請使用 POST 命令來取消每個查詢,直到叢集恢復正常狀態為止。

為了避免 CPU 激增,最佳實務是在查詢主體中設定逾時值。如需相關資訊,請參閱 OpenSearch 網站上的搜尋設定。若要確認作用中的查詢數量是否減少,請檢查 SearchRate CloudWatch 指標

**注意:**當您在 OpenSearch Service 叢集中同時取消所有作用中的搜尋查詢,用戶端應用程式可能會發生錯誤。

檢查 Apache Lucene 合併執行緒集區

OpenSearch Service 使用 Apache Lucene 在您的叢集上索引和搜尋文件。當您建立新的碎片區段時,Apache Lucene 會執行合併作業,以減少每個碎片的有效區段數量,並移除已刪除的文件。如需更多詳細資訊,請參閱 Elastic 網站上的合併設定

如果 Apache Lucene 合併執行緒會影響 CPU 使用率,請執行以下命令以增加索引的 refresh_interval 設定:

PUT /your-index-name/_settings
{
  "index": {
    "refresh_interval": "value"
  }
}

**注意:**將 value 替換為新的請求間隔。此更新會降低叢集區段的建立速度。如需相關資訊,請參閱 OpenSearch 網站上的重新整理索引 API

當叢集將索引遷移至 UltraWarm 儲存體時,您的 CPU 使用率可能會增加。UltraWarm 遷移通常會使用強制合併 API 作業,這可能會佔用大量 CPU。如需相關資訊,請參閱 OpenSearch 網站上的強制合併 API

若要查看 UltraWarm 遷移,請執行以下命令:

GET _ultrawarm/migration/_status?v

查看 JVM 記憶體壓力

檢查叢集節點中 Java 堆積的 JVM 記憶體壓力百分比。在下列範例日誌中,JVM 處於建議的範圍內,但長時間執行的垃圾回收影響正在影響叢集:

[2022-06-28T10:08:12,066][WARN ][o.o.m.j.JvmGcMonitorService] [515f8f06f23327e6df3aad7b2863bb1f] [gc][6447732] overhead, spent [9.3s]collecting in the last [10.2s]

若要解決高 JVM 記憶體壓力的問題,請參閱如何對 OpenSearch Service 叢集上的高 JVM 記憶體壓力進行疑難排解?

檢閱您的碎片策略

根據叢集大小而定,叢集效能可能會因為碎片太多而降低。最佳實務是每 GiB 的 Java 堆積最多 25 個碎片

根據預設,Amazon OpenSearch Service 的碎片策略為 5:1,其中每個索引會有五個主要碎片。在每個索引中,每個主要碎片有自己的複本。OpenSearch Service 會自動將主要碎片和複本碎片分配給不同的數據節點,並確保在發生故障時有備份。

若要重新分配碎片,請參閱如何重新平衡 Amazon OpenSearch Service 叢集中不均勻的碎片分佈?

擴展叢集

請確保叢集具有足夠的 CPU、記憶體和磁碟空間以滿足您的需求。如果應用程式執行大型查詢或頻繁寫入,請調整叢集或節點大小以滿足效能需求

此外,建議使用專用主節點來提升叢集穩定性與韌性,特別是在較大型的部署環境中。此組態可將叢集管理責任從資料節點中移除。

最佳化您的查詢

大量彙總、萬用字元查詢 (例如開頭萬用字元) 和規則表達式 (regex) 查詢,可能會導致 CPU 使用率激增。若要診斷這些查詢,請檢查 OpenSearch 慢速日誌

相關資訊

如何改善 OpenSearch Service 叢集上的索引效能?

如何解決 OpenSearch Service 中的搜尋或寫入拒絕問題?

調整 OpenSearch Service 網域大小