Kafka在Ubuntu上的性能优化策略
echo "* soft nofile 100000" >> /etc/security/limits.conf
echo "* hard nofile 100000" >> /etc/security/limits.conf
使修改永久生效。sysctl -w vm.swappiness=1 # 减少交换空间使用(Kafka依赖物理内存)
sysctl -w vm.max_map_count=262144 # 增加内存映射区域数量
sysctl -w net.ipv4.tcp_fin_timeout=30 # 减少TCP连接超时时间
sysctl -w net.ipv4.tcp_tw_reuse=1 # 允许重用TIME_WAIT连接
sysctl -w net.core.rmem_max=16777216 # 增加TCP接收缓冲区大小
sysctl -w net.core.wmem_max=16777216 # 增加TCP发送缓冲区大小
将上述配置添加到/etc/sysctl.conf文件中,执行sysctl -p使修改生效。kafka-server-start.sh(位于bin目录),添加以下参数调整堆内存大小(建议初始堆内存与最大堆内存一致,避免频繁GC):export KAFKA_HEAP_OPTS="-Xms4G -Xmx4G"
若使用G1GC垃圾回收器(适合大内存场景),可添加:export KAFKA_JVM_PERFORMANCE_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35"
使修改生效。num.network.threads:处理网络请求的线程数,建议设置为CPU核心数的1~2倍(如4核CPU设置为4~8);num.io.threads:处理磁盘I/O的线程数,建议设置为CPU核心数的2~4倍(如4核CPU设置为8~16)。log.segment.bytes:日志段大小,建议设置为1GB(平衡日志切分频率与磁盘利用率);log.retention.hours:日志保留时间,根据业务需求设置(如72小时,避免磁盘空间浪费);socket.send.buffer.bytes/socket.receive.buffer.bytes:Socket缓冲区大小,建议设置为1MB(提升网络传输效率)。num.partitions),分区数应大于等于消费者线程数(如消费者组有8个消费者,分区数建议≥8),以充分利用并行处理能力。batch.size:批量发送消息的大小,建议设置为64KB~1MB(减少网络请求次数,提升吞吐量);linger.ms:消息等待时间,建议设置为10~100ms(在延迟与吞吐量间平衡);compression.type:消息压缩类型,建议使用snappy或lz4(减少网络传输开销,对延迟影响较小);acks:消息确认机制,建议设置为all(确保数据可靠性,若对可靠性要求不高可设置为1)。fetch.min.bytes:每次拉取的最小数据量,建议设置为1MB(减少网络请求次数);fetch.max.wait.ms:拉取数据的最大等待时间,建议设置为100~500ms(平衡延迟与吞吐量);max.poll.records:每次拉取的最大记录数,建议设置为200~500(避免单次处理过多数据导致延迟)。log.dirs目录),清理过期日志(通过log.retention.hours参数控制),确保磁盘空间充足(建议预留20%以上空间)。