之前写过一篇利用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/
已有容器需要重新创建后再使用新限制。