当前位置: 首页 > news >正文

linux cgroup内存/io/cpu/网络使用总结

cgroups是Linux内核提供的一种可以限制、记录和隔离进程组使用的物理资源(如CPU、内存,io,网络等)的机制。

1,内存限制

创建 Cgroup v2 组

进入 Cgroup v2 的挂载点目录,并创建一个新的组:

cd /sys/fs/cgroup

sudo mkdir my_memory_group_v2

设置内存限制

在 Cgroup v2 中,通过 memory.max 文件来设置内存使用的上限。例如,将内存限制为 1GB(即 1073741824 字节):

echo $((1024 * 1024 * 1024)) | sudo tee /sys/fs/cgroup/my_memory_group_v2/memory.max

这里,memory.max 的值以字节为单位,表示允许的最大内存使用量。设置为 max 则表示不限制内存使用。

将进程加入 Cgroup v2 组

找到需要限制的进程的 PID,并将其添加到 Cgroup 组的任务列表中:

echo <PID> | sudo tee /sys/fs/cgroup/my_memory_group_v2/cgroup.procs

例如,如果目标进程的 PID 为 2344,则执行:

echo 2344| sudo tee /sys/fs/cgroup/my_memory_group_v2/cgroup.procs

验证配置效果

可以通过以下命令查看当前 Cgroup 组的内存使用情况:

cat /sys/fs/cgroup/my_memory_group_v2/memory.current

此命令返回当前 Cgroup 组的内存使用量(以字节为单位)。此外,还可以查看其他统计信息文件,如 memory.stat,以获取更详细的内存使用数据


2,CPU限制

创建和配置 Cgroup 环境

在 Ubuntu 20.04 上,Cgroup v1 和 v2 可能同时存在。默认情况下,Cgroup v1 是更常用的版本。以下是基于 Cgroup v1 的具体配置方法2

检查 Cgroup 挂载点

确保 Cgroup 已正确挂载到系统中。可以通过以下命令检查:

root@ubuntu:/sys/fs# mount | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755,inode64)
cgroup2 on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)

如果未挂载,可以手动挂载 Cgroup 的 cpu 子系统:

sudo mount -t cgroup -o cpu none /sys/fs/cgroup/cpu

创建 Cgroup 组

进入 Cgroup 的 cpu 子系统目录,并创建一个新的组:

cd /sys/fs/cgroup/cpu

root@ubuntu:/sys/fs/cgroup# mkdir my_cpu_group
mkdir: cannot create directory ‘my_cpu_group’: Read-only file system
 

 查看信息,查看是tmpfs on /sys/fs/cgroup是ro状态。

root@ubuntu:/sys/fs# mount | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755,inode64)

重新挂载查看 cgroup权限,发现ro 改为了rw状态

 

root@ubuntu:/sys/fs# mount | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (rw,nosuid,nodev,noexec,mode=755,inode64)

设置 CPU 使用率限制

使用 cpu.cfs_quota_uscpu.cfs_period_us 来控制 CPU 使用率。例如,将 CPU 使用率限制为 50%(即每个周期内最多使用 50 毫秒):

echo 50000 | sudo tee /sys/fs/cgroup/cpu/my_cpu_group/cpu.cfs_quota_us

echo 100000 | sudo tee /sys/fs/cgroup/cpu/my_cpu_group/cpu.cfs_period_us

这里,cpu.cfs_quota_us 设置为 50000 微秒,表示每个周期允许使用的 CPU 时间;cpu.cfs_period_us 设置为 100000 微秒,表示周期长度。

将进程加入 Cgroup 组

找到需要限制的进程的 PID,并将其添加到 Cgroup 组的任务列表中:

echo <PID> | sudo tee /sys/fs/cgroup/cpu/my_cpu_group/tasks

例如,如果目标进程的 PID 为 2234,则执行:

echo 2234| sudo tee /sys/fs/cgroup/cpu/my_cpu_group/tasks

验证配置效果

可以通过以下命令查看 Cgroup 的 CPU 使用情况:

cat /sys/fs/cgroup/cpu/my_cpu_group/cpuacct.usage

此命令返回当前 Cgroup 组的累计 CPU 使用时间(单位为纳秒)。结合实际运行时间,可以计算出 CPU 使用率是否符合预期。


3,IO限制

检查 Cgroup v2 是否已挂载

在开始配置之前,需要确认系统是否已挂载 Cgroup v2。可以通过以下命令检查:

mount | grep cgroup2

如果输出中包含类似 cgroup2 on /sys/fs/cgroup 的信息,则表示 Cgroup v2 已正确挂载2

创建 Cgroup v2 组

进入 Cgroup v2 的挂载点目录,并创建一个新的组用于管理 IO 资源:

cd /sys/fs/cgroup

sudo mkdir my_io_group_v2

设置 IO 权重

在 Cgroup v2 中,可以通过 io.weight 文件来设置 IO 权重。例如,将 IO 权重设置为 100(默认值为 100,范围是 1 到 10000):

echo 100 | sudo tee /sys/fs/cgroup/my_io_group_v2/io.weight

