0

0

如何限制进程资源使用 cgroups内存CPU限制

P粉602998670

P粉602998670

发布时间:2025-08-16 14:08:01

|

574人浏览过

|

来源于php中文网

原创

要限制进程的内存和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内存CPU限制

cgroups(control groups)是Linux内核提供的一项强大功能,它允许你对进程组的资源使用进行精细化控制,包括内存和CPU。简单来说,它就像是给服务器上的不同应用划定“地盘”,确保它们不会互相干扰,某个进程失控时也不会拖垮整个系统。

解决方案

要限制进程的内存和CPU使用,我们主要通过操作

/sys/fs/cgroup
这个虚拟文件系统来完成。这里以 cgroups v1 版本为例,因为它在很多现有系统上仍然是默认且易于手动操作的。

核心步骤:

  1. 确定 cgroup 文件系统是否已挂载。 通常情况下,现代Linux发行版都会自动挂载。你可以通过
    mount -t cgroup
    命令来查看。如果没有,你需要手动挂载,例如:
    sudo mount -t cgroup -o cpu,memory cgroup /sys/fs/cgroup/cpu_memory
    (这里的
    cpu,memory
    是指定要挂载的控制器)。
  2. 创建新的 cgroup 目录。 这将为你的受限进程创建一个独立的资源组。
  3. 设置资源限制。 进入新创建的 cgroup 目录,修改相应的控制文件来设定内存和CPU的上限。
  4. 将进程加入 cgroup。 将目标进程的PID写入到 cgroup 目录下的
    tasks
    文件中。
  5. 启动新进程时直接指定 cgroup。 对于新启动的进程,可以使用
    cgexec
    命令让它直接在指定的 cgroup 中运行。

理解cgroups的工作原理:为什么我们需要它?

我个人觉得,cgroups的出现,就像是给Linux系统装上了一套精密的交通管制系统。想象一下,你的服务器上可能同时跑着Web服务、数据库、后台任务,甚至是一些临时的脚本。如果其中任何一个进程突然“暴走”,比如内存泄漏导致占用大量RAM,或者一个无限循环的计算任务把所有CPU核心都吃光,那整个系统就会变得异常缓慢,甚至直接崩溃。这种经历,相信很多运维或开发者都深有体会,调试起来简直是噩梦。

cgroups就是为了解决这种问题而生的。它通过在内核层面实现资源隔离和管理,将进程组织成一个或多个层次结构(有点像目录树),每个节点(cgroup)都可以拥有自己的资源限制。例如,你可以为一个Web服务器进程组分配50%的CPU和2GB的内存,而为后台分析任务分配20%的CPU和4GB内存。这样,即使后台任务计算量再大,它也无法超过预设的CPU上限,更不会因为内存不足而导致整个系统OOM(Out Of Memory)。它不仅能防止资源滥用,还能确保关键服务的SLA(服务等级协议),这在多租户环境或者资源竞争激烈的场景下尤其重要。

实际操作:如何为特定进程设置CPU和内存限制?

让我们来实际操作一下,给一个假想的“资源消耗大户”进程设置限制。

假设我们要创建一个名为

my_limited_app
的cgroup,并将其内存限制在200MB,CPU使用限制在25%。

步骤详解:

盛世企业网站管理系统1.1.2
盛世企业网站管理系统1.1.2

免费 盛世企业网站管理系统(SnSee)系统完全免费使用,无任何功能模块使用限制,在使用过程中如遇到相关问题可以去官方论坛参与讨论。开源 系统Web代码完全开源,在您使用过程中可以根据自已实际情况加以调整或修改,完全可以满足您的需求。强大且灵活 独创的多语言功能,可以直接在后台自由设定语言版本,其语言版本不限数量,可根据自已需要进行任意设置;系统各模块可在后台自由设置及开启;强大且适用的后台管理支

下载
  1. 进入 cgroup 虚拟文件系统: 通常,cgroup控制器会挂载在

    /sys/fs/cgroup
    下。你可以列出其中的目录,比如
    cpu
    memory
    ,它们分别对应CPU和内存的控制器。

    ls /sys/fs/cgroup/
    # 你可能会看到 cpu cpuacct memory blkio devices freezer net_cls net_prio perf_event pids systemd
  2. 创建 cgroup 目录: 我们将在

    cpu
    memory
    控制器下分别创建我们的组。

    sudo mkdir /sys/fs/cgroup/memory/my_limited_app
    sudo mkdir /sys/fs/cgroup/cpu/my_limited_app
  3. 设置内存限制: 进入

    memory/my_limited_app
    目录,修改
    memory.limit_in_bytes
    文件。单位可以是字节,也可以用K、M、G表示。

    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"
  4. 设置CPU限制: 进入

    cpu/my_limited_app
    目录。CPU限制通过
    cpu.cfs_period_us
    cpu.cfs_quota_us
    来控制。
    cfs_period_us
    是一个时间周期(微秒),
    cfs_quota_us
    是在这个周期内允许使用的CPU时间(微秒)。 例如,要限制为25%的CPU,我们可以设置周期为100ms (100000us),配额为25ms (25000us)。

    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"
  5. 将现有进程加入 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"
  6. 启动新进程时直接指定 cgroup: 如果你要启动一个新进程并让它直接在

    my_limited_app
    cgroup 中运行,可以使用
    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 vs v2及监控技巧

cgroups的世界其实比表面看起来要复杂一些,尤其是当涉及到v1和v2两个主要版本时。

cgroups v1 vs v2:

目前我们操作的例子是基于 cgroups v1,它是Linux上广泛使用的版本,特点是每个控制器(如

cpu
memory
)都有自己的独立层级结构。这意味着你可能需要为同一个进程在不同的控制器下创建并管理独立的cgroup路径。它的优点是灵活,可以针对特定资源进行细粒度控制。

cgroups v2 是更新、更统一的版本,它提供了一个单一的、统一的层级结构。所有控制器都挂载在同一个根目录下,并且子cgroup会继承父cgroup的所有控制器。v2的设计更加简洁和一致,解决了v1中一些层级结构和资源分配的复杂性问题。现代的发行版,尤其是使用

systemd
的系统,越来越多地转向v2。不过,对于手动操作和理解基础概念,v1的例子依然非常直观和有用。在实际生产环境中,你更多会通过
systemd
Delegate=yes
CPUQuota
MemoryLimit
等参数来间接使用cgroups的功能,而非直接操作文件。

监控技巧:

光设置限制还不够,你还需要知道你的cgroup是否真的在工作,以及进程的资源使用情况。

  • 检查当前限制: 你可以直接

    cat
    对应cgroup目录下的控制文件来查看当前设置的限制值。

    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
    等文件,它们会告诉你该cgroup中所有进程的总资源消耗。

    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
    要小于cgroup的限制)。这种细节,真的得自己踩过坑才能体会。另一个常见问题是,进程启动后没有正确进入cgroup,或者进程又派生了子进程,而子进程没有继承cgroup限制。务必确认
    tasks
    文件中包含了所有你希望限制的PID。

cgroups是一个非常底层且强大的工具,理解并善用它,能让你在管理Linux系统资源时更加游刃有余。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

844

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

742

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

740

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

400

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

431

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16926

2023.08.03

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
麻省理工大佬Python课程
麻省理工大佬Python课程

共34课时 | 5.2万人学习

php-src源码分析探索
php-src源码分析探索

共6课时 | 0.5万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号