Ubuntu环境下Kafka性能调优的关键技巧
num.network.threads(建议设为CPU核心数的一半)和num.io.threads(建议设为CPU核心数的2倍)参数值,提升网络请求和磁盘I/O处理能力;确保集群节点间有足够高的网络带宽(如10Gbps及以上),减少网络延迟。KAFKA_HEAP_OPTS设置JVM堆内存初始值(-Xms)和最大值(-Xmx),建议两者一致(如-Xms8G -Xmx8G),避免堆大小动态调整带来的开销。避免堆内存过大(如超过16GB),否则会增加Full GC停顿时间。-XX:+UseG1GC启用,并设置-XX:MaxGCPauseMillis=200(最大停顿时间目标,如200ms),平衡吞吐量与延迟。对于超大规模集群(日消息量>1亿),可考虑ZGC等低延迟GC算法。-XX:MaxMetaspaceSize(元空间大小,建议256MB-512MB),避免元空间溢出;限制直接内存大小(-XX:MaxDirectMemorySize,建议为堆内存的50%-100%,如-XX:MaxDirectMemorySize=4G),防止生产者/消费者批量缓冲区过度占用导致OOM。num.network.threads控制网络请求处理线程数,建议设为CPU核心数的一半(如8核CPU设为4);num.io.threads控制磁盘I/O操作线程数,建议设为CPU核心数的2倍(如8核CPU设为16),提升并行处理能力。log.segment.bytes设置日志段大小(建议1GB-4GB,如-Xmx8G时可设为2GB),减少日志分段数量,降低索引开销;log.retention.hours设置日志保留时间(建议168小时/7天-72小时/3天),避免磁盘空间浪费;log.cleanup.policy根据需求选择(日志场景用delete,核心业务用compact,如订单主题)。socket.send.buffer.bytes和socket.receive.buffer.bytes分别设置发送/接收缓冲区大小(建议1MB,如1048576),提高网络传输效率。socket.request.max.bytes控制单个请求最大大小(建议100MB-500MB),防止系统过载。replication.factor设为3(保障高可用),但需避免副本过多导致同步延迟。设置min.insync.replicas=2(至少2个副本同步成功才返回成功),防止数据丢失。batch.size设置批量发送大小(建议64KB-256KB,如65536),增加批量大小可提高吞吐量;linger.ms设置消息等待时间(建议10-100ms),让生产者等待更多消息加入批次,减少网络请求次数。compression.type启用压缩(如lz4,压缩率约2-3倍),减少网络带宽占用;acks设置消息可靠性(acks=all保证数据不丢失,但会降低吞吐量;acks=1平衡可靠性与吞吐量)。fetch.min.bytes设置每次拉取的最小数据量(建议1KB-1MB,如1024),减少网络请求次数;fetch.max.wait.ms设置拉取等待时间(建议10-100ms),平衡延迟与吞吐量。group.id)实现负载均衡,确保每个分区只被组内一个消费者消费。noatime选项(禁用访问时间更新),减少磁盘写操作;调整vm.swappiness=1(减少交换分区使用)、vm.max_map_count=262144(增加内存映射区域数量),优化内存使用。net.core.somaxconn=8192(增加TCP连接队列长度)、net.ipv4.tcp_tw_reuse=1(复用TIME_WAIT连接)、net.ipv4.tcp_fin_timeout=30(缩短FIN_WAIT超时时间),提高网络连接效率。kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec)实时监控主题消息流量。log.retention.hours参数),确保磁盘空间充足(建议预留20%以上空间);定期进行性能测试(如使用kafka-producer-perf-test和kafka-consumer-perf-test工具),评估调优效果。