設定 Kafka Tools 的 JVM 選項
1. 概述
Kafka 是一個開源的分散式訊息流中間件,用於即時收集、儲存和處理資料。 Kafka 包含多個命令列工具,可用於管理、測試和偵錯。
這些工具本質上是 shell 腳本,它們內部使用java指令啟動 Java 類別。因此,我們可能需要出於多種原因調整 JVM(Java 虛擬機器)設置,包括記憶體管理、垃圾回收效能和穩定性。
本教學將討論如何為命令列 Kafka 工具設定 JVM 選項。範例中使用的 Kafka 版本為 4.1.1。
2. 使用KAFKA_HEAP_OPTS
KAFKA_HEAP_OPTS環境變數用於控制 Kafka 工具(包括 Kafka 伺服器)的 JVM 堆大小。我們將另行討論其具體用法。
2.1. Kafka 工具
啟動工具前,必須使用export指令匯出KAFKA_HEAP_OPTS 。例如,讓我們將kafka-console-producer.sh (Kafka 訊息產生工具之一)的 JVM 最小和最大堆大小設為 1 GB:
$ export KAFKA_HEAP_OPTS="-Xms1G -Xmx1G"
$ kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test-topic
>
箭頭符號>表示該工具正在運作並已準備好發送訊息。讓我們使用jcmd檢查最小和最大堆大小的值:
$ jcmd $(pgrep -f ConsoleProducer) VM.flags
5090:
-XX:CICompilerCount=3 ... -XX:MaxHeapSize=1073741824 ... -XX:MinHeapSize=1073741824 ... -XX:+UseG1GC
由於列出的虛擬機器標誌很多,我們對輸出進行了簡化。我們使用$(pgrep -f ConsoleProducer )來取得正在運行的進程的進程 ID (PID),並將其傳遞給jcmd的ConsoleProducer VM.flags指令會列印 JVM 標誌選項及其目前值。 `ConsoleProducer` 是腳本啟動的 Java 類別的名稱。
從輸出結果可以明顯看出,最小堆大小和最大堆大小的值分別為-XX:MinHeapSize和-XX:MaxHeapSize ,均為1073741824字節,即 1 GB。
2.2. Kafka 伺服器
上一小節的方法同樣適用於從命令列啟動 Kafka 伺服器。但是,如果 Kafka 伺服器在 Linux 系統中作為 systemd 服務運行,則需要在該服務的單元檔案中定義環境變數。以下是一個單元檔案範例:
$ cat kafka_server.service
[Unit]
Description=Kafka Server
[Service]
Environment="KAFKA_HEAP_OPTS=-Xms2g -Xmx2g"
ExecStart=/home/baeldung/work/kafka-vm-options/start-server.sh
[Install]
WantedBy=multi-user.target
我們感興趣的是「 Service部分中的「 Environment選項,它將KAFKA_HEAP_OPTS環境變數設定為“-Xms2g -Xmx2g” ,即 JVM 堆的最小和最大大小均為 2 GB。這次,我們使用systemctl status指令來檢查這些值:
$ sudo systemctl status kafka_server
● kafka_server.service - Kafka Server
Loaded: loaded (/etc/systemd/system/kafka_server.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2025-12-23 07:03:46 EST; 3s ago
Main PID: 9218 (start-server.sh)
Tasks: 6 (limit: 4597)
Memory: 4.0M
CPU: 4.437s
CGroup: /system.slice/kafka_server.service
├─9218 /bin/bash /home/baeldung/work/kafka-vm-options/start-server.sh
└─9943 java -Xms2g -Xmx2g -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 ...
顯然,JVM 參數為“-Xms2g -Xmx2g” ,如上面的輸出所示。
3. 使用KAFKA_OPTS
我們可以使用環境變數KAFKA_OPTS來設定 JVM 系統屬性以及任何與堆疊大小無關的 JVM 選項。首先,讓我們來討論一下它在 Kafka 伺服器之外的其他 Kafka 工具中的用法,然後再討論它在 Kafka 伺服器本身的用法。
3.1. Kafka 工具
我們可以像設定KAFKA_HEAP_OPTS一樣,透過命令列設定KAFKA_OPTS ,從而更改 Kafka 工具的 JVM 選項或系統屬性。例如,讓我們更改kafka-console-producer.sh的預設 Kafka 日誌目錄:
$ export KAFKA_OPTS="-Dkafka.logs.dir=/tmp/kafka"
$ kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test-topic
>
設定好KAFKA_OPTS並啟動kafka-console-producer.sh後,讓我們使用jcmd檢查設定是否成功。不過,這次我們使用jcmd的VM.system_properties指令:
$ jcmd $(pgrep -f ConsoleProducer) VM.system_properties | grep kafka.logs.dir
kafka.logs.dir=/tmp/kafka
Kafka 日誌目錄為/tmp/kafka ,符合預期。
3.2. Kafka 伺服器
如果從命令列啟動 Kafka 伺服器,我們可以使用上一小節中的方法。如果伺服器是作為 systemd 服務運行,我們需要在服務的單元檔案中定義它,就像KAFKA_HEAP_OPTS一樣。
例如,我們可以使用-Dkafka.logs.dir標誌來更改 Kafka 的預設日誌目錄,如下所示:
[Service]
Environment="KAFKA_OPTS=-Dkafka.logs.dir=/tmp/kafka"
ExecStart=/home/baeldung/work/kafka-vm-options/start-server.sh
我們僅展示了單元文件中的Service部分。日誌儲存在/tmp/kafka目錄中。應用此更改並重新啟動伺服器後,我們可以使用jcmd進行檢查:
$ sudo jcmd $(pgrep -f kafka.Kafka) VM.system_properties | grep kafka.logs.dir
kafka.logs.dir=/tmp/kafka
由於jcmd的輸出很長,我們使用grep對其進行了過濾。結果符合預期。
4. 使用KAFKA_JVM_PERFORMANCE_OPTS
環境變數KAFKA_JVM_PERFORMANCE_OPTS通常用於調整 Kafka 伺服器的 JVM 的垃圾回收機 (GC) 和底層效能設定。我們將分別討論除 Kafka 伺服器之外的其他 Kafka 工具,以及 Kafka 伺服器本身。
4.1. Kafka 工具
我們需要像之前的範例一樣,在執行 Kafka 工具之前,從命令列設定KAFKA_JVM_PERFORMANCE_OPTS環境變數。例如,讓我們更改kafka-console-producer.sh中 JVM 使用的 GC:
$ export KAFKA_JVM_PERFORMANCE_OPTS="-XX:+UseZGC -XX:+AlwaysPreTouch"
$ kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test-topic
>
在本例中,我們使用環境變數KAFKA_JVM_PERFORMANCE_OPTS將命令列選項-XX:+UseZGC和-XX:+AlwaysPreTouch傳遞給伺服器。我們指示伺服器使用 ZGC(Z 垃圾回收器)而不是預設的 G1 垃圾回收器。此外,我們使用-XX:+AlwaysPreTouch命令列選項,透過在 JVM 初始化期間預先存取 Java 堆來避免延遲。
生產者啟動後,讓我們使用jcmd檢查值:
$ jcmd $(pgrep -f ConsoleProducer) VM.flags
4877:
-XX:+AlwaysPreTouch ... -XX:+UseZGC
顯然,設定符合預期。
4.2. Kafka 伺服器
如果從命令列啟動 Kafka 伺服器,我們可以使用上一小節中的方法。但是,如果將伺服器作為 systemd 服務運行,我們可以像設定KAFKA_HEAP_OPTS一樣,在 Kafka 伺服器的單元檔案中設定KAFKA_JVM_PERFORMANCE_OPTS :
[Service]
Environment="KAFKA_JVM_PERFORMANCE_OPTS=-XX:+UseZGC -XX:+AlwaysPreTouch"
ExecStart=/home/baeldung/work/kafka-vm-options/start-server.sh
讓我們用以下配置啟動服務,並檢查其狀態:
$ sudo systemctl status kafka_server
● kafka_server.service - Kafka Server
Loaded: loaded (/etc/systemd/system/kafka_server.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2025-12-23 09:12:56 EST; 1h 56min ago
Main PID: 29923 (start-server.sh)
Tasks: 108 (limit: 4597)
Memory: 1.1G
CPU: 3min 24.313s
CGroup: /system.slice/kafka_server.service
├─29923 /bin/bash /home/baeldung/work/kafka-vm-options/start-server.sh
└─30651 java -Xmx1G -Xms1G -XX:+UseZGC -XX:+AlwaysPreTouch ...
從輸出結果可以看出,我們已成功使用KAFKA_JVM_PERFORMANCE_OPTS環境變數將命令列選項傳遞給伺服器。
5. 結論
本文討論如何為命令列 Kafka 工具(包括 Kafka 伺服器)設定 JVM 選項。我們了解到,可以使用KAFKA_HEAP_OPTS 、 KAFKA_OPTS和KAFKA_JVM_PERFORMANCE_OPTS這三個環境變數分別設定 JVM 堆大小、JVM 系統屬性和垃圾回收 (GC) 設定。在運行工具之前,需要從命令列匯出這些環境變數。
此外,我們也了解到,如果 Kafka 伺服器由 systemd 管理,則需要在伺服器的單元檔案中定義這些環境變數。