Kafka在CentOS上的性能优化需围绕硬件资源、操作系统、Broker配置、生产者/消费者调优、网络及监控六大维度展开,以下是具体措施:
ulimit -n 65535临时生效,或修改/etc/security/limits.conf永久生效(添加* soft nofile 65535; * hard nofile 65535)。vm.swappiness:设置为1(默认60),避免系统频繁将内存数据交换到磁盘,减少I/O开销。vm.dirty_background_ratio:设置为10以下(默认10),控制后台脏页刷新的阈值,平衡内存与磁盘I/O。vm.dirty_ratio:设置为60-80(默认20),限制脏页占用的最大内存比例,避免内存耗尽导致系统卡顿。num.partitions:根据消费者线程数设置分区数(建议分区数≥消费者线程数),提高并行处理能力;分区过多会增加ZooKeeper负担,需权衡。log.segment.bytes:设置日志段大小为1GB(默认1GB),避免频繁切换日志段导致的I/O开销。log.retention.hours/log.retention.bytes:合理设置日志保留时间(如7天)或大小(如1TB),及时清理旧数据,释放磁盘空间。num.network.threads:处理网络请求的线程数,设置为CPU核数+1(如8核设置为9)。num.io.threads:处理磁盘I/O的线程数,设置为CPU核数的2倍(如8核设置为16)。compression.type:启用LZ4压缩(比Snappy更高的吞吐量、更低的CPU开销),减少网络传输和存储成本。acks:根据可靠性需求选择应答机制——acks=1(默认,平衡性能与可靠性)、acks=0(最高性能,不保证数据不丢失)、acks=all(最高可靠性,需所有ISR副本确认)。buffer.memory:生产者缓冲区大小,设置为64MB以上(默认32MB),提高批量发送效率。log.flush.interval.messages/log.flush.interval.ms:调整日志刷盘间隔(如log.flush.interval.messages=10000、log.flush.interval.ms=1000),减少刷盘次数,提高吞吐量(但会增加数据丢失风险,需根据业务需求权衡)。batch.size设置为1MB(默认16KB),将多个小消息合并为一个大消息批量发送,减少网络请求次数;linger.ms设置为100ms以上(默认0),允许生产者在发送前等待更多消息积累,进一步提高批量效率。compression.type与Broker保持一致(推荐LZ4);acks根据业务需求选择(如允许少量丢失选acks=1,追求可靠性选acks=all)。fetch.min.bytes设置为1MB(默认1字节),减少消费者向Broker发送拉取请求的频率;fetch.max.wait.ms设置为1000ms(默认500ms),平衡延迟与吞吐量(等待时间越长,单次拉取的数据量越大)。max.poll.records设置为500-1000(默认500),增加每次poll操作返回的最大记录数,提高消费者的单次处理效率;max.poll.interval.ms设置为30分钟以上(默认5分钟),避免因处理慢导致消费者被踢出消费者组(需根据业务处理时间调整)。compression.type=LZ4,减少网络传输的数据量(LZ4压缩率约2-3倍,对CPU开销影响小)。net.core.rmem_max=16777216、net.core.wmem_max=16777216),提高网络吞吐量;启用TCP_NODELAY(禁用Nagle算法),减少小数据包的发送延迟。kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec)或第三方工具(如Prometheus+Grafana、Kafka Manager),实时监控集群的关键指标(吞吐量、延迟、ISR数量、未同步副本数等)。kafka-producer-perf-test(生产者压测)、kafka-consumer-perf-test(消费者压测)工具模拟实际负载,验证优化效果(如调整batch.size后,观察吞吐量是否提升)。kafka-log-dirs工具),监控磁盘空间使用情况(建议剩余空间≥20%);根据业务增长动态调整分区数(如分区数不足导致吞吐量下降时,可通过kafka-topics --alter命令增加分区)。以上策略需根据实际业务场景(如吞吐量需求、延迟要求、可靠性需求)和硬件环境(如CPU核数、内存大小、磁盘类型)进行调整,建议在测试环境中验证后再应用到生产环境。