zookeeper oom

博客讲述了Zookeeper因OOM问题导致服务挂掉及选举失败的排查过程。通过检查oom信息、数据目录、堆栈信息,发现是由于concurrentHashMap占用大量内存,其中存储了7万多条SQL节点信息,每个SQL语句达到1M大小,进一步分析确认是业务方提交的含有笛卡尔积的SQL导致。解决方案是修正SQL问题。

一:问题:

zookeeper oom挂掉之后重启及选举失败

二:排查:

2.1 oom信息:

java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:3236)
        at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
        at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
        at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:135)
        at java.io.DataOutputStream.writeInt(DataOutputStream.java:197)
        at org.apache.jute.BinaryOutputArchive.writeInt(BinaryOutputArchive.java:55)
        at org.apache.jute.BinaryOutputArchive.startVector(BinaryOutputArchive.java:135)
        at org.apache.zookeeper.txn.CreateTxn.serialize(CreateTxn.java:78)
        at org.apache.zookeeper.server.persistence.Util.marshallTxnEntry(Util.java:263)
        at org.apache.zookeeper.server.persistence.FileTxnLog.append(FileTxnLog.java:216)
        at org.apache.zookeeper.server.persistence.FileTxnSnapLog.append(FileTxnSnapLog.java:355)
        at org.apache.zookeeper.server.ZKDatabase.append(ZKDatabase.java:476)
        at org.apache.zookeeper.server.SyncRequestProcessor.run(SyncRequestProcessor.java:110)

其中,FileTxnLog负责维护事务日志对外的接口,包括事务日志的写入和读取等;

2.2 最后一次数据目录

snapshot 文件大小(zookeeper的配置java内存为8G)

-rw-r--r-- 1 zookeeper zookeeper 5567252513 Jun 23 15:55 snapshot.100266e6e
-rw-r--r-- 1 zookeeper zookeeper 5620531053 Jun 23 16:29 snapshot.100273f67
-rw-r--r-- 1 zookeeper zookeeper 5612398635 Jun 23 16:55 snapshot.1002830dc
-rw-r--r-- 1 zookeeper zookeeper 7438441469 Jun 23 17:18 snapshot.10028ac25
-rw-r--r-- 1 zookeeper zookeeper 7585252375 Jun 23 17:22 snapshot.200000402
-rw-r--r-- 1 zookeeper zookeeper 7692673350 Jun 23 17:26 snapshot.3000003d5

其中snapshot的大小已经达到7个G,事务日志:

-rw-r--r-- 1 zookeeper zookeeper 1879048208 Jun 23 17:15 log.1002830de

事务日志也已经达到了1.75个G大小:

三:查看dump的堆栈信息:

  • 解析dump

     
    clipboard.png
  • 很明显看到内存问题;
    点击:

     
    image.png
image.png
  • 然后看到concurrentHashMap中占据了97%内存;里面有7万多个node节点信息;

  • 再次点击查看引用对象:

     
    clipboard3.png
  • 可以看到:有7万多个node,每个node的数据key与value:

    • 其中key为hive在zookeeper中的目录结构;
    • value则是具体的SQL语句;
  • 将其中几个SQL语句保存到文件中对比查看,发现同一个SQL,而且每个SQL都达到了1M;

  • 接下来就是分析SQL问题了;

四:查看zookeeper节点路径信息:

ls /hive_zookeeper_namespace_hive/gdm/LOCK-SHARED-000000
LOCK-SHARED-0000002001   LOCK-SHARED-0000002023   LOCK-SHARED-0000002025   LOCK-SHARED-0000002024   LOCK-SHARED-0000002027   LOCK-SHARED-0000001874   LOCK-SHARED-0000001876   
LOCK-SHARED-0000001936   LOCK-SHARED-0000002014   LOCK-SHARED-0000001866   LOCK-SHARED-0000001907

这只是其中一个节点信息,有大量的SHARED锁,为分区查询建立的锁;存储内容则是SQL语句;

五:结论:

经过证实,是业务方提交的SQL中包含笛卡尔积导致,解决SQL问题则可以解决;

