Kafka在Linux系统中的性能调优技巧
noatime选项(禁用文件访问时间更新,减少不必要的磁盘写操作),例如:mount -o noatime /dev/sdb1 /kafka/logs。vm.swappiness(虚拟内存交换倾向)为1-10(默认60,值越小越避免内存交换,减少磁盘I/O延迟);设置vm.dirty_background_ratio(后台脏页刷新比例)为5-10(控制脏页写入磁盘的时机,避免集中刷盘导致性能波动);设置vm.dirty_ratio(强制脏页刷新阈值)为10-20(防止单个进程占用过多内存)。ulimit -n 65536命令临时增加Kafka进程可打开的文件描述符数量(默认1024远不够),并在/etc/security/limits.conf中永久配置(如kafka hard nofile 65536),避免因文件描述符耗尽导致连接拒绝。net.core.rmem_max=16777216、net.core.wmem_max=16777216),调整TCP接收/发送窗口初始大小(net.ipv4.tcp_rmem="4096 87380 16777216"、net.ipv4.tcp_wmem="4096 65536 16777216"),提升网络吞吐量;增加net.core.somaxconn(监听队列最大长度)为32768(应对高并发连接请求),net.ipv4.tcp_max_syn_backlog(SYN队列长度)为8192(减少连接建立延迟)。num.network.threads(处理网络请求的线程数,通常为CPU核心数的1-2倍,默认3);根据磁盘数量和性能设置num.io.threads(处理磁盘I/O的线程数,通常为磁盘数量的1-2倍,默认8)。例如,4核CPU、2块SSD磁盘可设置为num.network.threads=8、num.io.threads=4。log.segment.bytes(日志段文件大小,超过则滚动新段)为1GB(默认1GB,更大的段减少段文件数量,降低索引维护开销);设置log.retention.hours=168(日志保留时间,根据业务需求调整为1-7天,默认168小时);选择合适的log.cleanup.policy(日志清理策略),delete(按时间/大小删除,适合吞吐量优先)或compact(按key压缩,适合消息不重复的场景,如订单状态变更)。num.partitions(主题分区数,需大于等于消费者数量,且随集群规模增长逐步增加,例如初期10个消费者可设为10-20,后续根据吞吐量需求扩容);设置default.replication.factor=3(默认副本因子,确保数据高可用,避免单点故障)。log.flush.interval.messages(累计消息数触发刷盘)为10000-50000(默认1000,更大的值减少刷盘次数,提高吞吐量);设置log.flush.interval.ms(累计时间触发刷盘)为1000-5000ms(默认1000,更大的值平衡持久性与性能)。注意:若对数据可靠性要求极高(如金融场景),可适当降低这些值,但会牺牲部分吞吐量。-Xms8g -Xmx8g(初始堆与最大堆一致,避免动态扩展带来的停顿)。避免堆内存过大(如超过16GB),否则会增加Full GC时间。-XX:+UseG1GC),适合大内存堆(如8GB以上),通过并发标记和整理减少停顿时间;设置-XX:MaxGCPauseMillis=200(最大GC停顿时间目标,单位毫秒,默认200,可根据业务容忍度调整);设置-XX:InitiatingHeapOccupancyPercent=45(触发并发GC的堆占用率,默认45,值越大GC频率越低,但可能增加单次GC时间)。socket.send.buffer.bytes(发送缓冲区大小,默认100KB)和socket.receive.buffer.bytes(接收缓冲区大小,默认100KB)为128KB-1MB(例如socket.send.buffer.bytes=131072、socket.receive.buffer.bytes=131072),提升网络数据传输效率。socket.request.max.bytes(单个请求最大字节数,默认100MB)为100MB-500MB(例如socket.request.max.bytes=52428800),避免大请求阻塞Broker,但需确保不超过操作系统和网络的MTU限制。sendfile系统调用(零拷贝),将数据从磁盘直接传输到网络,减少内核空间与用户空间的数据拷贝次数,显著提高大文件传输性能(如日志批量发送)。batch.size(批量发送的消息字节数,默认16KB)为32KB-1MB(例如batch.size=32768),减少网络请求次数;设置linger.ms(批量发送等待时间,默认0)为10-100ms(允许更多消息填充批次,提高吞吐量,但会增加延迟);选择合适的compression.type(压缩类型,默认none),推荐lz4(压缩率高且CPU开销小,适合大多数场景)或snappy(压缩速度快,适合延迟敏感场景)。fetch.min.bytes(每次拉取的最小数据量,默认1字节)为1KB-1MB(例如fetch.min.bytes=2048),减少网络请求次数;设置fetch.max.wait.ms(拉取最大等待时间,默认500ms)为100-500ms(平衡吞吐量与延迟,等待时间内若未达到fetch.min.bytes则返回当前数据);增加max.partition.fetch.bytes(每个分区拉取的最大字节数,默认1MB)为2MB-4MB(例如max.partition.fetch.bytes=2097152),适应高吞吐量场景。Broker(CPU、内存、磁盘I/O、网络吞吐量)、Topic(分区数、副本同步状态、消息堆积)、Producer(发送速率、延迟、错误率)、Consumer(消费速率、滞后量、错误率)等指标,实时掌握集群状态。log.dirs目录下的旧段文件),确保磁盘空间充足(建议预留20%以上空间);定期进行压力测试(如使用Kafka自带的kafka-producer-perf-test和kafka-consumer-perf-test工具),评估集群性能瓶颈并及时调整配置。