首页 > 解决方案 > 多个 pod 上的 Openshift 3.11 堆转储 OOM

问题描述

在运行 OpenShift 3.11 的应用程序上,我试图获取 HeapDump,因为我怀疑我的 pod 上存在 OOM。

我的应用程序在 14 个副本上运行,我想将以下配置附加到 Java 选项

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=file:///my/path/jdump/

该路径位于外部安装的卷上。

现在我知道默认文件名是

java_pid1.hprof 

但从一个

ps -ef | grep java

我注意到大多数 pod 对进程使用相同的pid,我担心如果同时在多个 pod 上发生 OOM,我会遇到当代访问和写入文件的问题。

有没有办法参数化文件名?我想像

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=file:///my/path/jdump/{$podname}_dump.href

非常感谢您的友好回答

标签: openshiftheap-dump

解决方案


您可以将 pod 名称公开为 env 变量,然后在您的命令中使用它,即

      command: [ "/bin/java"]
      args:
      - "-jar"
      - "your.jar"
      - "-XX:+HeapDumpOnOutOfMemoryError"
      - "-XX:HeapDumpPath=file:///my/path/jdump/$(MY_POD_NAME)_dump.href"
      env:
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name

注意 $(MY_POD_NAME) 语法 - 参考https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#use-environment-variables-to-define-arguments

将字段公开为环境变量:https ://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/#use-pod-fields-as-values-for-environment-variables


推荐阅读