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
设置堆内存区域大小(16M,适配大内存)。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
工具检查日志清理情况,确保日志段大小和保留时间符合预期,避免磁盘空间耗尽。