降低 CentOS 上 Kafka 资源占用的实用方案
一 系统层优化
- 降低 swap 倾向,避免内存抖动与 I/O 放大:将 vm.swappiness=1,必要时配合 vm.dirty_background_ratio=5、vm.dirty_ratio=70,减少内核脏页回写对前台业务的干扰。
- 为 Kafka 数据目录选择高性能文件系统(如 XFS),并使用合适的 I/O 调度器(如 deadline/noop),挂载时建议 noatime,nodiratime 减少元数据写入。
- 适度放宽文件句柄与内存映射上限,避免 “Too many open files” 与 mmap 受限:
- limits.conf 或 limits.d 为运行用户设置 nofile=65536;
- systemd 服务单元增加 LimitNOFILE=65536;
- 提升 vm.max_map_count(如到 262144 或更高,视分区/段数量而定)。
- 网络栈优化(按带宽与延迟目标微调):提高 net.core.rmem_default/wmem_default=4MB、net.core.rmem_max/wmem_max=4MB,以及 net.ipv4.tcp_rmem/wmem=4096 65536 4194304,并适度增大 net.core.netdev_max_backlog、net.ipv4.tcp_max_syn_backlog,降低丢包与重传带来的额外负载。
二 Broker 配置优化
- 控制存储占用(最直接“降资源”的手段):
- 缩短保留:如 log.retention.hours=72;
- 合理段大小:如 log.segment.bytes=1073741824(1GB),减少小文件数量与目录扫描成本;
- 启用压缩:Broker 与 Producer 一致,优先 compression.type=lz4,降低磁盘与网络字节量。
- 降低复制与恢复压力:
- 适度提高 replica.lag.time.max.ms=60000,减少因瞬时抖动被踢出 ISR;
- 谨慎设置 unclean.leader.election.enable=false,以可用性换一致性,减少异常流量;
- 控制副本同步并发与单请求大小:num.replica.fetchers=4–8,并根据业务消息体调大 replica.fetch.max.bytes(常见大消息场景从默认 1MB 提升到数 MB,避免副本同步失败)。
- 线程与网络栈匹配硬件:
- num.network.threads≈CPU 核数+1;
- num.io.threads≈CPU 核数×2(不超过×3);
- 可按负载再调整 num.acceptor.threads、num.recovery.threads.per.data.dir。
- 减少不必要的刷盘与压缩开销:如无强持久化需求,避免过低的 log.flush.interval.messages/ms;保持 Broker 与 Producer 压缩算法一致,避免“解压-再压缩”。
三 JVM 层优化
- 堆大小“够用即可”:多数场景 -Xms=-Xmx=4–8GB 即可,避免过大堆导致 GC 停顿与内存压力;更精确做法是基于 KafkaServer-gc.log 中 Full GC 后存活集,将堆设为该值的 2–2.5 倍。
- 选择低停顿 GC:Kafka 3.x 在 JDK 11 下默认 G1GC,可配合 -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 等参数,减少停顿与 Full GC 风险。
- 容器/虚拟化部署时,确保容器内存上限 > JVM 堆,为堆外与 Page Cache 预留空间(例如堆 6G 时容器建议 ≥ 8G)。
四 客户端与运维策略
- 降低连接与重平衡开销:
- 消费者组设置 session.timeout.ms / heartbeat.interval.ms 合理比值,避免“抖动即重平衡”;
- 启用 group.instance.id(静态成员)减少短暂离线触发重平衡;
- 避免批量重启,采用滚动重启。
- 提升单次请求有效载荷,减少请求数与 CPU/网络开销:
- 生产者适度增大 batch.size 与 linger.ms(如 5–20ms);
- 消费者提高 fetch.max.bytes、max.poll.records;
- 在允许的场景下使用 acks=1(而非 all)以降低确认成本。
- 容量与并行度匹配:合理规划 分区数 与磁盘数量,避免单磁盘/单分区热点;必要时扩容 Broker 或调整分区分布。
五 快速检查与落地步骤
- 基线巡检:
- 查看句柄与 mmap:ulimit -n、cat /proc//limits、sysctl vm.max_map_count;
- 观察连接与文件压力:lsof -p | wc -l;
- 监控 ISR 与复制健康:kafka-topics.sh --describe --topic --bootstrap-server broker:9092;
- 关注关键 JMX:如 kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions。
- 建议变更顺序:
- 先收紧保留与段大小(立刻释放磁盘/文件句柄压力);
- 调整线程与网络栈(匹配 CPU/网卡);
- 优化副本与恢复参数(降低复制风暴);
- 最后微调 JVM 与客户端批量/确认策略(降低 CPU/网络/GC)。