当前位置: 首页 > 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

       

      http://www.xdnf.cn/news/947197.html

      相关文章:

    1. 怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
    2. Android 开发中配置 USB 配件模式(Accessory Mode) 配件过滤器的配置
    3. Android屏幕刷新率与FPS(Frames Per Second) 120hz
    4. MySQL中【正则表达式】用法
    5. 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
    6. 今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
    7. web vue 项目 Docker化部署
    8. 【DVWA系列】——xss(Reflected)——Medium详细教程
    9. 破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
    10. Python ROS2【机器人中间件框架】 简介
    11. leetcodeSQL解题:3564. 季节性销售分析
    12. 均衡后的SNRSINR
    13. idea 设置git提交快捷键
    14. 【习题】DevEco Studio的使用
    15. 《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析(四)DPHY ECC
    16. LangGraph 应用实例解析
    17. 归并排序算法及其在算法中的应用
    18. 使用Python 构建支持主流大模型与 Ollama 的统一接口平台
    19. 查找日志文件中​​最后一次出现某个关键词的上下 20 行​​
    20. ZYNQ学习记录FPGA(二)Verilog语言
    21. matlab自控仿真【第一弹】❀传递函数和输出时域表达式
    22. VAS1086Q 奇力科技线性芯片车规用品LED驱动芯片
    23. 鸟巢邂逅 3D 全景漫游,一场科技与建筑的梦幻交织​
    24. 成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
    25. 【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
    26. 佰力博科技与您探讨热释电测量的几种方法
    27. 边缘计算设备全解析:边缘盒子在各大行业的落地应用场景
    28. 如何使用 Ansible 在 Ubuntu 24.04 上安装和设置 LNMP
    29. Web中间件--tomcat学习
    30. Tomcat 安装和配置