Ubuntu上Kafka优化策略
-Xms
与-Xmx
设为相同值,避免频繁扩容),建议不超过服务器物理内存的50%-70%(如8GB内存可设为4GB-6GB);同时确保操作系统有足够空闲内存,避免触发磁盘交换(swap),影响性能。atime
更新(减少磁盘I/O)。net.core.somaxconn
(连接队列长度,建议设为1024)、net.ipv4.tcp_max_syn_backlog
(SYN队列长度,建议设为8192);增大文件描述符限制(ulimit -n 65536
),避免高并发下连接数不足。batch.size
(从默认16KB提升至128KB-1MB),减少网络请求次数;设置linger.ms
(50-100ms),允许生产端积累更多消息后批量发送;启用压缩(compression.type=snappy
或lz4
,平衡压缩率与CPU开销),可减少50%以上的网络传输量。acks
参数——高吞吐量场景用acks=1
(仅Leader确认),强一致性场景用acks=all
(所有ISR副本确认)。replication.factor
)设为3(保障高可用),避免过多副本导致同步延迟。num.io.threads
(磁盘I/O线程,建议设为CPU核心数的2倍,如8核设为16)、num.network.threads
(网络收发线程,建议设为8,适配万兆网卡),避免线程成为瓶颈。log.segment.bytes=1GB
(增大日志段大小,减少分段数量及索引开销);启用log.cleanup.policy=delete
(默认)并按时间(log.retention.hours=168
,7天)或大小(log.retention.bytes
)清理过期数据;如需保留最新消息版本(如数据库变更日志),可设为compact
策略。fetch.min.bytes
(从默认1字节提升至1MB),减少拉取频率;设置max.poll.records=1000
(单次拉取最多消息数),降低处理开销;消费者线程数应等于分区数(如3分区用3个消费者),避免线程闲置或竞争。enable.auto.commit=true
)并设置auto.commit.interval.ms=5000
(5秒),平衡数据一致性与性能;如需更强一致性,可设为手动提交(enable.auto.commit=false
)。logrotate
工具自动管理Kafka日志(如每天轮转、保留7天、压缩旧日志),避免日志文件过大占用磁盘空间。配置示例如下(保存为/etc/logrotate.d/kafka
):/var/log/kafka/*.log { daily missingok rotate 7 compress delaycompress notifempty create 644 root root sharedscripts postrotate [ ! -f /var/run/kafka.pid ] || kill -USR1
cat /var/run/kafka.pid endscript}
。server.properties
中设置compression.type=gzip/snappy/lz4
,减少日志文件大小(如lz4压缩率约3-4倍)。UnderReplicatedPartitions
、请求队列时间RequestQueueTimeMs
),及时发现性能瓶颈。kafka-producer-perf-test
(生产者压测)和kafka-consumer-perf-test
(消费者压测)工具模拟高负载场景,验证优化效果(如调整batch.size
后的吞吐量变化)。