Kafka在CentOS系统上的资源利用优化策略
ulimit -n 65535命令临时调整,或修改/etc/security/limits.conf永久生效(添加* soft nofile 65535; * hard nofile 65535),避免因文件描述符不足导致连接拒绝。vm.swappiness=1(禁用或极小化swap,防止磁盘I/O拖慢性能);vm.dirty_background_ratio=10(后台脏页刷新阈值)、vm.dirty_ratio=20(强制刷新阈值),平衡内存与磁盘I/O;net.core.rmem_default=262144、net.core.wmem_default=262144、net.core.rmem_max=16777216、net.core.wmem_max=16777216,提升网络吞吐量;net.core.somaxconn=65535,避免连接队列溢出。noatime选项(如/dev/sdb1 /kafka-logs ext4 defaults,noatime 0 0),减少文件访问时间的更新操作,降低磁盘负载。server.properties中配置多个log.dirs(如/data1/kafka-logs,/data2/kafka-logs),Kafka会将分区数据分布到多个目录,提升磁盘并行IO能力。num.network.threads(网络请求处理线程):设置为CPU核心数+1(如8核设置为9);num.io.threads(磁盘IO处理线程):设置为CPU核心数的2倍(如8核设置为16)。这些线程数需匹配CPU核心数,避免线程过多导致上下文切换开销。taskset命令将Kafka进程绑定到特定CPU核心(如taskset -c 0-7 /usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties),减少缓存失效,提升CPU利用率。-Xms4G -Xmx4G),避免过大(导致GC停顿)或过小(频繁GC)。推荐使用G1垃圾回收器(-XX:+UseG1GC),减少Full GC次数。vm.overcommit_memory=1(允许内存超额分配),并监控free -m命令输出,确保系统有足够可用内存。num.partitions(如每秒10万条消息可设置100-200个分区)。default.replication.factor(副本数)设置为3(生产环境推荐),确保数据可靠性。调整replica.lag.time.max.ms(副本同步超时时间,如60000ms),避免因副本滞后导致 leader 切换频繁。batch.size:设置为1MB(如batch.size=1048576),将多个小消息合并为一个大消息发送,减少网络请求次数;linger.ms:设置为100ms以上(如linger.ms=100),让生产者等待一段时间以积累更多消息,提高批量效率;compression.type:启用压缩(如lz4或snappy),减少网络传输数据量和磁盘存储占用(压缩率约为2-5倍)。fetch.max.bytes:设置为1MB(如fetch.max.bytes=1048576),每次从Broker拉取更多数据,减少网络请求;max.poll.records:设置为500-1000(如max.poll.records=1000),每次poll操作返回更多记录,提高消费吞吐量;session.timeout.ms=30000(会话超时时间)、heartbeat.interval.ms=10000(心跳间隔),并使用group.instance.id(静态成员资格),减少因消费者重启导致的rebalance。top(CPU)、free -m(内存)、df -h(磁盘)、iotop(磁盘I/O)、nload(网络)等命令实时监控CentOS资源;通过Kafka自带的JMX指标(如kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec)监控消息吞吐量。num.io.threads;磁盘I/O过高则优化分区分布或升级SSD);定期清理过期日志(通过log.retention.ms或log.retention.bytes设置保留策略),避免磁盘空间耗尽。