Метрика KubernetesContainer_memory_usage_bytes — из чего она состоит помимо кучи JVM и некучной памяти ⇐ JAVA
-
Anonymous
Метрика KubernetesContainer_memory_usage_bytes — из чего она состоит помимо кучи JVM и некучной памяти
У меня есть микросервисы Java Spring-Boot, работающие в Kubernetes (AWS EKS) с сервисной сеткой Istio. Итак, под K8S имеет два контейнера: сам сервис и istio-proxy. Я пытаюсь понять, почему контейнер «служба» потребляет больше памяти, чем сумма значений кучи и не кучи JVM, и такое поведение наблюдается всеми службами, разница составляет примерно 400–600 МБ.
Память контейнера K8S не освобождает память кучи JVM, поэтому учитывается максимальное значение памяти кучи JVM с момента запуска модуля, а не текущее значение. Давайте посмотрим на конкретный модуль, выполнив kubectl описать pod :
Контейнеры: услуга: Ограничения: память: 1408Ми Запросы: память: 1408Ми istio-прокси: Ограничения: память: 512Ми Запросы: память: 512Ми и JAVA_OPTS для службы: -Xms640m -Xmx640m -XX:+UseG1GC
Значения метрик (я преобразовал все значения в мебибайты, МиБ):
[*]
sum(jvm_memory_used_bytes{pod="pod_id", area="heap",Container="service"}) составляет максимум 618 МБ — максимальное использование кучи jvm с момента запуска модуля [*]sum(jvm_memory_used_bytes{pod="pod_id", area="nonheap",Container="service"}) составляет максимум 215 МБ – максимальное использование jvm без кучи [*]так что общее использование jvm составляет максимум 833 МБ (сумма двух вышеуказанных показателей)
[*]
container_memory_usage_bytes{container="service", pod="pod_id" — 1251 МБ
[*]
Значения container_memory_working_set_bytes и container_memory_usage_bytes почти одинаковы с небольшой разницей в МБ.
Я также просмотрел каталог модуля /sys/fs/cgroup/memory, но не нашел основной причины. Вот что у нас есть:
[*]внутри Memory.stat: кэш составляет 13,66 МБ [*]inactive_file — 0,4 МБ [*]active_file – 13 МБ. [*]memory.kmem.usage_in_bytes — 9 МБ
Основываясь на этих показателях, неясно, почему разница между container_memory_usage_bytes и максимальным общим количеством jvm (сумма кучи и не кучи) составляет 418 МБ. На что оно может быть выделено? Это какие-то кэши контейнеров, общая память, собственные возможности ОС или что-то еще? Какие метрики или файлы/процессы модулей могут помочь в этом?
У меня есть микросервисы Java Spring-Boot, работающие в Kubernetes (AWS EKS) с сервисной сеткой Istio. Итак, под K8S имеет два контейнера: сам сервис и istio-proxy. Я пытаюсь понять, почему контейнер «служба» потребляет больше памяти, чем сумма значений кучи и не кучи JVM, и такое поведение наблюдается всеми службами, разница составляет примерно 400–600 МБ.
Память контейнера K8S не освобождает память кучи JVM, поэтому учитывается максимальное значение памяти кучи JVM с момента запуска модуля, а не текущее значение. Давайте посмотрим на конкретный модуль, выполнив kubectl описать pod :
Контейнеры: услуга: Ограничения: память: 1408Ми Запросы: память: 1408Ми istio-прокси: Ограничения: память: 512Ми Запросы: память: 512Ми и JAVA_OPTS для службы: -Xms640m -Xmx640m -XX:+UseG1GC
Значения метрик (я преобразовал все значения в мебибайты, МиБ):
[*]
sum(jvm_memory_used_bytes{pod="pod_id", area="heap",Container="service"}) составляет максимум 618 МБ — максимальное использование кучи jvm с момента запуска модуля [*]sum(jvm_memory_used_bytes{pod="pod_id", area="nonheap",Container="service"}) составляет максимум 215 МБ – максимальное использование jvm без кучи [*]так что общее использование jvm составляет максимум 833 МБ (сумма двух вышеуказанных показателей)
[*]
container_memory_usage_bytes{container="service", pod="pod_id" — 1251 МБ
[*]
Значения container_memory_working_set_bytes и container_memory_usage_bytes почти одинаковы с небольшой разницей в МБ.
Я также просмотрел каталог модуля /sys/fs/cgroup/memory, но не нашел основной причины. Вот что у нас есть:
[*]внутри Memory.stat: кэш составляет 13,66 МБ [*]inactive_file — 0,4 МБ [*]active_file – 13 МБ. [*]memory.kmem.usage_in_bytes — 9 МБ
Основываясь на этих показателях, неясно, почему разница между container_memory_usage_bytes и максимальным общим количеством jvm (сумма кучи и не кучи) составляет 418 МБ. На что оно может быть выделено? Это какие-то кэши контейнеров, общая память, собственные возможности ОС или что-то еще? Какие метрики или файлы/процессы модулей могут помочь в этом?
Мобильная версия