1. 操作系统级内存优化
vm.swappiness内核参数至0(彻底禁用)或较低值(如10),减少系统使用交换分区的倾向;若物理内存充足,可直接关闭交换分区(swapoff -a)。/etc/security/limits.conf,添加zookeeper soft nofile 65536和zookeeper hard nofile 65536(zookeeper为运行服务的用户),避免因文件描述符耗尽导致内存分配失败。2. JVM堆内存精准调优
-Xms(初始堆大小)和-Xmx(最大堆大小)设置为物理内存的1/3至1/2(如8GB物理内存可设为-Xms4g -Xmx4g),避免过大堆内存导致Full GC停顿或过小堆内存引发频繁GC。-XX:+UseG1GC),其针对大堆内存设计,能减少GC停顿时间;若使用Java 17及以上版本,可尝试ZGC(-XX:+UseZGC),进一步降低停顿至亚毫秒级。同时,调整GC相关参数(如-XX:MaxGCPauseMillis=200)优化停顿时间。3. Zookeeper配置参数优化
tickTime(基本时间单位,默认2000ms)决定了Zookeeper的心跳间隔和超时计算。根据集群规模减小tickTime(如1000ms),可加快节点间通信速度,减少因超时等待导致的内存占用;同步调整initLimit(初始化连接超时,默认5*tickTime)和syncLimit(同步超时,默认2*tickTime),避免过长超时占用内存。maxClientCnxns参数限制每个客户端IP的最大连接数(如maxClientCnxns=100),防止恶意或异常客户端发起大量连接,消耗服务器内存资源。zoo.cfg中配置autopurge.snapRetainCount=3(保留最近3个快照)和autopurge.purgeInterval=24(每24小时执行一次清理),定期删除旧的快照文件和事务日志,释放磁盘空间及关联的内存缓存。4. 监控与持续优化
jvm_memory_used(JVM内存使用量)、jvm_gc_pause(GC停顿时间)、zk_memory_heap_used(堆内存使用)等指标,及时发现内存异常增长。jmap(jmap -histo:live <pid>)查看堆内存中的对象分布,或使用valgrind检测原生内存泄漏;关注Zookeeper日志中的WARN/ERROR级别信息(如OutOfMemoryError),快速定位内存问题根源。5. 硬件与环境优化
dataDir(快照目录)和dataLogDir(事务日志目录)指向SSD设备,提升I/O性能,减少因磁盘读写缓慢导致的内存等待;建议将快照与日志分开存储(如dataDir=/var/lib/zookeeper/snapshot,dataLogDir=/var/log/zookeeper),避免I/O竞争。