Node.js 服务一旦出现内存持续上涨或 CPU 抢占过高,很容易把同机上的其他进程一起拖慢。在 Debian 上,cgroups 可以直接把某个 Node.js 进程放进指定控制组里,对内存和 CPU 做硬性约束。下面按实际操作顺序整理一遍,并把每一步的作用、关键参数和适用前提说清楚,方便你判断这套方法是否适合当前环境。
为什么用 cgroups 限制 Node.js 资源
cgroups(控制组)是 Linux 内核提供的资源管理机制,可以针对一组进程限制、统计和分配 CPU、内存、磁盘 I/O 等资源。对运行在 Debian 上的 Node.js 应用来说,它的价值主要在于两点:
- 当服务有突发负载或异常泄漏时,可以先把影响范围控制住。
- 相比只在应用层调参数,cgroups 是系统级限制,约束更直接。
本文示例基于 cgroups v1,后文中的命令路径和控制文件也都按 v1 说明。如果你的 Debian 版本较新,默认可能已经使用 cgroups v2,那就需要按实际挂载方式调整命令和路径。
先安装 Debian 上的 cgroup 管理工具
Debian 默认不一定带有便于操作的管理命令,因此先安装 cgroup-tools:
sudo apt-get update
sudo apt-get install cgroup-tools
安装完成后,后续会用到 cgcreate、cgclassify 和 cgget 这些命令。
创建专门给 Node.js 使用的 cgroup
为了单独管理 Node.js 应用,先创建一个名为 nodejs 的控制组,并同时启用 memory 和 cpu 两个控制器:

sudo cgcreate -g memory,cpu:/nodejs
这条命令的重点有两个:
memory,cpu表示这个组同时受内存和 CPU 控制。/nodejs是控制组名称,后面设置限制和绑定进程时都会用到它。
分别设置内存上限和 CPU 配额
内存限制:示例为 512MB
如果你希望这个 Node.js 应用最多使用 512MB 内存,需要把限制值写入 memory.limit_in_bytes。这里必须使用字节数,因此 512MB = 536870912 字节:

echo "536870912" | sudo tee /sys/fs/cgroup/memory/nodejs/memory.limit_in_bytes
设置后,放进 nodejs 组内的进程都会受到这个内存上限约束。
CPU 限制:用 quota 和 period 控制比例
CPU 配额需要同时设置两个参数:
cpu.cfs_quota_us:可用 CPU 时间配额cpu.cfs_period_us:统计周期
例如,想把应用限制在最多 50% CPU,可这样设置:
echo "50000" | sudo tee /sys/fs/cgroup/cpu/nodejs/cpu.cfs_quota_us
echo "100000" | sudo tee /sys/fs/cgroup/cpu/nodejs/cpu.cfs_period_us
这里的含义是:在每个 100000 微秒周期内,最多只给该组分配 50000 微秒 CPU 时间,因此配额比例正好是 50%。
把 Node.js 进程加入这个控制组
控制组创建好、限制值写好之后,还需要把实际运行中的 Node.js 进程放进去。先查出进程 PID,例如:

pgrep -f nodejs_app.js
假设查到的 PID 是 12345,再执行:
sudo cgclassify -g memory,cpu:nodejs 12345
执行完成后,PID 为 12345 的 Node.js 进程就会归入 nodejs 这个 cgroup,开始受前面设定的内存和 CPU 限制。
如果你用的是其他启动方式,也可以先通过 ps 或其他命令找到对应 PID,再做同样的分类操作。
如何查看当前资源使用情况
限制生效后,可以用 cgget 查看这个控制组的资源占用和相关参数:
sudo cgget -g memory,cpu:nodejs
这条命令会输出 nodejs 组当前的内存与 CPU 使用情况,便于确认限制是否已经按预期应用到目标进程。
最后要注意:本文命令基于 cgroups v1
上面的路径和命令写法,都是按 cgroups v1 的目录结构说明的。对于较新的 Debian 版本,系统可能默认启用 cgroups v2,这时:
- 控制文件路径会变化;
- 部分工具和配置方式会与 v1 不同;
- 照搬本文命令可能无法直接生效。
因此,正式操作前最好先确认当前系统使用的是 v1 还是 v2,再决定是否直接采用本文步骤。







