ZooKeeper JVM与磁盘调优
JVM和磁盘调优是性能优化关键。
JVM内存调优
内存配置参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
| -Xmx | 1G | 最大堆内存 |
| -Xms | 1G | 初始堆内存 |
| -XX:MaxDirectMemorySize | 堆大小 | 直接内存 |
配置方式:
Bash
# zkEnv.sh
export JVMFLAGS="-Xmx4G -Xms4G -XX:MaxDirectMemorySize=1G"
内存分配原则:
| 场景 | 堆内存建议 |
|---|---|
| 节点数<10万 | 1-2G |
| 节点数10-100万 | 2-4G |
| 节点数>100万 | 4-8G |
GC策略选择:
G1 GC(推荐):
Bash
-XX:+UseG1GC
-XX:MaxGCPauseMillis=50 # 最大GC停顿50ms
-XX:InitiatingHeapOccupancyPercent=35
CMS GC(旧版本):
Bash
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=70
GC参数说明:
| 参数 | 说明 |
|---|---|
| MaxGCPauseMillis | GC停顿目标时间 |
| InitiatingHeapOccupancyPercent | 触发GC的堆占用比例 |
内存监控:
Bash
# 查看GC状态
jstat -gc <pid> 1000
# 查看内存使用
jmap -histo <pid> | head -20
调优建议:
| 建议 | 说明 |
|---|---|
| 堆内存固定 | Xms=Xmx避免动态调整 |
| 不宜过大 | 大堆增加GC停顿 |
| G1低延迟 | MaxGCPauseMillis控制 |
注意:堆内存不宜过大,GC停顿影响请求延迟。
磁盘IO优化
关键配置:
| 参数 | 说明 |
|---|---|
| dataDir | 快照目录 |
| dataLogDir | 事务日志目录(单独磁盘) |
| preAllocSize | 日志预分配大小 |
分离存储配置:
properties
# zoo.cfg
dataDir=/disk1/zookeeper/snapshot
dataLogDir=/disk2/zookeeper/log # 单独磁盘
preAllocSize=65536 # 预分配64KB
磁盘选型建议:
| 场景 | 推荐磁盘 |
|---|---|
| 高QPS | SSD单独挂载 |
| 中等QPS | SAS磁盘RAID10 |
| 低QPS | 普通磁盘 |
预分配作用:
Bash
事务日志写入前预分配空间
避免写入时动态分配磁盘空间
减少IO抖动,提升写入性能
IO调度策略:
Bash
# 查看当前调度
cat /sys/block/sda/queue/scheduler
# 设置deadline调度(推荐)
echo deadline > /sys/block/sda/queue/scheduler
调度策略对比:
| 策略 | 说明 |
|---|---|
| cfq | 完全公平队列(默认) |
| deadline | 保证请求延迟 |
| noop | 简单队列 |
文件系统优化:
text
# XFS文件系统(推荐)
mkfs.xfs -f /dev/sdb
# 挂载选项
mount -o noatime,nobarrier /dev/sdb /disk2
优化效果:
| 优化 | 效果 |
|---|---|
| 日志单独磁盘 | 减少IO竞争 |
| SSD存储 | 提升写入速度 |
| 预分配 | 减少IO抖动 |
| deadline调度 | 保证延迟 |
提示:事务日志写入是性能瓶颈,必须单独磁盘。
要点总结
- JVM堆内存根据节点数配置,1-8G范围
- Xms=Xmx固定堆内存,避免动态调整
- G1 GC适合低延迟场景,控制停顿时间
- 事务日志单独磁盘是性能关键
- SSD存储显著提升写入性能
- preAllocSize预分配减少IO抖动
- deadline调度策略保证IO延迟
📝 发现内容有误?点击此处直接编辑