У меня проблема с выполнением автоматического дампа кучи на подключенный постоянный том в Microsoft Azure AKS (Kubernetes).
Таким образом, ситуация выглядит следующим образом:
- Запуск программыс параметрами -Xmx200m вызывает исключение из-за нехватки памяти
- После сборки, нажатия и развертывания образа Docker через AKS после нескольких секунд модуль удаляется и перезапускается
- Я получил сообщение в hello.txt на подключенном томе, нофайл дампа не создается
В чем может быть причина такого поведения?
Моя тестовая программа выглядит следующим образом:
import java.io._
object Main {
def main(args: Array[String]): Unit = {
println("Before printing test info to file")
val pw = new PrintWriter(new File("/borsuk_data/hello.txt"))
pw.write("Hello, world")
pw.close
println("Before allocating to big Array for current memory settings")
val vectorOfDouble = Range(0, 50 * 1000 * 1000).map(x => 666.0).toArray
println("After creating to big Array")
}
}
My entrypoint.sh:
#!/bin/sh
java -jar /root/scala-heap-dump.jar -Xmx200m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/scala-heap-dump.bin
Мой Dockerfile:
FROM openjdk:jdk-alpine
WORKDIR /root
ADD target/scala-2.12/scala-heap-dump.jar /root/scala-heap-dump.jar
ADD etc/entrypoint.sh /root/entrypoint.sh
ENTRYPOINT ["/bin/sh","/root/entrypoint.sh"]
Мой развертывание yaml:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: scala-heap-dump
spec:
replicas: 1
template:
metadata:
labels:
app: scala-heap-dump
spec:
containers:
- name: scala-heap-dump-container
image: PRIVATE_REPO_ADDRESS/scala-heap-dump:latest
imagePullPolicy: Always
resources:
requests:
cpu: 500m
memory: "1Gi"
limits:
cpu: 500m
memory: "1Gi"
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: dynamic-persistence-volume-claim
dnsPolicy: ClusterFirst
hostNetwork: false
imagePullSecrets:
- name: regsecret
ОБНОВЛЕНИЕ: Как заметил lawrencegripper, первой проблемой было то, что модуль был убит OOMиз-за ограничений памяти в ямле.После изменения памяти на 2560Mi или выше (я пробовал даже такие нелепые значения в yaml, как CPU: 1000m и память 5Gi), я не вижу причин, по которым OOM убил.Однако файл дампа не создается, и при последнем состоянии прекращается сообщение другого типа.Причина: ошибка.К сожалению, это не очень полезно.Если кто-нибудь знает, как его сузить, помогите.
ОБНОВЛЕНИЕ 2: Я добавил несколько println в код, чтобы лучше понять, что происходит.Журналы для убитого модуля:
Before printing test info to file
Before allocating to big Array for current memory settings
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at scala.reflect.ManifestFactory$DoubleManifest.newArray(Manifest.scala:153)
at scala.reflect.ManifestFactory$DoubleManifest.newArray(Manifest.scala:151)
at scala.collection.TraversableOnce.toArray(TraversableOnce.scala:285)
at scala.collection.TraversableOnce.toArray$(TraversableOnce.scala:283)
at scala.collection.AbstractTraversable.toArray(Traversable.scala:104)
at Main$.main(Main.scala:12)
at Main.main(Main.scala)
Итак, как вы можете видеть, программа никогда не достигает: println ("После создания в большой массив").