返回文章列表

Kafka 監控指標詳解與效能最佳化

本文探討 Kafka 監控指標,涵蓋主題層級、分割槽層級、JVM 和作業系統等導向,並提供程式碼範例與效能最佳化建議。從位元組流入/流出速率、請求成功/失敗率到分割槽大小、日誌段數量等,全面解析 Kafka 效能監控的關鍵指標,同時也包含 JVM 的 GC 監控和作業系統的

系統設計 效能調校

Kafka 監控對於叢集穩定性和效能至關重要。本文詳細介紹了 Kafka 的各項監控指標,包含主題層級的位元組流入/流出速率、訊息流入速率、請求成功/失敗率等,以及分割槽層級的分割槽大小、日誌段數量、偏移量等。此外,文章也涵蓋了 JVM 層級的 GC 監控,例如 G1 GC 的 CollectionCountCollectionTime,以及作業系統層級的 CPU 使用率、系統負載、記憶體和磁碟使用率、網路流量等關鍵指標。最後,文章也說明瞭日誌管理的重要性,並建議啟用特定日誌記錄器以取得更詳細的資訊,方便工程師針對不同層級的指標進行分析,快速找出並解決 Kafka 叢集的效能瓶頸。

Kafka 監控指標詳解

在 Kafka 叢集的維運過程中,監控指標的收集和分析至關重要。這些指標不僅能幫助我們瞭解叢集的執行狀態,還能及時發現潛在問題,確保叢集的穩定性和效能。

主題層級指標

Kafka 提供了一系列主題層級的指標,用於監控特定主題的效能和執行狀態。這些指標包括:

位元組流入速率

  • 指標名稱:BytesInPerSec
  • JMX MBeankafka.server:type=BrokerTopicMetrics,name=BytesInPerSec,topic=TOPICNAME
  • 描述:該指標表示每秒流入特定主題的位元組數,反映了生產者向該主題寫入資料的速率。

位元組流出速率

  • 指標名稱:BytesOutPerSec
  • JMX MBeankafka.server:type=BrokerTopicMetrics,name=BytesOutPerSec,topic=TOPICNAME
  • 描述:該指標表示每秒從特定主題流出的位元組數,反映了消費者從該主題讀取資料的速率。

失敗的抓取請求速率

  • 指標名稱:FailedFetchRequestsPerSec
  • JMX MBeankafka.server:type=BrokerTopicMetrics,name=FailedFetchRequestsPerSec,topic=TOPICNAME
  • 描述:該指標表示每秒失敗的抓取請求數量,可能指示消費者在讀取資料時遇到的問題。

失敗的生產請求速率

  • 指標名稱:FailedProduceRequestsPerSec
  • JMX MBeankafka.server:type=BrokerTopicMetrics,name=FailedProduceRequestsPerSec,topic=TOPICNAME
  • 描述:該指標表示每秒失敗的生產請求數量,可能指示生產者在寫入資料時遇到的問題。

訊息流入速率

  • 指標名稱:MessagesInPerSec
  • JMX MBeankafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec,topic=TOPICNAME
  • 描述:該指標表示每秒流入特定主題的訊息數量,反映了生產者的寫入速率。

抓取請求速率

  • 指標名稱:TotalFetchRequestsPerSec
  • JMX MBeankafka.server:type=BrokerTopicMetrics,name=TotalFetchRequestsPerSec,topic=TOPICNAME
  • 描述:該指標表示每秒對特定主題的抓取請求數量,反映了消費者的讀取頻率。

生產請求速率

  • 指標名稱:TotalProduceRequestsPerSec
  • JMX MBeankafka.server:type=BrokerTopicMetrics,name=TotalProduceRequestsPerSec,topic=TOPICNAME
  • 描述:該指標表示每秒對特定主題的生產請求數量,反映了生產者的寫入頻率。

分割槽層級指標

除了主題層級的指標,Kafka 還提供了分割槽層級的指標,用於更細粒度地監控每個分割槽的狀態。這些指標包括:

分割槽大小

  • 指標名稱:Size
  • JMX MBeankafka.log:type=Log,name=Size,topic=TOPICNAME,partition=0
  • 描述:該指標表示特定分割槽在磁碟上佔用的位元組數,反映了該分割槽儲存的資料量。
