容器技术三部曲 之 Cgroups

本文主线 引入 => 使用 => 小结

容器的本质是一种特殊的进程

Cgroups的作用是”限制” 它给这个”世界”围了一圈看不见的”墙”

引入

1
mount -t cgroup
1
2
3
4
5
6
7
8
9
10
11
12
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
1
ls -l /sys/fs/cgroup/cpu/cpu.cfs_*
1
2
-rw-r--r-- 1 root root 0 Jun 22 08:42 /sys/fs/cgroup/cpu/cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Jun 22 08:42 /sys/fs/cgroup/cpu/cpu.cfs_quota_us
1
2
3
4
5
cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
# 100000

cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
# -1 => 表示无限制

两个参数组合使用 可以用来限制进程 在长度为fs_period_us的一段时间内 只能被分配到总量为cfs_quota_us的CPU时间

使用

1
2
3
4
5
cd /sys/fs/cgroup/cpu

sudo mkdir container

ls -l container/cpu.cfs_*
1
2
-rw-r--r-- 1 root root 0 Jun 22 08:47 container/cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Jun 22 08:47 container/cpu.cfs_quota_us
1
2
3
4
5
cat container/cpu.cfs_period_us
# 100000

cat container/cpu.cfs_quota_us
# -1 => 表示无限制
1
vim loop.c
1
2
3
4
5
6
int main(void)
{
int i = 0;
for(;;) i++;
return 0;
}
1
2
3
4
5
6
7
gcc -o loop loop.c

./loop

top
# PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
# 90266 op 20 0 4384 804 740 R 100.0 0.0 0:20.24 loop
1
2
3
4
5
6
7
8
9
10
11
sudo sh -c "echo 20000 > /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us"
cat /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us
# 20000

sudo sh -c "echo 90266 > /sys/fs/cgroup/cpu/container/tasks"
cat /sys/fs/cgroup/cpu/container/tasks
# 90266

top
# PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
# 90266 op 20 0 4384 804 740 R 20.0 0.0 16:13.05 loop

小结

Linux Cgroups全称Linux Control Groups 是Linux (Kernel)的一个功能 用来限制一个进程组能够使用的资源上限 包括 CPU、内存、磁盘、网络等

Subsystem Description
cpu 限制CPU时间片的分配
cpuset 为任​​​务​​​分​​​配​​​独​​​立​​​CPU(在​​多​​​核​​​系​​​统中​​​)和​​​内​​​存​​​节​​​点​​​
cpuacct 自动生成CPU​​​使​​​用​​​​​报​​​告​​​
memory 限制内存使用 并自动生成内存使用报告
devices 限制设备访问
blkio ​​限制块​​​设​​​备I/O
net_cls 标记网络数据包
net_prio 设置网络流量优先级
freezer 暂停/恢复Cgroups中的任务
pids 限制Cgroups中的任务数量
1
2
3
ls /sys/fs/cgroup/cpu/docker/

ls /sys/fs/cgroup/memory/docker/

参考