我有一个记录内存使用情况的 node.js 应用程序。
rss: 161509376,
heapTotal: 97697792,
heapUsed: 88706896,
external: 733609
然后命令 kubectl top pod 说明 pod 使用了多少内存。
NAME CPU(cores) MEMORY(bytes)
api-596d754fc6-s7xvc 2m 144Mi
如您所见,node app 仅使用 93 MB 内存,而 k8s 表示 pod 消耗 144 MB 内存。
我们使用 alpine 作为 node.js 应用的基础镜像。我在没有运行实际应用程序的情况下检查了安装了所有依赖项的原始 alpine 图像,它消耗了大约 4-8 MB 的内存。部署设置了限制。
...
resources:
limits:
memory: 400Mi
cpu: 2
requests:
memory: 90Mi
cpu: 100m
因此,请求的内存低于 k8s 向我显示的内存。我希望看到,会有更接近实际内存消耗的东西,比如说 100 MB。
我如何了解这些额外内存的来源?为什么这些数字有差异?
所有测试都在单个pod上启动(单个服务有一个pod,这里没有错误)。
更新 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 图像看起来像这样。
最佳答案
因此,在 Node.js(和其他语言运行时)中消耗内存的唯一其他方面是垃圾收集器。你没有描述你是否看到了向上的消费模式,但如果你看到了,你可能有某种泄漏。如果您的消耗量保持稳定,则可能是垃圾收集器为您的特定应用程序消耗的给定数量。有关垃圾收集器何时执行操作的更多信息,您可以使用 node-gc-profiler。
此 blog 阐明了 Node.js、内存消耗和垃圾收集。还有大量关于如何解决 Node.js 内存使用和垃圾收集问题的在线资源。 [1] , [2] , [3] 等
希望对您有所帮助!
关于node.js - K8s pod 内存高于进程要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53597934/