如何對 OpenSearch Service 叢集 CPU 使用率過高的問題進行疑難排解?
我的資料節點在 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 叢集上的索引效能?
相關內容
- 已提問 2 年前
