Объем памяти модуля K8s выше, чем требуется для процесса - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть приложение node.js, которое регистрирует использование памяти.

rss: 161509376, 
heapTotal: 97697792, 
heapUsed: 88706896, 
external: 733609

И команда kubectl top pod, которая сообщает, сколько модулей памяти использует.

NAME                              CPU(cores)   MEMORY(bytes)
api-596d754fc6-s7xvc              2m           144Mi 

Как выКак видно, приложение узла использует только 93 МБ памяти, а k8s говорят, что модуль использует 144 МБ памяти.

Мы используем alpine в качестве базового образа для приложения node.js.Я проверил необработанный образ Alpine со всеми зависимостями, установленными без фактического запуска приложения, и он занимал около 4-8 МБ памяти.Развертывание имеет установленные пределы.

...
resources:
  limits:
    memory: 400Mi
    cpu: 2
  requests:
    memory: 90Mi
    cpu: 100m

Итак, запрошенная память меньше той, которую показывает мне k8s.Я ожидаю увидеть, что было бы что-то ближе к фактическому потреблению памяти, скажем, 100 МБ.

Как я могу понять, откуда взялась эта дополнительная память?Почему эти числа имеют различие?

Все тесты были запущены на одном модуле (один сервис имеет один модуль, здесь нет ошибок).

Обновление 1.

FROM node:8-alpine

ENV NODE_ENV development
ENV PORT XXXX

RUN echo https://repository.fit.cvut.cz/mirrors/alpine/v3.8/main > /etc/apk/repositories; \
    echo https://repository.fit.cvut.cz/mirrors/alpine/v3.8/community >> /etc/apk/repositories

RUN apk update && \
    apk upgrade && \
    apk --no-cache add git make gcc g++ python

RUN apk --no-cache add vips-dev fftw-dev build-base \
    --repository https://repository.fit.cvut.cz/mirrors/alpine/edge/testing/ \
    --repository https://repository.fit.cvut.cz/mirrors/alpine/edge/main

WORKDIR /app

COPY ./dist /app

RUN npm install --only=production --unsafe-perm

RUN apk del make gcc g++ python build-base && \
    rm /var/cache/apk/*

EXPOSE XXXX

CMD node index.js

Изображение Docker выглядит так.

1 Ответ

0 голосов
/ 03 декабря 2018

Таким образом, единственным другим аспектом, который потребляет память в Node.js (и других языковых средах выполнения), является сборщик мусора.Вы не описали это, видите ли вы восходящую модель потребления, но если вы это сделаете, возможно, у вас есть какая-то утечка.Если ваше потребление остается стабильным, возможно, это именно то количество, которое потребляет сборщик мусора для вашего конкретного приложения.Для получения дополнительной информации о том, когда и чем занимается сборщик мусора, вы можете использовать node-gc-profiler .

Этот блог проливает свет на память Node.js.потребление и сбор мусора.Существует также множество онлайн-ресурсов, посвященных устранению неполадок, связанных с использованием памяти Node.js и сборкой мусора. [1] , [2] , [3] и т. Д.

Надеюсь, это поможет!

...