K8s的Pod内存高于进程要求

时间:2018-12-03 16:31:00

标签: node.js docker kubernetes alpine

我有一个node.js应用程序,用于记录内存使用情况。

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

然后命令kubectl最上面的pod,说出正在使用多少个内存pod。

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

如您所见,节点应用程序仅使用93 MB的内存,而k8s表示pod占用了144 MB的内存。

我们正在使用alpine作为node.js应用程序的基础映像。我检查了原始阿尔卑斯山映像,其中安装了所有依赖项,而没有实际运行应用程序,它消耗了大约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镜像看起来像这样。

2 个答案:

答案 0 :(得分:0)

因此,在Node.js(和其他语言运行时)中消耗内存的唯一其他方面是垃圾收集器。您没有描述是否看到向上的消费模式,但是如果您看到这种情况,则可能存在某种泄漏。如果您的消耗保持稳定,则可能是特定应用程序的垃圾收集器消耗的给定数量。有关何时垃圾回收器在做什么的更多信息,您可以使用node-gc-profiler

blog揭示了Node.js,内存消耗和垃圾回收。关于如何对Node.js内存使用和垃圾回收进行故障排除,还有大量的在线资源。 [1][2][3]

希望有帮助!

答案 1 :(得分:0)

您很可能会看到Pod实际内存消耗与内核用于文件缓存的缓冲/缓存内存的合并。

这可能是Kubernetes本身的错误。看到此问题:https://github.com/kubernetes/kubernetes/issues/43916

如果您的Pod读取/写入文件,则会发生这种情况。如果您的Pod达到了限制,内核将在激活oomkiller之前擦除其缓冲区缓存,因此设置硬限制没有太危险。如果未设置限制,则节点最终将停止调度Pod,甚至重新启动消耗过多“内存”的Pod。