Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js K8s吊舱内存高于进程要求_Node.js_Docker_Kubernetes_Alpine - Fatal编程技术网

Node.js K8s吊舱内存高于进程要求

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

我有一个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应用程序仅使用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是不是粘在里面了。不。我不认为这会有帮助,但我这里什么都没有了。