Linux 上 Node.js 资源限制实用指南
一 内存限制
export NODE_OPTIONS="--max-old-space-size=1536" && node app.js。也可在代码中(主要用于调试)使用 v8.setFlagsFromString('--max-old-space-size=4096')。注意:该方式只影响 V8 堆,总内存占用还会包含堆外内存(如 Buffer、C++ 扩展、缓存等)。max_memory_restart,如 max_memory_restart: '1.5G',当进程超过阈值将自动重启,适合兜底稳定性。MemoryMax=1536M,这是对进程组的硬限制,超出会被 OOM killer 终止。docker run -m 1536m your-app;在 docker-compose.yml 中可用 deploy.resources.limits.memory: 4G 进行编排。536870912(即 512MB),然后将 Node 进程加入该 cgroup 以强制执行。二 CPU 限制
[Service] 中设置 CPUQuota=50%,表示最多使用 50% 的单核时间(若有多核,可配合 CPUAffinity 做核绑定)。cpu.shares(相对权重)或 cpu.cfs_quota_us/cpu.cfs_period_us(绝对配额)控制,例如 cgset -r cpu.shares=512 nodejs 设置相对权重,或在子系统中写入配额值实现百分比限制。taskset -c 0,1 node app.js 将进程绑定到 CPU0/1。适合与多实例(如 cluster)结合做核亲和。三 文件描述符与进程数
LimitNOFILE=65536(打开文件数上限)、TasksMax=infinity(允许创建的进程/线程数上限)等,以服务维度统一约束。ulimit -n 1048576 提高文件描述符上限;ulimit -u 65535 提高用户进程数上限。/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 设置 DefaultLimitNOFILE、DefaultLimitNPROC 等,以便服务单元也能继承。四 场景化配置示例
/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。version: "3.8"
services:
app:
image: your-node-app:latest
deploy:
resources:
limits:
memory: 2G
cpus: "1.5"
启动:docker-compose up -d。module.exports = {
apps: [{
name: 'api',
script: 'server.js',
max_memory_restart: '1.5G'
}]
};
启动:pm2 start ecosystem.config.js。五 验证与排错
ulimit -a 检查当前会话限制;必要时在 /etc/security/limits.conf 与 systemd 全局配置中永久调整。cgget -g memory,cpu:<group> 查看内存/CPU 配置与实时使用;确认进程已加入目标 cgroup(如 cgclassify 或 cgexec 启动)。systemctl status nodeapp 查看是否因 MemoryMax/OOM 被终止,并结合 journalctl -u nodeapp -e 排查。docker stats <container> 观察容器内存/CPU 实际使用是否触及限额。