Ubuntu上Kafka配置優化指南
-Xmx
/-Xms
)設置為服務器內存的50%-70%(如32GB內存可設為16GB-21GB),避免內存溢出或頻繁GC;同時確保操作系統有足夠內存用于頁緩存(Page Cache),提升消息讀取效率。kafka-server-start.sh
中的KAFKA_HEAP_OPTS
,例如:export KAFKA_HEAP_OPTS="-Xmx16G -Xms16G -Xmn10G -XX:MetaspaceSize=256M"
其中-Xmx
/-Xms
設置為相同值(避免堆內存動態調整的開銷),-Xmn
為新生代內存(約占堆內存的60%-70%),-XX:MetaspaceSize
設置元空間初始大小。export KAFKA_HEAP_OPTS="$KAFKA_HEAP_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=16M"
-XX:MaxGCPauseMillis
控制最大GC暫停時間(目標50ms以內),-XX:G1HeapRegionSize
設置堆內存區域大?。?6M,適配大內存)。num.network.threads
:處理網絡請求的線程數,建議設置為CPU核心數的50%(如8核CPU設為4);num.io.threads
:處理磁盤I/O操作的線程數,建議設置為CPU核心數的50%(如8核CPU設為4)。log.segment.bytes
:每個日志段的最大大小,建議設置為1GB(默認1GB),過大導致清理不及時,過小增加文件數量;log.retention.hours
:日志保留時間,根據業務需求設置(如72小時或7天),避免磁盤空間耗盡;log.cleanup.policy
:日志清理策略,默認delete
(按時間/大小刪除),若需保留每個Key的最新值(如數據庫變更日志),可設置為compact
(需開啟log.cleaner.enable=true
)。log.flush.interval.messages
:每積累10萬條消息刷新一次磁盤(默認1萬條);log.flush.interval.ms
:每60秒強制刷新一次磁盤(默認無限制)。注:頻繁刷新(如設置較小的
log.flush.interval.ms
)會提升數據持久性,但降低吞吐量。
batch.size
:每個批次的最大字節數,建議設置為1MB(默認16KB),增大批次可減少網絡請求次數,提升吞吐量;linger.ms
:發送批次前的等待時間,建議設置為100ms以上(默認0ms),允許更多消息加入批次,減少延遲。LZ4
,兼顧壓縮率與CPU開銷),添加參數:compression.type=lz4
壓縮可減少網絡傳輸和磁盤存儲開銷,適合高帶寬成本或大消息場景。buffer.memory
:Producer的內存緩沖區大小,建議設置為64MB以上(默認32MB),避免生產者因緩沖區滿而阻塞。fetch.min.bytes
:每次從Broker拉取的最小字節數,建議設置為1MB(默認1字節),減少網絡請求次數;fetch.max.wait.ms
:當未達到fetch.min.bytes
時的最大等待時間,建議設置為1秒(默認500ms),平衡延遲與吞吐量;max.poll.records
:每次poll
調用返回的最大消息數,建議根據消費能力設置(如1000條),避免單次處理過多消息導致內存溢出。ulimit -n 65536
并修改/etc/security/limits.conf
,添加:* soft nofile 65536
* hard nofile 65536
sysctl -w net.core.somaxconn=65535 # 監聽隊列最大長度
sysctl -w net.ipv4.tcp_max_syn_backlog=65535 # SYN隊列最大長度
sysctl -w net.ipv4.tcp_tw_reuse=1 # 復用TIME_WAIT連接
將上述參數添加到/etc/sysctl.conf
中,執行sysctl -p
生效。kafka-log-dirs
工具檢查日志清理情況,確保日志段大小和保留時間符合預期,避免磁盤空間耗盡。