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_us
和 cpu.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。
-
启用 net_cls 控制器
确保net_cls
控制器已加载到 Cgroup v2 中。可以通过以下命令检查:ls /sys/fs/cgroup/my_network_group_v2/net_cls.classid
如果文件不存在,则需要重新挂载 Cgroup v2 并启用
net_cls
控制器。 -
设置网络分类 ID
为进程分配一个唯一的网络分类 ID:echo 0x12345678 | sudo tee /sys/fs/cgroup/my_network_group_v2/net_cls.classid
-
配置 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