docker 容器内的 Node.js 应用程序经常出现堆内存不足的情况

Jan*_*ana 3 javascript heap-memory node.js docker kubernetes

我的 Node.js 应用程序有 16 个微服务,一个docker 镜像,并通过 kubernetes 托管在 google 云平台中。

但仅对于100 个用户的 api 请求,一些主要的 docker 镜像会因堆内存不足而崩溃 - javascript

我检查了这些图像,发现 Node.js 的堆内存限制为 1.4 GB。但由于 API 流量也很少,它很快就会得到充分利用。

如何为node.js管理/分配堆内存docker/kubernetes?或者,有什么方法可以找出内存泄漏发生的位置吗?

Mar*_*ark 7

从 kubernetes 的角度来看,您应该考虑管理容器计算资源的概念:

当您创建 Pod 时,Kubernetes 调度程序会选择 Pod 运行的节点。每个节点对于每种资源类型都有最大容量:它可以为 Pod 提供的CPU 和内存量 。调度器确保对于每种资源类型,调度的Container的资源请求总和小于节点的容量。

spec.containers [].resources.limits.memory被转换为整数,并用作docker run 命令中 --memory 标志的值。

如果节点有可用内存,容器可能会超出其内存请求。但容器使用的内存不得超过其限制。如果容器分配的内存超过其限制,则该容器将成为终止的候选者。如果容器继续消耗超出其限制的内存,则容器将被终止

为什么要使用内存限制:

容器对其使用的内存量没有上限。容器可以使用运行它的节点上的所有可用内存,这反过来又可以调用 OOM Killer。

作为使用资源请求和限制的示例:

apiVersion: v1
kind: Pod
metadata:
  name: memory-demo-2
  namespace: mem-example
spec:
  containers:
  - name: memory-demo-2-ctr
    image: polinux/stress
    resources:
      requests:
        memory: "50Mi"
      limits:
        memory: "100Mi"
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "250M", "--vm-hang", "1"]
Run Code Online (Sandbox Code Playgroud)

要了解有关您的 Pod/容器状态的更多信息,您可以使用:

kubectl describe pod your_pod 
If metric server was installed:
kubectl top pod your_pod ## to see memory usage.
Run Code Online (Sandbox Code Playgroud)

从 Node.js 的角度来看,您可能会对以下内容感兴趣:

希望这有帮助。

其他资源: