文章目录

  • 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等

docker o限制 磁盘i docker限制硬盘_容器


docker o限制 磁盘i docker限制硬盘_docker_02


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比较控制器和父级值

docker o限制 磁盘i docker限制硬盘_内存管理_03


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,只会消耗cpu
top 可以看到dd占用cpu为100%
echo 18367 > tasks 让进程id和tasks关联 (18367为dd进程Pid)
top再看

docker o限制 磁盘i docker限制硬盘_docker o限制 磁盘i_04


docker o限制 磁盘i docker限制硬盘_docker o限制 磁盘i_05


docker o限制 磁盘i docker限制硬盘_docker o限制 磁盘i_06


docker o限制 磁盘i docker限制硬盘_磁盘读写_07


1.3 容器内控制

docker run --help | grep cpudocker run -it --name vm1 --cpu-period 100000 --cpu-quota 20000 ubuntu和刚才限制一样
cd /sys/fs/cgroup/cpu/docker/43a2eb46a009ed10e2b5c4bcc6415bf83b568ae4b4d05 1f2af0546c4591d3de5 进入容器子系统
cat cpu.cfs_quota_us #确实是20000
docker container attach vm1

root@386f8ee98a04:/# dd if=/dev/zero of=/dev/null &
[1] 15
root@386f8ee98a04:/#

top 看到两个dd命令都是20%

docker o限制 磁盘i docker限制硬盘_容器_08


docker o限制 磁盘i docker限制硬盘_磁盘读写_09


docker o限制 磁盘i docker限制硬盘_docker_10


2.内存的限制

2.1 容器中内存的限制

容器可用内存包括:物理内存、swap分区(操作系统也是)。但是一旦切换到swap分区,性能就不能保证了,因为swap是物理硬盘,当然没有内存快。
docker run -it --memory 256M --memory-swap=256M ubuntu

2.2 操作系统层面内存的限制

cd /sys/fs/cgroup/memorymkdir a2
cd a2
cat memory.limit_in_bytes 内存限额,默认不限制 #比如限制只能使用256M 25610241024=268435456 [
echo 268435456 > memory.limit_in_bytes
df -H/dev/shm #这个目录挂载的是内存的1/2
free -m看到当前可用内存

docker o限制 磁盘i docker限制硬盘_docker o限制 磁盘i_11


docker o限制 磁盘i docker限制硬盘_磁盘读写_12


测试:

cd /dev/shmdd if=/dev/zero of=bigfile bs=1M count=100占用100M内存
free-m total发现100M可以,200M,300M都可以

docker o限制 磁盘i docker限制硬盘_docker o限制 磁盘i_13


刚才装的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

docker o限制 磁盘i docker限制硬盘_容器_14


注意这里可用内存并没有减少,因为使用了swap,swap减少了,多出去的不能使用内存,所以使用了swap


彻底限制
rm -fr bigfilecd /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限制成功

docker o限制 磁盘i docker限制硬盘_docker o限制 磁盘i_15

3.block io限制:对系统磁盘读写的限制

4.1 文件系统层面的

cd /sys/fs/cgroup/blkiomkdir a3
ls

blkio.throttle.read_bps_device 每秒读的数据量

blkio.throttle.read_iops_device 每秒的io操作次数

docker o限制 磁盘i docker限制硬盘_内存管理_16


docker里也有相关参数
docker run --help | grep device

docker o限制 磁盘i docker限制硬盘_内存管理_17

测试每秒写入数据量为1M
fdisk -l看到当前使用磁盘为/dev/nvme0n1
ll /dev/nvme0n1 看到磁盘的主号和辅号(259和0)
cd /sys/fs/cgroup/blkio/a3
echo "259:0 1048576" > blkio.throttle.write_bps_device 1024 * 1024=1048576,限制磁盘每秒写入数据量为1M

测试
cdcgexec -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 生效

docker o限制 磁盘i docker限制硬盘_容器_18


docker o限制 磁盘i docker限制硬盘_容器_19


docker o限制 磁盘i docker限制硬盘_docker o限制 磁盘i_20


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/dockercd 14e90e085efeed3315999d0de0d137d10d819d93dd3ebd250cac4e8f70c4f03c

cat blkio.throttle.write_bps_device 看到和之前手动写入的一样

docker o限制 磁盘i docker限制硬盘_docker o限制 磁盘i_21


docker o限制 磁盘i docker限制硬盘_容器_22

4.其他限制 (管控系统进程暂停与恢复的)

cd /sys/fs/cgroup/freezer管控系统进程暂停与恢复的
ls
cd docker/97d6b27c74e4b9e8d444beb74866a8bbdf6853387600f6331dd15da65e6d8ad9
ls
cat tasks查看进程号
cat freezer.state THAWED #表示活跃的

docker o限制 磁盘i docker限制硬盘_docker o限制 磁盘i_23


docker container pause vm1尝试将其冻结
cat freezer.stateFROZEN冻结
docker container attach vm1 不能进入,但是进程还在
cat tasks
ps ax |grep 19193 进程中找到进程号,D表示冻结,暂停

docker o限制 磁盘i docker限制硬盘_容器_24


docker container unpause vm1解冻
cat freezer.stateTHAWED
ps ax |grep 19193
docker container attach vm1
docker container prune删除所有退出的容器

docker o限制 磁盘i docker限制硬盘_docker_25


docker o限制 磁盘i docker限制硬盘_docker o限制 磁盘i_26


docker o限制 磁盘i docker限制硬盘_docker_27


docker run -it --rm --memory 256MB --memory-swap 256MB ubuntu

root@7bc8bd110355:/# free -m ##容器中看内存

free -m 器外看内存

docker o限制 磁盘i docker限制硬盘_docker o限制 磁盘i_28


注意:发现容器内虽然已经限制了,但是看到的总内存和容器外一样,没有做到完全的隔离,也是一 个不安全的点,需要安全加固