Node.js K8s吊舱内存高于进程要求
我有一个node.js应用程序,它正在记录内存使用情况Node.js K8s吊舱内存高于进程要求,node.js,docker,kubernetes,alpine,Node.js,Docker,Kubernetes,Alpine,我有一个node.js应用程序,它正在记录内存使用情况 rss: 161509376, heapTotal: 97697792, heapUsed: 88706896, external: 733609 并命令kubectl top pod,其中显示有多少内存pod正在使用 NAME CPU(cores) MEMORY(bytes) api-596d754fc6-s7xvc 2m
rss: 161509376,
heapTotal: 97697792,
heapUsed: 88706896,
external: 733609
并命令kubectl top pod,其中显示有多少内存pod正在使用
NAME CPU(cores) MEMORY(bytes)
api-596d754fc6-s7xvc 2m 144Mi
正如您所见,node应用程序仅使用93MB内存,而k8s表示pod消耗144MB内存
我们使用alpine作为node.js应用程序的基础图像。我检查了原始的alpine映像,其中安装了所有依赖项,但没有实际运行应用程序,它消耗了大约4-8MB的内存。部署设置了限制
...
resources:
limits:
memory: 400Mi
cpu: 2
requests:
memory: 90Mi
cpu: 100m
所以,请求的内存低于k8s显示给我的内存。我希望看到,会有更接近实际内存消耗的东西,比如说100 MB
我如何理解这些额外的内存来自何处?为什么这些数字有差异
所有测试都是在一个吊舱上启动的(单一服务有一个吊舱,这里没有错误)
更新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.js、内存消耗和垃圾收集有帮助。还有大量关于如何解决Node.js内存使用和垃圾收集问题的在线资源,等等
希望有帮助 您很可能看到实际内存消耗与内核用于文件缓存的缓冲区/缓存内存合并 这可能是Kubernetes本身的一个bug。见本期:
如果pod读/写文件,就会发生这种情况。如果你的pod达到了限制,内核会在oomkiller激活之前擦除它的缓冲缓存,所以设置一个硬限制并不太危险。如果不设置限制,节点最终将停止调度pod,甚至重新启动消耗太多“内存”的pod。您的pod规范是什么样子的?你只有一个容器吗?@Rico,是的,只有一个。@Rico,我已经在问题中添加了docker文件。添加了一个答案,让我知道它是否有用。这就是重点,我花了整个周末来找出泄漏的位置,以及我现在看到的情况,分析器显示的更少,然后process.memorySage()就可以了。我不会说,GC在这里作为一个独立进程工作,它已经包含在整个进程内存中。我看不到内存增长(我看到了短时间的下降,这说明GC正在工作),即使我提出了几个请求,它也或多或少会保持不变,这再次说明,这个模块中没有泄漏。嗯,你用pmap或valgrind分析过你的应用程序吗?我不确定k8s或docker是不是粘在里面了。不。我不认为这会有帮助,但我这里什么都没有了。