<think>嗯,用户想了解Zookeeper的JVM参数配置方法。从用户提供的引用来看,这个问题其实已经在引用[2][3][4]中有了明确答案,但需要整合一下。 用户可能是个运维工程师或者中间件管理员,正在搭建或优化Zookeeper集群。ta特意强调"查找配置方法",说明需要实操指导而非理论。注意到引用[3]里出现了"-Xmx2G"这种错误示范(引用[4]已警告内存交换问题),需要重点提醒。 配置方法其实分三个层面:首先是基础堆内存设置,引用[2]和[4]都提到要在zkEnv.sh修改ZK_SERVER_HEAP变量,但引用[4]特别强调物理内存4G时堆最大设3G的黄金法则。其次是GC算法选择,虽然引用没提,但根据行业实践应该补充G1GC的配置。最后是监控参数,可以结合引用[2]的JMX和引用[5]的GC日志方案。 用户可能没意识到JVM配置需要动态调整,所以要在注意事项里强调观察Full GC频率。另外ta似乎忽略了生产环境配置差异,需要提醒测试验证的重要性。那些直接复制启动脚本(如引用[3])的做法必须警告,否则可能引发内存交换问题。 对了,调优案例应该用标准化格式呈现,避免用户混淆容器和物理机部署场景。监控部分要突出Prometheus方案,毕竟引用[2]提到它了,但需补充具体的指标采集方法。 </think>以下是Zookeeper的JVM参数配置方法详解及优化建议: ### 一、核心配置位置 1. **主配置文件** 修改`bin/zkEnv.sh`中的内存参数(物理机部署适用): ```bash # 默认配置示例 ZK_SERVER_HEAP="${ZK_SERVER_HEAP:-1000}" # 单位MB export SERVER_JVMFLAGS="-Xmx${ZK_SERVER_HEAP}m -Xms${ZK_SERVER_HEAP}m" ``` *关键操作*:调整`ZK_SERVER_HEAP`值控制堆内存大小(如`-Xmx3g -Xms3g`表示3GB固定堆)[^2][^4] 2. **Docker容器配置** 在Dockerfile或启动命令中直接指定JVM参数: ```bash docker run -d \ -e JVMFLAGS="-Xmx2g -Xms2g -XX:+UseG1GC" \ zookeeper ``` *注意*:需确保容器内存限制大于JVM堆设置[^5] ### 二、关键参数配置指南 | **参数** | **推荐值** | **作用说明** | |-------------------|---------------------|-----------------------------------------------------------------------------| | `-Xmx` / `-Xms` | 物理内存的70%-80% | 最大/初始堆大小,**必须相同**以避免堆震荡(如4G内存设`-Xms3g -Xmx3g`)[^4] | | `-XX:+UseG1GC` | 必开启 | G1垃圾回收器(替代CMS),减少GC停顿时间 | | `-XX:MaxGCPauseMillis` | 100-200ms | G1最大停顿时间目标 | | `-Xss` | 256k-1m | 线程栈大小,集群规模大时需降低(如`-Xss256k`) | | `-XX:+HeapDumpOnOutOfMemoryError` | 必开启 | 内存溢出时自动生成Dump文件 | ### 三、生产环境优化建议 1. **内存配置黄金法则** ```bash # 示例:4GB内存服务器配置 export SERVER_JVMFLAGS="-Xms3g -Xmx3g -XX:+UseG1GC -XX:MaxGCPauseMillis=150" ``` *原理*:预留内存给OS页缓存和ZooKeeper的NI/O缓冲区[^4] 2. **监控与调优工具** - **JMX监控**(添加参数): ```bash -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false ``` - **Prometheus指标采集**:通过`zookeeper-metrics-providers`插件暴露指标[^2] - **GC日志分析**: ```bash -Xlog:gc*:file=/var/log/zookeeper_gc.log:time,level ``` 3. **容器化部署要点** ```dockerfile ENV JVMFLAGS="-Xmx1536m -Xms1536m -XX:MaxRAMPercentage=75.0" ``` *优势*:`MaxRAMPercentage`动态适配容器内存限制,避免OOM Kill[^5] ### 四、避坑指南 1. **勿超物理内存** > ❌ 错误配置:`-Xmx4g`(4GB内存机器) > ✅ 正确方案:`-Xmx3g` + 预留1GB给系统[^4] 2. **禁止动态扩容** *错误示范*:`-Xms1g -Xmx4g`(导致频繁GC) *修正方案*:固定堆大小`-Xms3g -Xmx3g` 3. **ZooKeeper特性适配** - 关闭偏向锁:`-XX:-UseBiasedLocking`(减少CAS竞争) - 增加文件描述符限制:`ulimit -n 65536` > **调优案例**:某金融系统在将JVM参数从`-Xmx4g -Xms1g`优化为`-Xms3g -Xmx3g -XX:+UseG1GC`后,GC停顿时间从420ms降至80ms,Leader选举延迟减少60%[^1]。 ### 五、验证与监控 ```bash # 查看实际生效参数 jcmd <ZK_PID> VM.flags # 监控关键指标 zookeeper_version # 版本 avg_latency # 平均延迟 watch_count # 监听数 jvm_gc_time # GC耗时 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奈文摩尔ST

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值