Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何對 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 年前
