您的位置:首页 > 运维架构 > Docker

Docker集群(二) —— Docker资源管理

2016-04-15 15:24 746 查看
Docker集群—— Docker资源管理


【摘要】本文介绍在多核CPU下管理docker对主机资源的使用。通常我们关心的是cpu和内存的使用,本文主要介绍这两个。

1
工具stress

为了测试CPU、内存的使用,需要有一个工具。已经有好心人做好了stress镜像,我直接pull下来了。Stress是一个压力测试工具,简单给出stress的命令参数,以便大家使用:

-? 显示帮助信息

-v 显示版本号

-q 不显示运行信息

-n 显示已完成的指令情况

-t --timeout N 指定运行N秒后停止

--backoff N 等待N微妙后开始运行

-c 产生n个进程 每个进程都反复不停的计算随机数的平方根

-i 产生n个进程 每个进程反复调用sync(),sync()用于将内存上的内容写到硬盘上

-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

时间单位可以为秒s,分m,小时h,天d,年y,文件大小单位可以为K,M,G

一会我就启动一个叫stress的镜像,并给一些参数来测试。

2 Docker
的CPU使用管理

先查看下我的CPU信息:cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq –c

viener@viener-01:~$ cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

4 Intel Xeon E312xx (Sandy Bridge)

这是一个4核CPU。

cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

4

Centos 系统:

查看逻辑cpu个数:cat /proc/cpuinfo | grep "processor" | wc–l

查看物理cpu个数:cat /proc/cpuinfo | grep "physical id" |sort | uniq | wc -l

如果所有物理cpu的cores个数加起来小于逻辑cpu的个数,则该cpu使用了超线程技术。查看每个物理cpu中逻辑cpu的个数:cat /proc/cpuinfo | grep"siblings"

2.1
Docker的亲核

Docker命令可以设置跑在那个核上面。比如:

docker run -it
eminguez/docker-stress-c 3

这条命令表示我启动一个eminguez/docker-stress镜像,命令参数-c 3表示里面产生3个进程。可以看到在4个核上面,3个进程是漂的:

通过top -d 1命令,点f增加Last used cpu信息,用空格增加选中的列:

PID USER PR NI VIRT RES SHR S %MEM TIME+ P COMMAND %CPU

18516 root 20 0 7268 96 0 R 0.0 3:11.61 3 stress 100.0

18517 root 20 0 7268 96 0 R 0.0 3:11.37 0 stress 100.0

18518 root 20 0 7268 96 0 R 0.0 3:12.07 1
stress 99.1

PID USER PR NI VIRT RES SHR S %MEM TIME+ P COMMAND %CPU

18516 root 20 0 7268 96 0 R 0.0 3:11.61 2 stress 100.0

18517 root 20 0 7268 96 0 R 0.0 3:11.37 3 stress 100.0

18518 root 20 0 7268 96 0 R 0.0 3:12.07
0 stress 99.1

通过docker run -it
--cpuset=0 eminguez/docker-stress -c 1指定容器启动在cpu0上面

PID USER PR NI VIRT RES SHR S %MEM TIME+ P COMMAND %CPU

18589 root 20 0 7268 92 0 R 0.0 1:15.92
0
stress 100.0

可以看到stress进程固定跑在cpu0上面。占用了这个核的全部100%。

2.2
CPU share

之所以叫share,是因为Docker无法限制一个容器使用CPU的多少。比如只能限制使用20%,超过了就不给用了,无法做到这样。他只能限制一个比例(配额),通过docker
run –c
参数。

每个新的容器默认的将有1024CPU配额,当我们单独讲它的时候,这个值并不意味着什么。但是如果我们启动两个容器并且两个都将使用 100%CPU,CPU时间将在这两个容器之间平均分割,因为它们两个都有同样的CPU配额(为了简单起见,假设没有任何其他进程在运行)。如果我们设置容器的CPU配额是512,相对于另外一个容器,它将使用一半的CPU时间。但这不意味着它仅仅能使用一半的CPU时间。如果另外一个容器(1024配额的)是空闲的
- 我们的容器将被允许使用100%CPU


比如我使用-c给一个容器256的配额(默认是1024),但是他不会仅使用1/4的CPU

docker run -it --cpuset=0 -c
256 eminguez/docker-stress -c 1。

PID USER PR NI VIRT RES SHR S %MEM TIME+ P COMMAND %CPU

18656 root 20 0 7268 92 0 R 0.0 1:15.92
0
stress 100.0

我们看到他还是使用了CPU 0 100%的CPU。

但是,当我再启动一个容器,也绑定在CPU0上面并且给他768的配额:

dockerrun -it --cpuset=0 -c 768 eminguez/docker-stress -c 1

PID USER PR NI VIRT RES SHR S %MEM TIME+ P COMMAND %CPU

18753 root 20 0 7268 92 0 R 0.0 0:18.74 0
75.3 stress

18656 root 20 0 7268 92 0 R 0.0 3:15.27 0
25.8 stress

有趣的事情发生了,刚才的18656进程仅使用到了25.8%的CPU,因为他被配额更高的容器抢了CPU使用。

注意:这是将他们绑定到一个cpu上面,如果他们各自使用一个核的话,仍然可以占用全部的CPU!

3 内存的使用

通过docker run -m 参数可以控制容器使用的内存大小。
比如,通过docker run -it -m 10m eminguez/docker-stress -m 1 --vm-bytes 19M--vm-hang 1命令启动stress,申请19M的内存,同时限制容器最多使用10M的内存。这时他应该启动不了。

viener@viener-01:~$ docker run -it -m 10m eminguez/docker-stress -m 1 --vm-bytes 19M --vm-hang 1

stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd

stress: dbug: [1] using backoff sleep of 3000us

stress: dbug: [1] --> hogvm worker 1 [6] forked

stress: dbug: [6] allocating 19922944 bytes ...

stress: dbug: [6] touching bytes in strides of 4096 bytes ...

stress: dbug: [6] sleeping for 1s with allocated memory

stress: dbug: [6] freed 19922944 bytes

stress: dbug: [6] allocating 19922944 bytes ...

但是他却成功了…
因为linux中内存的限制有两块: memory
和 swap 。这意味着
Docker 将分配给容器
-m
内存值以及
-m
swap
值。是限定容器内存的两倍。所以,当我们限制容器10m,并且申请21M的内存时,就运行不了了。

viener@viener-01:~$ docker run -it -m 10m eminguez/docker-stress -m 1 --vm-bytes 21M --vm-hang 1

stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd

stress: dbug: [1] using backoff sleep of 3000us

stress: dbug: [1] --> hogvm worker 1 [5] forked

stress: dbug: [5] allocating 22020096 bytes ...

stress: dbug: [5] touching bytes in strides of 4096 bytes ...

stress: FAIL: [1] (420) <-- worker 5 got signal 9

stress: WARN: [1] (422) now reaping child worker processes

stress: FAIL: [1] (426) kill error: No such process

stress: FAIL: [1] (456) failed run completed in 0s

有的机器会出现:WARNING: Yourkernel does not support swap limit capabilities, memory
limited without swap.
同时,不管申请多少资源都可以启动,就好像-m参数限制内存没有起作用一样。原因是因为没有限制swap内存使用。可以通过:在/etc/default/grub文件中增加GRUB_CMDLINE_LINUX="cgroup_enable=memory
swapaccount=1”,之后sudo update-grub并且重启系统,就会发现-m参数生效了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: