node.js - K8s pod 内存高于进程要求

标签 node.js docker kubernetes alpine-linux

我有一个记录内存使用情况的 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/

相关文章:

docker - 将文件从 Golang 中的 docker 镜像拉取到本地文件系统

kubernetes - 如何分辨哪些 pods 属于特定优先级?

node.js - 如何将 Node.js WebSocket 服务器部署到 Amazon Elastic Beanstalk?

javascript - 随机重定向

javascript - 全局词典/范围问题

node.js - 未调用验证前 sails

java - 如何构建使用java11的docker镜像

docker - Docker上的Gitlab持续集成

kubernetes - 如何从 "docker-for-desktop"节点获取IP地址?

docker - 由于权限问题,Fluentd 无法访问/var/lib/docker/containers 下的日志