// 檢視分割槽大小範例程式碼
public class PartitionSizeChecker {
    public static void main(String[] args) {
        // 建立 Kafka 管理客戶端
        AdminClient adminClient = AdminClient.create(KafkaProperties.adminProps());
        
        // 取得主題的分割槽資訊
        DescribeTopicsResult result = adminClient.describeTopics(Collections.singleton("TOPICNAME"));
        
        // 處理分割槽資訊
        result.all().get().forEach((topic, description) -> {
            description.partitions().forEach(partition -> {
                // 使用 JMX 取得分割槽大小
                ObjectName objectName = new ObjectName("kafka.log:type=Log,name=Size,topic=" + topic + ",partition=" + partition.partition());
                // ...
            });
        });
    }
}

日誌段數量

  • 指標名稱:NumLogSegments
  • JMX MBeankafka.log:type=Log,name=NumLogSegments,topic=TOPICNAME,partition=0
  • 描述:該指標表示特定分割槽的日誌段檔案數量,反映了該分割槽的日誌管理狀況。

日誌結束偏移量

  • 指標名稱:LogEndOffset
  • JMX MBeankafka.log:type=Log,name=LogEndOffset,topic=TOPICNAME,partition=0
  • 描述:該指標表示特定分割槽當前最新的偏移量,反映了該分割槽最新的資料寫入位置。

日誌起始偏移量

  • 指標名稱:LogStartOffset
  • JMX MBeankafka.log:type=Log,name=LogStartOffset,topic=TOPICNAME,partition=0
  • 描述:該指標表示特定分割槽當前最早的偏移量,反映了該分割槽最早的資料儲存位置。

內容解密:

  1. 分割槽大小(Size)用於監控每個分割槽在磁碟上的資料量,有助於評估儲存使用情況和資料分佈是否均勻。
  2. 日誌段數量(NumLogSegments)用於監控分割槽的日誌管理狀況,多個日誌段可能影響效能。
  3. 日誌結束偏移量(LogEndOffset)和日誌起始偏移量(LogStartOffset)用於監控分割槽的偏移量範圍,可以間接推斷分割槽內的訊息數量(需考慮日誌壓縮的影響)。

JVM 監控

除了 Kafka 自身的指標外,監控 JVM 的執行狀態對於確保 Kafka 叢集的穩定性至關重要。重點監控的 JVM 指標包括垃圾回收(GC)的相關資訊。

G1 垃圾回收指標

對於使用 Oracle Java 1.8 和 G1 垃圾回收器的環境,需要監控以下指標:

  • 完全 GC 週期次數java.lang:type=GarbageCollector,name=G1 Old Generation
    • CollectionCount:JVM 啟動以來完全 GC 的次數。
    • CollectionTime:JVM 啟動以來完全 GC 總耗時(毫秒)。
// 檢視 G1 GC 指標範例程式碼
public class G1GcMonitor {
    public static void main(String[] args) throws Exception {
        // 建立 JMX 連線
        JMXConnector connector = JMXConnectorFactory.connect(new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi"));
        MBeanServerConnection mbeanServer = connector.getMBeanServerConnection();
        
        // 取得 G1 Old Generation GC 的 CollectionCount 和 CollectionTime
        ObjectName g1OldGenName = new ObjectName("java.lang:type=GarbageCollector,name=G1 Old Generation");
        long collectionCount = (long) mbeanServer.getAttribute(g1OldGenName, "CollectionCount");
        long collectionTime = (long) mbeanServer.getAttribute(g1OldGenName, "CollectionTime");
        
        System.out.println("G1 Old Gen GC Count: " + collectionCount);
        System.out.println("G1 Old Gen GC Time: " + collectionTime + " ms");
    }
}

內容解密:

  1. CollectionCountCollectionTime 是累積值,可以用來計算單位時間內的 GC 次數和耗時。
  2. LastGcInfo 提供了最近一次 GC 的詳細資訊,其中 duration 表示最近一次 GC 的耗時(毫秒)。
  3. JVM 的 GC 狀態直接影響 Kafka 的效能,因此需要密切監控 GC 指標,以便及時發現和處理潛在問題。

Kafka 監控與效能最佳化

Kafka 作為一個分散式串流處理平台,其監控與效能最佳化至關重要。本篇文章將探討 Kafka 的監控指標、效能最佳化策略以及相關的最佳實踐。

JVM 監控

Kafka 是根據 JVM 執行,因此 JVM 的監控對於 Kafka 的穩定執行至關重要。其中,OpenFileDescriptorCount 屬性告訴我們目前開啟的檔案描述符數量。每個日誌段和網路連線都會佔用檔案描述符,如果網路連線沒有正確關閉,可能會導致代理伺服器迅速耗盡允許的檔案描述符數量。

OS 監控

除了 JVM 監控之外,我們還需要監控作業系統的相關指標。主要的監控指標包括:

CPU 使用率

