这里记录下经过压测后, 我们推荐的线上配置

bin/kafka-server-start.sh

if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
    export KAFKA_HEAP_OPTS="-Xmx16G -Xms16G"
    export KAFKA_JVM_PERFORMANCE_OPTS="-server -XX:PermSize=48m -XX:MaxPermSize=48m -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+DisableExplicitGC -Djava.awt.headless=true -XX:+ExitOnOutOfMemoryError"
fi

其实, 最主要的重点是, 内存的大小设置, 官方推荐的8G内存并不比16G高效, 当然也不是越大越好, 30G的内存配置跑分并没有16G高.

server.config配置

broker.id=0
port=9098
advertised.host.name=
num.network.threads=32
num.io.threads=200
socket.send.buffer.bytes=1048576
socket.receive.buffer.bytes=1048576
socket.request.max.bytes=104857600
log.dirs=xxxxxx 
num.partitions=40
num.recovery.threads.per.data.dir=2
log.retention.hours=48
log.retention.bytes=274877906944
log.segment.bytes=536870912
log.retention.check.interval.ms=300000
log.cleaner.enable=true   
zookeeper.connect=xxxxx 
zookeeper.session.timeout.ms=120000
zookeeper.connection.timeout.ms=60000
auto.create.topics.enable=false 
num.replica.fetchers=4
replica.fetch.max.bytes=4194304
message.max.bytes=4194304
queued.max.requests=200
auto.leader.rebalance.enable=false
replica.lag.max.messages=4000000
inter.broker.protocol.version=0.10.1.0
log.message.format.version=0.8.2.1
delete.topic.enable=true
offsets.retention.minutes=4320
controller.socket.timeout.ms=120000
advertised.listeners=SASL_PLAINTEXT://:,PLAINTEXT://:
listeners=SASL_PLAINTEXT://:,PLAINTEXT://:
security.inter.broker.protocol=PLAINTEXT
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN

其中, log.dirs 每个磁盘一个目录, 保证磁盘的高效. 磁盘使用HDD就可以, 没必要使用ssd, 即使HDD, 在压测情况下也能达到 100+qps, 已经很高效了, 没必要浪费资源.

这里配置处理线程数目 num.io.threads=20. 单partition压测的时候, 建议设置成1, 因为partiton的写操作有锁, 频繁的等待、唤醒 和上下文切换会造成很大的代价.

机器信息

256GB 48C 10HDD*10T