我想要疑難排解 Amazon MSK (Amazon Managed Streaming for Apache Kafka) 叢集的堆積記憶體使用量過高問題。
解決方法
監控 HeapMemoryAfterGC 指標
使用 Amazon CloudWatch 監控 HeapMemoryAfterGC 指標,此指標顯示垃圾回收完成後,仍在使用的堆積記憶體占總堆積記憶體的百分比。請監控 HeapMemoryAfterGC 指標,而非 MemoryFree 或 MemoryUsed 指標。
最佳實務是將 HeapMemoryAfterGC 維持在 60% 以下。當 HeapMemoryAfterGC 超過 60% 時,您的 Apache Kafka 叢集可能會出現效能下降。 建立 Amazon CloudWatch 警示,當 HeapMemoryAfterGC 超過 60% 時觸發,並另外建立一個在達到 80% 臨界值時觸發的 CloudWatch 警示。
減少用戶端連線
大量連線或短期連線可能會導致 Amazon MSK 叢集的堆積記憶體使用量過高。若要改善效能,請關閉不必要的使用中用戶端連線,並盡可能減少連線總數。
監控 connections-count、connection-close-rate 和 connection-creation-rate 指標。如果這三項指標與 HeapMemoryAfterGC 都偏高,請減少連線數量。如需更多資訊,請參閱 Apache Kafka 用戶端效能中的用戶端連線一節。
管理消費者群組
頻繁提交消費者偏移量或消費者群組數量過多,可能會導致堆積記憶體使用量過高。若要解決此問題,請移除未使用的消費者群組。
此外,請降低 offsets.retention.minutes 值。預設值為 7 天 (10080 分鐘)。如需更多資訊,請參閱 Kafka 網站上的 offsets.retention.minutes。
改善訊息大小與分區
如果代理程式之間的分區分佈不均,或分區數量超過叢集中每個代理程式的上限,則可能會出現堆積記憶體使用量過高的情況。
若要解決此問題,請採取以下動作:
- 如果 message.max.bytes 值偏高,請降低此值。預設值為 1 MB。大幅提高此值 (例如提高至 16 MB) 可能會增加記憶體使用量。
- 請使用每個代理程式適用的分區數量。
- 平衡代理程式之間的分區分佈。
管理交易式訊息
生產者 ID 過多或生產者狀態項目累積過多,可能會導致堆積記憶體使用量過高。
如果您的叢集使用交易式訊息傳遞,請降低 transactional.id.expiration.ms 值。對於 3.4.0 之前的 Kafka 版本,請將此值從 604800000 毫秒 (7 天) 降低至 86400000 毫秒 (1 天)。
對於 Kafka 3.4.0 及更新版本,producer.id.expiration.ms 會控制生產者到期時間。依預設,producer.id.expiration.ms 設為 1 天。如需更多資訊,請參閱 Confluence 網站上的生產者 ID 到期的個別組態。
檢閱代理程式執行個體類型與擴展
大量傳入或傳出流量可能會導致堆積記憶體使用量過高。監控 BytesInPerSec、BytesOutPerSec、ReplicationBytesInPerSec 和 ReplicationBytesOutPerSec 指標。如果這三項指標與 HeapMemoryAfterGC 都偏高,請減少流量,或增加代理程式的大小以取得更多記憶體。
改善區段組態
較低的 segment.ms 和 segment.bytes 值可能會產生過多記憶體對應檔案。
當 segment.ms 值偏低時,Kafka 會更頻繁地建立新的日誌區段,因而產生過多開啟的檔案控制代碼。當叢集達到開啟檔案數量上限時,堆積記憶體使用量會增加,代理程式也會變得不穩定。
若要解決此問題,請提高所有主題的 segment.ms 值。segment.ms 的預設值為 604800000 毫秒 (7 天)。log.segment.bytes 設為 1073741824 位元組 (1 GB) 適用於大多數情境。不過,請依照您的保留與壓縮需求調整這些值。如需更多資訊,請參閱 Kafka 網站上的 segment.ms 和 log.segment.bytes。
進一步疑難排解
請採取以下動作:
- 檢查您的伺服器與叢集組態,並加以調整以改善效能與可靠性。
- 如果您已為叢集啟用分層式儲存,從遠端層讀取資料時,堆積記憶體使用率預計會達到 60%–70%。同時監控 RemoteFetchBytesPerSec 與 HeapMemoryAfterGC 指標。
- 如果您使用 Prometheus 監控叢集,請將 Prometheus 主機組態的抓取間隔設定為 60 秒以上。較長的間隔可減少指標收集量。
- T3 代理程式可使用 CPU 點數暫時突增效能。如果超過基準效能,記憶體使用量就會增加。您可以更新為較大的執行個體類型。
- 如果問題仍然存在,請重新啟動代理程式,或建立支援互動以聯絡 AWS Support。
相關資訊
記憶體不足
監控磁碟空間
使用 Amazon CloudWatch 警示
Apache Kafka 用戶端最佳實務