  • 系統負載平均值(system load average)
  • CPU 使用率百分比(按型別劃分):
  • us(使用者空間時間)
  • sy(核心空間時間)
  • ni(低優先順序程式時間)
  • id(閒置時間)
  • wa(等待磁碟時間)
  • hi(處理硬體中斷時間)
  • si(處理軟體中斷時間)
  • st(等待虛擬化管理程式時間)

系統負載

系統負載是指正在執行或等待執行的程式數量。Linux 也會將處於不可中斷睡眠狀態的執行緒(如等待磁碟)計入系統負載。單 CPU 系統中,負載值為 1 表示系統已滿載。多 CPU 系統中,滿載的負載值等於 CPU 數量。

記憶體與磁碟監控

  • 記憶體使用率:Kafka 通常執行在相對較小的 JVM 堆積大小下,大部分系統記憶體將用於快取。
  • 磁碟使用率:Kafka 的效能嚴重依賴磁碟效能,因此需要監控磁碟空間和 inode 使用率。
  • 磁碟 I/O 統計:監控讀寫速度、平均佇列大小、平均等待時間和磁碟利用率百分比。

網路監控

  • 網路利用率:監控輸入和輸出的網路流量,通常以每秒位元數報告。
  • 注意:由於 Kafka 的複製因子和消費者數量,輸出網路流量可能會遠大於輸入流量。

日誌管理

適當的日誌管理對於取得有用的資訊至關重要。Kafka 代理伺服器預設會將大量日誌訊息寫入磁碟。建議啟用適當的日誌記錄器並設定正確的日誌級別。

建議分離的日誌記錄器

  • kafka.controller:記錄叢集控制器的相關資訊。
  • kafka.server.ClientQuotaManager:記錄與生產和消費配額活動相關的訊息。
  • kafka.log.LogCleanerkafka.log.Cleanerkafka.log.LogCleanerManager:在 DEBUG 級別下記錄日誌壓縮執行緒的狀態。
此圖示展示了 Kafka 監控的主要方面及其相互關係。

詳細解析

JVM 監控的重要性

Kafka 是根據 Java 虛擬機器(JVM)執行的,因此 JVM 的效能直接影響 Kafka 的執行狀態。監控 JVM 的關鍵指標,如堆積記憶體使用率、垃圾收集頻率和執行緒狀態,可以幫助我們及時發現並解決潛在的效能問題。

OpenFileDescriptorCount 的作用

OpenFileDescriptorCount 屬性告訴我們目前開啟的檔案描述符數量。每個日誌段和網路連線都會佔用檔案描述符。如果網路連線沒有正確關閉,可能會導致代理伺服器迅速耗盡允許的檔案描述符數量,從而影響 Kafka 的正常執行。

OS 監控的關鍵指標

除了 JVM 監控之外,作業系統的相關指標也至關重要。主要的監控指標包括 CPU 使用率、系統負載、記憶體使用率和磁碟 I/O 統計等。

CPU 使用率的詳細解析

CPU 使用率是衡量系統效能的重要指標。透過監控 CPU 使用率,我們可以瞭解系統的負載情況,並及時發現潛在的效能瓶頸。

CPU 使用率百分比的劃分
  • us(使用者空間時間):CPU 在使用者空間執行程式所花費的時間。
  • sy(核心空間時間):CPU 在核心空間執行程式所花費的時間。
  • ni(低優先順序程式時間):CPU 處理低優先順序程式所花費的時間。
  • id(閒置時間):CPU 處於閒置狀態的時間。
  • wa(等待磁碟時間):CPU 等待磁碟 I/O 操作完成所花費的時間。
  • hi(處理硬體中斷時間):CPU 處理硬體中斷所花費的時間。
  • si(處理軟體中斷時間):CPU 處理軟體中斷所花費的時間。
  • st(等待虛擬化管理程式時間):在虛擬化環境中,CPU 等待虛擬化管理程式所花費的時間。

系統負載的深入理解

系統負載是指正在執行或等待執行的程式數量。Linux 也會將處於不可中斷睡眠狀態的執行緒(如等待磁碟)計入系統負載。單 CPU 系統中,負載值為 1 表示系統已滿載。多 CPU 系統中,滿載的負載值等於 CPU 數量。

記憶體與磁碟監控的重要性

Kafka 的效能嚴重依賴磁碟效能,因此需要監控磁碟空間和 inode 使用率。同時,記憶體使用率也是重要的監控指標。

磁碟 I/O 統計的詳細解析

