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系统资源时更加游刃有余。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

384

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2111

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

357

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

259

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

329

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

420

2023.10.16

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

476

2023.10.16

vb连接数据库的方法
vb连接数据库的方法

vb连接数据库的方法有使用ADO对象库、使用OLEDB数据提供程序、使用ODBC数据源等。详细介绍:1、使用ADO对象库方法,ADO是一种用于访问数据库的COM组件,可以通过ADO连接数据库并执行SQL语句。可以使用ADODB.Connection对象来建立与数据库的连接,然后使用ADODB.Recordset对象来执行查询和操作数据;2、使用OLEDB数据提供程序方法等等。

231

2023.10.19

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

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

精品课程

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

共34课时 | 5.5万人学习

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号