文章目录
- 1.容器资源控制
- 1.1 资源控制方式
- 1.2 操作系统层面控制
- 1.3 容器内控制
- 2.内存的限制
- 2.1 容器中内存的限制
- 2.2 操作系统层面内存的限制
- 3.block io限制:对系统磁盘读写的限制
- 4.1 文件系统层面的
- 4.2 docker中的block io限制
- 4.其他限制 (管控系统进程暂停与恢复的)
1.容器资源控制
1.1 资源控制方式
linux Cgroups:是限制一个进程组使用资源的上限,包括cpu、内存、磁盘、带宽等。
mount -t cgroup
看到都挂载在/sys/fs/cgroup下,df也可以看cat /etc/security/limits.conf
这里也可以设置进程数,内存等, 但是不是很准确,因为还有swap分区docker run --help
可以在docker启动是指定使用的内存,cpu等
cd/ sys/fs/cgroup/
里面的子目录也叫子系统,限制系统的各项性能在每个子系统下,为每个容器创建一个控制组cd /sys/fs/cgroup/cpu
mkdir /sys/fs/cgroup/cpu/a1
cd a1
会自动多出来文件,从上层目录自动拷贝cat /sys/fs/cgroup/cpu/cpu.rt_period_us
cat /sys/fs/cgroup/cpu/a1/cpu.rt_period_us
比较控制器和父级值
1.2 操作系统层面控制
yum search cgroup
查找cgroup命令行工具yum install -y libcgroup-tools.x86_64
安装cgroup命令行工具cd /sys/fs/cgroup/cpu
cat cpu.cfs_period_us
cpu调用周期,单位:微秒cat cpu.cfs_quota_us
配额限制,-1表示不限制cd a1
echo 20000 > cpu.cfs_quota_us
表示100000微秒的周期内, 只能使用20000,也就是20%
验证dd if=/dev/zero of=/dev/null &
这是一个无限循环的进程,不会占用磁盘和IO,只会消耗cputop
可以看到dd占用cpu为100%echo 18367 > tasks
让进程id和tasks关联 (18367为dd进程Pid)top
再看
1.3 容器内控制
docker run --help | grep cpu
docker run -it --name vm1 --cpu-period 100000 --cpu-quota 20000 ubuntu
和刚才限制一样cd /sys/fs/cgroup/cpu/docker/43a2eb46a009ed10e2b5c4bcc6415bf83b568ae4b4d05 1f2af0546c4591d3de5
进入容器子系统cat cpu.cfs_quota_us
#确实是20000docker container attach vm1
root@386f8ee98a04:/# dd if=/dev/zero of=/dev/null &
[1] 15
root@386f8ee98a04:/#
top
看到两个dd命令都是20%
2.内存的限制
2.1 容器中内存的限制
容器可用内存包括:物理内存、swap分区(操作系统也是)。但是一旦切换到swap分区,性能就不能保证了,因为swap是物理硬盘,当然没有内存快。docker run -it --memory 256M --memory-swap=256M ubuntu
2.2 操作系统层面内存的限制
cd /sys/fs/cgroup/memory
mkdir a2
cd a2
cat memory.limit_in_bytes
内存限额,默认不限制 #比如限制只能使用256M 25610241024=268435456 [echo 268435456 > memory.limit_in_bytes
df -H
/dev/shm #这个目录挂载的是内存的1/2free -m
看到当前可用内存
测试:
cd /dev/shm
dd if=/dev/zero of=bigfile bs=1M count=100
占用100M内存free-m total
发现100M可以,200M,300M都可以
刚才装的cgexec命令,可以直接在命令行控制资源组cgexec -g memory:a2 dd if=/dev/zero of=bigfile bs=1M count=100
占用100M,可以 '发现200M300M 怎么还是都可以cgexec -g memory:a2 dd if=/dev/zero of=bigfile bs=1M count=300
free-m
注意这里可用内存并没有减少,因为使用了swap,swap减少了,多出去的不能使用内存,所以使用了swap
彻底限制rm -fr bigfile
cd /sys/fs/cgroup/memory/a2/
cat memory.memsw.limit_in_bytes
没有限制echo 268435456 > memory.memsw.limit_in_bytes
表示物理内存和swap一共不能超过256M
再次测试:cd /dev/shm
cgexec -g memory:a2 dd if=/dev/zero of=bigfile bs=1M count=400
限制成功
3.block io限制:对系统磁盘读写的限制
4.1 文件系统层面的
cd /sys/fs/cgroup/blkio
mkdir a3
ls
blkio.throttle.read_bps_device 每秒读的数据量
blkio.throttle.read_iops_device 每秒的io操作次数
docker里也有相关参数docker run --help | grep device
测试每秒写入数据量为1Mfdisk -l
看到当前使用磁盘为/dev/nvme0n1ll /dev/nvme0n1
看到磁盘的主号和辅号(259和0)cd /sys/fs/cgroup/blkio/a3
echo "259:0 1048576" > blkio.throttle.write_bps_device
1024 * 1024=1048576,限制磁盘每秒写入数据量为1M
测试cd
cgexec -g blkio:a3 dd if=/dev/zero of=testfile bs=1M count=10
发现没有生效
注意:目前blockio限制只对directio有效(不使用文件缓存)cgexec -g blkio:a3 dd if=/dev/zero of=testfile bs=1M count=10 oflag=direct
生效
4.2 docker中的block io限制
docker run -it --name vm1 --device-write-bps /dev/nvme0n1:1MB ubuntu
创建镜像
root@14e90e085efe:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@14e90e085efe:/# dd if=/dev/zero of=testfile bs=1M count=10 oflag=direct #限速,ctrl+p+q退出
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 10.0019 s, 1.0 MB/s
cd /sys/fs/cgroup/blkio/docker
cd 14e90e085efeed3315999d0de0d137d10d819d93dd3ebd250cac4e8f70c4f03c
cat blkio.throttle.write_bps_device
看到和之前手动写入的一样
4.其他限制 (管控系统进程暂停与恢复的)
cd /sys/fs/cgroup/freezer
管控系统进程暂停与恢复的ls
cd docker/97d6b27c74e4b9e8d444beb74866a8bbdf6853387600f6331dd15da65e6d8ad9
ls
cat tasks
查看进程号cat freezer.state
THAWED #表示活跃的
docker container pause vm1
尝试将其冻结cat freezer.state
FROZEN冻结docker container attach vm1
不能进入,但是进程还在cat tasks
ps ax |grep 19193
进程中找到进程号,D表示冻结,暂停
docker container unpause vm1
解冻cat freezer.state
THAWEDps ax |grep 19193
docker container attach vm1
docker container prune
删除所有退出的容器
docker run -it --rm --memory 256MB --memory-swap 256MB ubuntu
root@7bc8bd110355:/# free -m ##容器中看内存
free -m
器外看内存
注意:发现容器内虽然已经限制了,但是看到的总内存和容器外一样,没有做到完全的隔离,也是一 个不安全的点,需要安全加固