1. 调整JVM堆内存大小
ZooKeeper运行在JVM上,其内存消耗主要由堆内存配置决定。需根据服务器物理内存大小调整-Xms(初始堆大小)和-Xmx(最大堆大小),推荐设置为物理内存的1/3左右(如4GB内存服务器可设为1.3GB),避免过大导致GC停顿或过小引发频繁Full GC。修改路径为ZooKeeper安装目录下的zkServer.sh文件(通常位于bin目录),找到JVMFLAGS变量并添加参数,例如:export JVMFLAGS="-Xms1g -Xmx2g -XX:+UseG1GC"(-XX:+UseG1GC为推荐的垃圾收集器,平衡吞吐量与延迟)。
2. 禁用或减少交换分区(Swap)使用
交换分区会导致内存与磁盘频繁交换,严重影响ZooKeeper性能。建议完全禁用Swap(若服务器内存充足)或通过内核参数限制其使用:
swapoff -a命令(临时生效),并编辑/etc/fstab文件删除或注释Swap相关行(永久生效);sysctl命令设置vm.swappiness=1(值越小越优先使用物理内存,范围0-100),例如:sysctl -w vm.swappiness=1,并添加到/etc/sysctl.conf文件实现永久生效。3. 优化ZooKeeper配置文件参数
调整zoo.cfg文件中的关键参数,提升内存使用效率:
tickTime:基础时间单位(默认2000毫秒),可根据集群规模适当减小(如1000毫秒),减少心跳等待时间;initLimit:Leader与Follower初始同步的最大心跳数(默认5),若集群节点多可适当增大(如10);syncLimit:Leader与Follower同步的最大心跳数(默认2),根据网络延迟调整(如网络延迟高可设为3);maxClientCnxns:单个客户端的最大连接数(默认无限制),建议设置为60-100,防止过多连接占用内存;autopurge.snapRetainCount(保留快照数量,默认3)和autopurge.purgeInterval(清理间隔,默认0,即不启用),例如设置为autopurge.snapRetainCount=5、autopurge.purgeInterval=1(每天清理一次),定期删除旧快照和事务日志,释放磁盘空间(间接优化内存)。4. 监控内存使用状态
定期监控ZooKeeper内存使用情况,及时发现异常:
top、htop命令查看ZooKeeper进程的内存占用(RES列表示物理内存使用量);jmxremote)监控堆内存使用率、GC次数及耗时;zookeeper_memory_used、zookeeper_gc_time_ms等指标,设置告警阈值(如堆内存使用率超过80%触发告警)。5. 硬件与环境优化
6. 清理日志文件
定期清理ZooKeeper的日志文件(位于dataLogDir目录,默认为/var/lib/zookeeper/logs),减少磁盘空间占用。可通过logrotate工具配置自动轮转(如按天分割日志,保留7天),或手动删除旧日志(需停止ZooKeeper服务后操作)。