要限制进程的内存和cpu使用,需通过cgroups v1操作/sys/fs/cgroup文件系统,1. 确认cgroup已挂载,若未挂载则使用mount命令挂载cpu和memory控制器;2. 在/sys/fs/cgroup/cpu和memory下创建名为my_limited_app的目录;3. 设置内存限制为200m,通过echo 200m > memory.limit_in_bytes并设置swappiness为0;4. 设置cpu限制为25%,通过设置cpu.cfs_period_us为100000和cpu.cfs_quota_us为25000;5. 将目标进程pid写入cpu和memory对应cgroup的tasks文件以加入限制;6. 对于新进程,使用cgexec -g cpu,memory:my_limited_app启动命令使其直接在限定环境中运行,整个过程实现了对进程资源使用的有效隔离与控制。
cgroups(control groups)是Linux内核提供的一项强大功能,它允许你对进程组的资源使用进行精细化控制,包括内存和CPU。简单来说,它就像是给服务器上的不同应用划定“地盘”,确保它们不会互相干扰,某个进程失控时也不会拖垮整个系统。
要限制进程的内存和CPU使用,我们主要通过操作
/sys/fs/cgroup
核心步骤:
mount -t cgroup
sudo mount -t cgroup -o cpu,memory cgroup /sys/fs/cgroup/cpu_memory
cpu,memory
tasks
cgexec
我个人觉得,cgroups的出现,就像是给Linux系统装上了一套精密的交通管制系统。想象一下,你的服务器上可能同时跑着Web服务、数据库、后台任务,甚至是一些临时的脚本。如果其中任何一个进程突然“暴走”,比如内存泄漏导致占用大量RAM,或者一个无限循环的计算任务把所有CPU核心都吃光,那整个系统就会变得异常缓慢,甚至直接崩溃。这种经历,相信很多运维或开发者都深有体会,调试起来简直是噩梦。
cgroups就是为了解决这种问题而生的。它通过在内核层面实现资源隔离和管理,将进程组织成一个或多个层次结构(有点像目录树),每个节点(cgroup)都可以拥有自己的资源限制。例如,你可以为一个Web服务器进程组分配50%的CPU和2GB的内存,而为后台分析任务分配20%的CPU和4GB内存。这样,即使后台任务计算量再大,它也无法超过预设的CPU上限,更不会因为内存不足而导致整个系统OOM(Out Of Memory)。它不仅能防止资源滥用,还能确保关键服务的SLA(服务等级协议),这在多租户环境或者资源竞争激烈的场景下尤其重要。
让我们来实际操作一下,给一个假想的“资源消耗大户”进程设置限制。
假设我们要创建一个名为
my_limited_app
步骤详解:
进入 cgroup 虚拟文件系统: 通常,cgroup控制器会挂载在
/sys/fs/cgroup
cpu
memory
ls /sys/fs/cgroup/ # 你可能会看到 cpu cpuacct memory blkio devices freezer net_cls net_prio perf_event pids systemd
创建 cgroup 目录: 我们将在
cpu
memory
sudo mkdir /sys/fs/cgroup/memory/my_limited_app sudo mkdir /sys/fs/cgroup/cpu/my_limited_app
设置内存限制: 进入
memory/my_limited_app
memory.limit_in_bytes
sudo sh -c "echo 200M > /sys/fs/cgroup/memory/my_limited_app/memory.limit_in_bytes" # 还可以设置 swappiness,0 表示尽量不使用 swap,100 表示积极使用 sudo sh -c "echo 0 > /sys/fs/cgroup/memory/my_limited_app/memory.swappiness"
设置CPU限制: 进入
cpu/my_limited_app
cpu.cfs_period_us
cpu.cfs_quota_us
cfs_period_us
cfs_quota_us
sudo sh -c "echo 100000 > /sys/fs/cgroup/cpu/my_limited_app/cpu.cfs_period_us" sudo sh -c "echo 25000 > /sys/fs/cgroup/cpu/my_limited_app/cpu.cfs_quota_us" # 还可以使用 cpu.shares,这是一个相对权重,默认是1024。 # 如果有两个组,一个 shares 是 1024,另一个是 512,那么在CPU资源紧张时,前者会获得两倍于后者的CPU时间。 # sudo sh -c "echo 256 > /sys/fs/cgroup/cpu/my_limited_app/cpu.shares"
将现有进程加入 cgroup: 假设你的进程PID是
12345
sudo sh -c "echo 12345 > /sys/fs/cgroup/memory/my_limited_app/tasks" sudo sh -c "echo 12345 > /sys/fs/cgroup/cpu/my_limited_app/tasks"
启动新进程时直接指定 cgroup: 如果你要启动一个新进程并让它直接在
my_limited_app
cgexec
cgroup-tools
libcgroup-tools
sudo cgexec -g cpu,memory:my_limited_app your_command_here # 例如: # sudo cgexec -g cpu,memory:my_limited_app stress -c 4 -m 1 --vm-bytes 300M # (注意:这里的 stress 命令如果超过内存限制,可能会被 OOM kill)
cgroups的世界其实比表面看起来要复杂一些,尤其是当涉及到v1和v2两个主要版本时。
cgroups v1 vs v2:
目前我们操作的例子是基于 cgroups v1,它是Linux上广泛使用的版本,特点是每个控制器(如
cpu
memory
而 cgroups v2 是更新、更统一的版本,它提供了一个单一的、统一的层级结构。所有控制器都挂载在同一个根目录下,并且子cgroup会继承父cgroup的所有控制器。v2的设计更加简洁和一致,解决了v1中一些层级结构和资源分配的复杂性问题。现代的发行版,尤其是使用
systemd
systemd
Delegate=yes
CPUQuota
MemoryLimit
监控技巧:
光设置限制还不够,你还需要知道你的cgroup是否真的在工作,以及进程的资源使用情况。
检查当前限制: 你可以直接
cat
cat /sys/fs/cgroup/memory/my_limited_app/memory.limit_in_bytes cat /sys/fs/cgroup/cpu/my_limited_app/cpu.cfs_quota_us
查看资源使用情况: 每个cgroup目录下都有
memory.usage_in_bytes
cpuacct.usage
cat /sys/fs/cgroup/memory/my_limited_app/memory.usage_in_bytes cat /sys/fs/cgroup/cpu/my_limited_app/cpuacct.usage # memory.stat 提供更详细的内存统计信息,比如缓存、活跃内存等 cat /sys/fs/cgroup/memory/my_limited_app/memory.stat
调试与陷阱: 有时候,你会发现一个进程明明被限制了,但行为还是不尽如人意,这时候就需要深入日志和统计文件了。我记得有一次,我给一个Java应用设置了内存限制,结果它还是时不时被OOM杀死,后来才发现是JVM自己的内存管理机制和cgroup的限制在打架,需要额外调整JVM参数(比如
-Xmx
tasks
cgroups是一个非常底层且强大的工具,理解并善用它,能让你在管理Linux系统资源时更加游刃有余。
以上就是如何限制进程资源使用 cgroups内存CPU限制的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号