docker容器资源配额控制之cpu
未做cpu资源配额控制前
1、使用docker.io/centos(官方镜像)启动并进入一个容器
docker run -ti 1e1148e4cc2c /bin/bash
2、在该容器中编译安装stress硬件性能压力测试工具
下载stress
yum install -y wget
wget http://people.seas.harvard.edu/~apw/stress/stress-1.0.4.tar.gz
编译安装该软件
tar zxvf stress-1.0.4.tar.gz
rm -fr stress-1.0.4.tar.gz
cd stress-1.0.4/
./configure
报错:
[root@4602a294419b stress-1.0.4]# ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... no
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/stress-1.0.4':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details.
解决办法:
安装gcc依赖
yum install gcc -y
make -j 4
报错:
bash: make: command not found
解决办法:
安装make
yum install -y make
make install
stress参数解释
-? 显示帮助信息
-v 显示版本号
-q 不显示运行信息
-n 显示已完成的指令情况
-t --timeout N 指定运行N秒后停止
--backoff N 等待N微妙后开始运行
-c 产生n个进程 每个进程都反复不停的计算随机数的平方根,测试cpu
-i 产生n个进程 每个进程反复调用sync(),sync()用于将内存上的内容写到硬盘上,测试io
-m --vm n 产生n个进程,每个进程不断调用内存分配malloc和内存释放free函数 ,测试内存
--vm-bytes B 指定malloc时内存的字节数 (默认256MB)
--vm-hang N 指定在free栈的秒数
-d --hadd n 产生n个执行write和unlink函数的进程
--hadd-bytes B 指定写的字节数
--hadd-noclean 不unlink
3、压力测试
因为docker的物理机有4颗cpu,所以使用stress压力测试工具同时测试4颗cpu
stress -c 4 -i 4 -t 1m
这时候发现4颗cpu资源几乎全部耗尽!(如下图)
开启cpu资源配额控制
cpuset-cpus命令单独使用
1、查看docker物理机的cpu信息
cat /proc/cpuinfo | grep processor
cat /proc/cpuinfo | grep processor | wc -l
2、使用docker.io/centos镜像启动一个名称为centos-1的容器,并限制该容器之使用0和1这两颗cpu
docker run -it --name centos-1 --cpuset-cpus 0-1 docker.io/centos /bin/bash
3、安装stress
该步骤和上一章"未做cpu资源配额控制前"的第二小节一致,这里就不在累述了!
4、压力测试
stress -c 2 -i 2 -t 2m
stress -c 4 -i 4 -t 2m
测试结果:
物理机上只有0和1这两颗cpu资源被占用,2和3的cpu资源没有使用,说明限制成功!
cpuset-cpus和cpu-shares混合使用
1、分别使用docker.io/centos镜像启动centos-2和centos-3两个容器,其中centos-2的cpu-shares为512,centos-3的cpu-shares为1024
docker run -it --name centos-2 --cpuset-cpus 0-1 --cpu-shares 512 docker.io/centos /bin/bash
docker run -it --name centos-3 --cpuset-cpus 0-1 --cpu-shares 1024 docker.io/centos /bin/bash
2、在centos-2和centos-3上分别安装stress
步骤略
3、分别在centos-2和centos-3上运行stress命令
stress -c 2 -v -t 2m
4、测试结果
这时候可以发现cpu0和1全部被跑满,但是cpu2和3则未受影响;同样两个stress进程的比值也为1:2,说明cpu-shares设置也生效了!