温馨提示×

Linux上Node.js的资源限制如何设置

小樊
33
2025-12-20 09:52:23
栏目: 编程语言

Linux 上 Node.js 资源限制实用指南

一 内存限制

  • 使用 V8 引擎参数:通过环境变量设置老生代堆上限,例如将堆限制在 1.5GBexport NODE_OPTIONS="--max-old-space-size=1536" && node app.js。也可在代码中(主要用于调试)使用 v8.setFlagsFromString('--max-old-space-size=4096')。注意:该方式只影响 V8 堆,总内存占用还会包含堆外内存(如 Buffer、C++ 扩展、缓存等)。
  • 使用 PM2:在配置中设置 max_memory_restart,如 max_memory_restart: '1.5G',当进程超过阈值将自动重启,适合兜底稳定性。
  • 使用 systemd 服务:在服务单元设置 MemoryMax=1536M,这是对进程组的硬限制,超出会被 OOM killer 终止。
  • 使用 Docker:运行容器时设置内存上限,例如 docker run -m 1536m your-app;在 docker-compose.yml 中可用 deploy.resources.limits.memory: 4G 进行编排。
  • 使用 cgroups 手工限制:创建内存 cgroup 并写入上限值(单位字节),例如 536870912(即 512MB),然后将 Node 进程加入该 cgroup 以强制执行。

二 CPU 限制

  • 使用 systemd CPUQuota:在 [Service] 中设置 CPUQuota=50%,表示最多使用 50% 的单核时间(若有多核,可配合 CPUAffinity 做核绑定)。
  • 使用 cgroups CPU 份额/配额:通过 cpu.shares(相对权重)或 cpu.cfs_quota_us/cpu.cfs_period_us(绝对配额)控制,例如 cgset -r cpu.shares=512 nodejs 设置相对权重,或在子系统中写入配额值实现百分比限制。
  • 使用 cpuset 绑定核心:将进程固定到指定核心以减少上下文切换与缓存失效,例如 taskset -c 0,1 node app.js 将进程绑定到 CPU0/1。适合与多实例(如 cluster)结合做核亲和。

三 文件描述符与进程数

  • 使用 systemd 服务:设置 LimitNOFILE=65536(打开文件数上限)、TasksMax=infinity(允许创建的进程/线程数上限)等,以服务维度统一约束。
  • 使用 ulimit 临时调整:在启动前执行 ulimit -n 1048576 提高文件描述符上限;ulimit -u 65535 提高用户进程数上限。
  • 使用 limits.conf 永久生效:在 /etc/security/limits.conf 增加条目(如 * soft nofile 1048576* hard nofile 1048576* soft nproc 65535* hard nproc 65535),并确保 PAM 加载 pam_limits.so,同时对 systemd 还需在 /etc/systemd/system.conf/etc/systemd/user.conf 设置 DefaultLimitNOFILEDefaultLimitNPROC 等,以便服务单元也能继承。

四 场景化配置示例

  • 使用 systemd 同时限制内存与 CPU:创建 /etc/systemd/system/nodeapp.service,关键字段如下:
    [Unit]
    Description=Node.js App
    After=network.target
    
    [Service]
    ExecStart=/usr/bin/node /opt/app/index.js
    User=node
    Restart=always
    MemoryMax=1536M
    CPUQuota=50%
    
    [Install]
    WantedBy=multi-user.target
    
    应用变更:sudo systemctl daemon-reload && sudo systemctl restart nodeapp
  • 使用 Docker Compose 编排内存与 CPU
    version: "3.8"
    services:
      app:
        image: your-node-app:latest
        deploy:
          resources:
            limits:
              memory: 2G
              cpus: "1.5"
    
    启动:docker-compose up -d
  • 使用 PM2 配置内存阈值自动重启
    module.exports = {
      apps: [{
        name: 'api',
        script: 'server.js',
        max_memory_restart: '1.5G'
      }]
    };
    
    启动:pm2 start ecosystem.config.js

五 验证与排错

  • 查看与调整 ulimit:执行 ulimit -a 检查当前会话限制;必要时在 /etc/security/limits.confsystemd 全局配置中永久调整。
  • 检查 cgroups 设置:使用 cgget -g memory,cpu:<group> 查看内存/CPU 配置与实时使用;确认进程已加入目标 cgroup(如 cgclassifycgexec 启动)。
  • 观察 systemd 服务状态:使用 systemctl status nodeapp 查看是否因 MemoryMax/OOM 被终止,并结合 journalctl -u nodeapp -e 排查。
  • 容器场景:使用 docker stats <container> 观察容器内存/CPU 实际使用是否触及限额。

0