之前写过一篇利用cgroup对docker进行全局资源限制(CPU, 内存, IO读写等限制) 的教程,那篇文章针对的是拥有systemd服务的linux环境,现在下面的是类似的教程,针对的是alpine这种没有systemd服务的linux环境,同样限制CPU和IO读写(本次不限制内存,因为服务商一般不会限制内存的使用率)


以下是我的一台服务器的配置情况,准备限制最高40%的CPU占用及磁盘IO占用

  • Alpine Linux
  • OpenRC
  • cgroup v2
  • 4 核 CPU
  • Docker 磁盘设备:`8:0`
  • CPU 限制:40%,即 1.6 核
  • 读取限制:205 MiB/s
  • 写入限制:175 MiB/s

1. 确认 cgroup

docker info --format 'driver={{.CgroupDriver}} version={{.CgroupVersion}}'

预期输出:

driver=cgroupfs version=2

2. 创建 OpenRC 服务

编辑:

vi /etc/init.d/docker-limit

写入:

#!/sbin/openrc-run


description="Limit aggregate Docker CPU and disk IO"


# 限制参数

CPU_QUOTA=160000

CPU_PERIOD=100000

IO_DEVICE="8:0"

READ_MIBPS=205

WRITE_MIBPS=175


CGROUP="/sys/fs/cgroup/docker-limit"


depend() {

    need cgroups

    before docker

}


start() {

    ebegin "Applying Docker CPU and IO limits"


    echo "+cpu +io" > /sys/fs/cgroup/cgroup.subtree_control

    mkdir -p "$CGROUP"


    echo "$CPU_QUOTA $CPU_PERIOD" > "$CGROUP/cpu.max"


    read_bps=$((READ_MIBPS * 1024 * 1024))

    write_bps=$((WRITE_MIBPS * 1024 * 1024))


    echo "$IO_DEVICE rbps=$read_bps wbps=$write_bps" > "$CGROUP/io.max"


    eend $?

}

3. 配置 Docker

编辑:

vi /etc/docker/daemon.json

写入或合并:

{

  "cgroup-parent": "/docker-limit"

}

4. 启用并重启服务

chmod +x /etc/init.d/docker-limit

rc-update add docker-limit boot

dockerd --validate --config-file=/etc/docker/daemon.json

rc-service docker stop

rc-service docker-limit restart

rc-service docker start

5. 验证限制

cat /sys/fs/cgroup/docker-limit/cpu.max

cat /sys/fs/cgroup/docker-limit/io.max

预期输出:

160000 100000

8:0 rbps=214958080 wbps=183500800 riops=max wiops=max

验证容器所属 cgroup:

docker run --rm --cgroupns=host alpine cat /proc/self/cgroup

预期路径包含:

/docker-limit/

已有容器需要重新创建后再使用新限制。