设置设备特定的 IO 带宽限制

如果需要对特定设备设置 IO 带宽限制,可以使用 io.max 文件。例如,限制设备 /dev/sda 的读取速率为 5MB/s,写入速率为 10MB/s:

echo "sda rbps=5242880 wbps=10485760" | sudo tee /sys/fs/cgroup/my_io_group_v2/io.max

这里,rbps 表示读取带宽限制(单位为字节/秒),wbps 表示写入带宽限制(单位为字节/秒)。需要注意的是,设备名称应与系统中的实际设备名称一致4

将进程加入 Cgroup v2 组

找到需要限制的进程的 PID,并将其添加到 Cgroup 组的任务列表中:

echo <PID> | sudo tee /sys/fs/cgroup/my_io_group_v2/cgroup.procs

例如,如果目标进程的 PID 为 1234,则执行:

echo 1234 | sudo tee /sys/fs/cgroup/my_io_group_v2/cgroup.procs

验证配置效果

可以通过以下命令查看当前 Cgroup 组的 IO 使用情况:

cat /sys/fs/cgroup/my_io_group_v2/io.stat

此命令返回该 Cgroup 组的 IO 统计信息,包括读写操作次数和延迟等数据


4,网络限制

      上述设置将网络带宽限制应用于指定的进程。

      检查 Cgroup v2 是否已挂载

      在配置之前,需要确认系统是否已挂载 Cgroup v2。可以通过以下命令检查:

      mount | grep cgroup2

      如果输出中包含类似 cgroup2 on /sys/fs/cgroup 的信息,则表示 Cgroup v2 已正确挂载2

      创建 Cgroup v2 组

      进入 Cgroup v2 的挂载点目录,并创建一个新的组用于管理网络资源:

      cd /sys/fs/cgroup

      sudo mkdir my_network_group_v2

      设置网络带宽限制

      在 Cgroup v2 中,可以通过 io.max 文件来设置设备的 IO 带宽限制,但网络带宽限制通常需要结合 net_cls 控制器使用。首先,确保内核支持 net_cls 控制器3

      1. 启用 net_cls 控制器
        确保 net_cls 控制器已加载到 Cgroup v2 中。可以通过以下命令检查:

        ls /sys/fs/cgroup/my_network_group_v2/net_cls.classid

        如果文件不存在,则需要重新挂载 Cgroup v2 并启用 net_cls 控制器。

      2. 设置网络分类 ID
        为进程分配一个唯一的网络分类 ID:

        echo 0x12345678 | sudo tee /sys/fs/cgroup/my_network_group_v2/net_cls.classid

      3. 配置 tc(Traffic Control)规则
        使用 tc 命令为指定的网络分类 ID 配置带宽限制。例如,限制出站带宽为 1Mbps:

        sudo tc qdisc add dev eth0 root handle 1: htb default 10

        sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit

        sudo tc filter add dev eth0 protocol ip prio 1 handle 0x12345678 fw classid 1:1

      将进程加入 Cgroup v2 组

      找到需要限制的进程的 PID,并将其添加到 Cgroup 组的任务列表中:

      echo <PID> | sudo tee /sys/fs/cgroup/my_network_group_v2/cgroup.procs

      例如,如果目标进程的 PID 为 2234,则执行:

      echo 2234 | sudo tee /sys/fs/cgroup/my_network_group_v2/cgroup.procs

      验证配置效果

      可以通过以下命令查看当前 Cgroup 组的网络分类 ID 和带宽限制是否生效:

      cat /sys/fs/cgroup/my_network_group_v2/net_cls.classid

      sudo tc -s qdisc show dev eth0

       

      相关文章:

    1. 人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
    2. Linux下如何使用Curl进行网络请求
    3. 单片机bootloader(APP的自我复制)
    4. Cursor 使用分享
    5. ​小学五年级的语言来解释符号​
    6. 鸿蒙Next仓颉语言开发实战教程:店铺详情页
    7. 快速使用 Flutter 的 Dialog 和 AlertDialog
    8. SpringBoot请求限流(RateLimiter)
    9. Python开发基础手语识别(基础框架版)
    10. 什么是Ansible Jinja2
    11. Ansible+Zabbix-agent2快速实现对多主机监控
    12. 关于YOLOV5—Mosaic数据增强
    13. Java解析前端传来的Unix时间戳
    14. Element-Plus:popconfirm与tooltip一起使用不生效?
    15. 机器学习笔记【Week8】
    16. C++11作用域枚举(Scoped Enums):从入门到精通
    17. LeetCode Hot100刷题——三数之和
    18. 直曲联合!【连续测量】让CAD多线段长度测量精准与效率双升级
    19. C/C++ 面试复习笔记(5)
    20. Vite 插件使用全攻略(含自动导入)
    21. 媒体广告投放平台/windows优化大师卸载不了
    22. 网站建设外包公司排名/网站推广的一般流程是
    23. 网站风格主要包括/网站seo谷歌
    24. 域名注册好了如何做网站/免费seo课程
    25. b站怎么付费推广自己的视频/微营销平台
    26. physon可以做网站/网站维护合同