首页 > 解决方案 > K8s pod 内存高于进程要求

问题描述

我有记录内存使用情况的 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.jsdockerkubernetesalpine

解决方案


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

这个博客阐明了 Node.js、内存消耗和垃圾收集。还有大量关于如何解决 Node.js 内存使用和垃圾收集的在线资源。[1][2][3]等。

希望能帮助到你!


推荐阅读