部署的 java 程序,有个服务会时不时的 OOM ,想要 dump ,增加了启动参数。 请问各位大佬,我怎么取出 dump ,需要 yml 怎么配置,实际生产应该怎么搞给点建议,谢谢;
1
cheng6563 2023-04-26 09:14:49 +08:00
dump 那么大一坨,你得挂载个卷才行了。
|
2
wqsfree 2023-04-26 09:15:28 +08:00
|
3
Frankcox 2023-04-26 09:15:55 +08:00
如果就是要取出 dump ,可以 kubectl exec 进入容器执行 dump 命令,生成 dump 文件后 kubectl cp 出来到本地查看问题。
至于实际生产,这个应该要看你们公司的规范,这个我就不清楚了。 |
4
RRyo 2023-04-26 09:18:45 +08:00
挂个卷到
/opt/jvm/dump/ 然后启动参数加 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/jvm/dump/heapdump.hprof 崩了之后卷里的东西不会丢,直接 kubectl cp 取,如果是挂的 nfs 之类的,直接从 nfs 取 |
5
Sum0l 2023-04-26 09:22:42 +08:00
1\2\4 楼结合起来
另外 java 程序可以设置 XX:MaxRAMPercentage 参数,提高 ram 的利用率 |
7
cmai 2023-04-26 09:52:38 +08:00
老问题了,我也提过相同的问题,你要考虑几个问题
1.当你的程序 OOM 的时候,POD 是不是也内存满了,你需要在你 POD 保活的前提下再去 dump ,不然还没 dump 完,pod 就被重启了 2.当你使用挂载卷的形式的时候,如果你有多个 java 程序,他们的 dump 文件是不是会互相覆盖呢? |
8
Vraw5 2023-04-26 10:17:32 +08:00
要是没那么正规,node 节点你也能登录进去。可以直接 dump ,然后去 pod 对应的 node 上面,找到 pod 的磁盘目录,把 dump 拿过来
|
9
90xchun 2023-04-26 10:38:55 +08:00 via iPhone
建议你可以每个一段时间 dump 一次,其实不用真的 OOM 的时候再想着 dump 得。dump 文件如果是越来越大直接扔给开发看就可以了,如果是某个请求导致的,会复杂一些,可以加入 gclog 分析对应时间的请求。也可以尝试在测试环境使用更小的内存得,以不影响实际的产品环境得
|