Kafka在Ubuntu上的资源分配策略
Kafka的内存使用主要分为JVM堆内存和操作系统级内存两部分,需根据服务器规格和业务需求合理分配:
KAFKA_HEAP_OPTS环境变量配置。建议设置为物理内存的1/4~1/2(生产环境避免超过8GB,防止GC停顿过长)。export KAFKA_HEAP_OPTS="-Xms4G -Xmx4G"
可通过Kafka启动脚本(kafka-server-start.sh)或系统环境变量文件(如/etc/profile.d/kafka.sh)设置,修改后需重启服务生效。vm.swappiness=1,减少内存不足时的磁盘交换):sudo sysctl -w vm.swappiness=1
echo "vm.swappiness=1" | sudo tee -a /etc/sysctl.conf
echo "* soft nofile 100000" | sudo tee -a /etc/security/limits.conf
echo "* hard nofile 100000" | sudo tee -a /etc/security/limits.conf
echo "net.core.rmem_max=16777216" | sudo tee -a /etc/sysctl.conf
echo "net.core.wmem_max=16777216" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Kafka的CPU消耗主要集中在网络I/O和磁盘I/O处理,需根据CPU核心数调整线程池参数:
num.network.threads:处理网络请求的线程数,建议设置为CPU核心数的1~2倍(如4核CPU设置为4~8)。num.io.threads:处理磁盘I/O的线程数,建议设置为CPU核心数的2~3倍(如4核CPU设置为8~12)。server.properties文件):num.network.threads=8
num.io.threads=12
num.partitions)可提升并行处理能力,建议分区数与消费者线程数匹配(如每个消费者处理1个分区),但需避免过多分区导致ZooKeeper压力过大。Kafka是磁盘密集型应用,磁盘性能直接影响吞吐量和延迟,需优先选择SSD(或NVMe SSD),并优化目录配置:
log.dirs参数指定多个日志目录(建议挂载到不同物理磁盘),提升磁盘I/O并行能力。示例:log.dirs=/mnt/disk1/kafka-logs,/mnt/disk2/kafka-logs,/mnt/disk3/kafka-logs
log.retention.hours:设置消息保留时间(如7天=168小时),避免磁盘空间无限增长。log.segment.bytes:设置日志段大小(如1GB),便于快速清理过期数据。log.retention.hours=168
log.segment.bytes=1073741824
atime选项(减少磁盘写入):/etc/fstab,在挂载项中添加noatime(如/dev/sdb1 /mnt/disk1 ext4 defaults,noatime 0 0)。echo "vm.dirty_background_ratio=10" | sudo tee -a /etc/sysctl.conf
echo "vm.dirty_ratio=20" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Kafka的高吞吐量依赖网络性能,需优化网络参数和带宽:
num.network.threads:已包含在CPU分配中(见上文)。socket.send.buffer.bytes/socket.receive.buffer.bytes:设置Socket发送/接收缓冲区大小(如1MB),提升网络传输效率。示例:socket.send.buffer.bytes=1048576
socket.receive.buffer.bytes=1048576
echo "net.ipv4.tcp_window_scaling=1" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_rmem=4096 87380 16777216" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_wmem=4096 65536 16777216" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p