node.js - 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.js(和其他语言运行时)中消耗内存的唯一其他方面是垃圾收集器。你没有描述你是否看到向上的消费模式,但如果你看到了,你可能有某种泄漏。如果您的消耗量保持稳定,则可能是垃圾收集器为您的特定应用程序消耗的给定数量。有关垃圾收集器何时执行的更多信息,您可以使用node-gc-profiler。
这个博客阐明了 Node.js、内存消耗和垃圾收集。还有大量关于如何解决 Node.js 内存使用和垃圾收集的在线资源。[1]、[2]、[3]等。
希望能帮助到你!
推荐阅读
- android - Ionic Cordova 通过从最近的应用程序列表中滑动应用程序被杀死时检测应用程序终止事件
- java - Keycloak 身份验证流程
- python - 将html响应保存并加载为文件中的对象-python
- postgresql - 在 Postgresql 之上使用池化、池化-lo 优化器违反 Hibernate 序列约束
- git - 如何在一次提交中获得 3 个或更多提交
- css - 网页字体 Sass Mixin 问题
- javascript - 如果在对象数组中不是真的,javascript会更新属性值
- elasticsearch - 在弹性搜索集群之前配置负载均衡器的最佳方法
- java - 从 HDFS 读取图像
- c++ - OpenGL在窗口调整大小时保持对象形状