  • 讀寫速度:監控磁碟的讀寫速度,可以瞭解磁碟的負載情況。
  • 平均佇列大小:監控磁碟的平均佇列大小,可以瞭解磁碟的繁忙程度。
  • 平均等待時間:監控磁碟操作的平均等待時間,可以瞭解磁碟的回應速度。
  • 磁碟利用率百分比:監控磁碟的利用率,可以瞭解磁碟的使用情況。

網路監控的重要性

Kafka 的複製因子和消費者數量會對網路流量產生重大影響,因此需要監控網路利用率。

網路利用率的詳細解析

  • 輸入和輸出的網路流量:監控輸入和輸出的網路流量,可以瞭解網路的負載情況。
  • 複製因子和消費者數量的影響:由於 Kafka 的複製因子和消費者數量,輸出網路流量可能會遠大於輸入流量。

日誌管理的重要性

適當的日誌管理對於取得有用的資訊至關重要。Kafka 代理伺服器預設會將大量日誌訊息寫入磁碟。建議啟用適當的日誌記錄器並設定正確的日誌級別。

日誌記錄器的詳細解析

  • kafka.controller:記錄叢集控制器的相關資訊。
  • kafka.server.ClientQuotaManager:記錄與生產和消費配額活動相關的訊息。
  • kafka.log.LogCleanerkafka.log.Cleanerkafka.log.LogCleanerManager:在 DEBUG 級別下記錄日誌壓縮執行緒的狀態。

Kafka 生產者監控與調優

Kafka 生產者客戶端提供了多項指標,用於監控和調優生產者的效能和可靠性。這些指標可以分為整體生產者指標、每個代理指標和每個主題指標。

整體生產者指標

整體生產者指標提供了關於生產者整體狀態的資訊,包括訊息批次大小、記憶體緩衝區利用率等。其中一些重要的指標包括:

  • record-error-rate:訊息錯誤率,表示生產者丟棄訊息的頻率。該指標應始終為零,如果大於零,表示生產者正在丟棄訊息。
  • request-latency-avg:請求延遲平均值,表示生產者向代理傳送請求的平均延遲時間。該指標可用於建立基準值,並在延遲時間超過基準值時發出警示。

訊息流量指標

  • outgoing-byte-rate:輸出位元組率,表示生產者每秒輸出的位元組數。
  • record-send-rate:訊息傳送率,表示生產者每秒傳送的訊息數。
  • request-rate:請求率,表示生產者每秒向代理傳送的請求數。

批次和請求大小指標

  • request-size-avg:請求大小平均值,表示生產者向代理傳送的請求的平均大小(以位元組為單位)。
  • batch-size-avg:批次大小平均值,表示生產者的訊息批次的平均大小(以位元組為單位)。
  • record-size-avg:訊息大小平均值,表示生產者的訊息的平均大小(以位元組為單位)。

佇列時間指標

  • record-queue-time-avg:訊息佇列時間平均值,表示訊息在生產者中等待的時間(以毫秒為單位)。該指標可用於評估生產者的效能和調優。

程式碼範例

// 建立 Kafka 生產者
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

KafkaProducer<String, String> producer = new KafkaProducer<>(props);

// 設定 JMX 監控
props.put("metrics.sample.window.ms", "30000"); // 30 秒
props.put("metrics.num.samples", "2");

producer.initTransactions();

內容解密:

  1. 建立 Kafka 生產者:使用 Properties 物件設定 Kafka 生產者的屬性,包括 bootstrap.serverskey.serializervalue.serializer
  2. 設定 JMX 監控:使用 metrics.sample.window.msmetrics.num.samples 屬性設定 JMX 監控的視窗大小和樣本數量。
  3. initTransactions() 方法:初始化交易,用於支援 Kafka 的交易功能。