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

docker高级应用之cpu与内存资源限制(转)

2017-09-29 21:54 561 查看
1、内存限制

默认docker内存限制可以使用-m参数进行限制,但如果仅-m参数,不添加其他,那么内存限制不会限制死,比如你-m 256m内存,那么容器里程序可以跑到256m*2=512m后才会被oom给杀死,

原因是源码里memory.memsw.limit_in_bytes 值是被设置成我们指定的内存参数的两倍。

源码地址是https://github.com/docker/libcontainer/blob/v1.2.0/cgroups/fs/memory.go#L39

一个内存测试工具:     rpm -Uvh http://pkgs.repoforge.org/stress/stress-1.0.2-1.el7.rf.x86_64.rpm
使用stress进行测试

stress --vm 1 --vm-bytes 190M --vm-hang 0

这个命令是跑190mM的内存

下面是跑的结果

# stress --vm 1 --vm-bytes 190M --vm-hang 0

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

stress: FAIL: [282] (420) <-- worker 283 got signal 9

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

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

可以看到程序死了,想查看程序死的原因可以去/var/log/messages里查看

.................

......................

显示内存使用超过2倍限制的内存,所以进行oom kill掉stress的进程,但容器不会死,仍然能正常运行。

但如果你想写死内存,可以使用

-m 100m --memory-swap=100m

这样就直接限制死,只要程序内存使用超过100m,那么就会被oom给kill。

2、cpu限制

目前cpu限制可以使用绑定到具体的线程,或者是在绑定线程基础上对线程资源权重分配。

绑定线程可以使用参数--cpuset-cpus=7(注意1.6版本才是--cpuset-cpus,1.6版本以下是--cpuset)

分配线程资源使用可以使用参数-c

具体的cpu如何使用与测试,参考上面国外朋友写的文章,很全面。

我这里注意介绍一下我这里平台cpu在容器里是如何使用?

我这里平台是直接把docker弄成iaas平台,然后在这个iaas基础上跑paas;其他的docker云基本都是在openstack的iaas或者其他的iaas里跑docker做paas。

内存使用我是直接限制为256m、512m、1g,cpu默认都是0.2c。

c 的概念是cpu线程,比如你top的时候,使用1命令可以直接看到系统里有多少线程,以16个线程为例,我保留2个c给宿主机系统使用,另外14个c给 docker使用,一个c有5个容器共同使用,最少可以使用20%资源,也就是0.2c,最多可以使用100%资源,也就是1c。

这样好处是线程不忙的时候,容器可以独享100%资源,资源紧张的时候,也就保证自己有20%的资源使用,另外同一台宿主机的容器即使某个资源使用多,也不好太影响其他c的容器。

我这里测试环境出现过某个项目,在进行压力测试的时候,由于没有对容器做资源限制,导致测试中把宿主机压测挂了,导致同台宿主机所有容器都无法访问。

3、查看cpu的状态


1. 简介

ctop 就像 linux 的 top 命令一样,top 用来查看进程的实时状态,而 ctop 用来查看系统中各个容器的实时状态



可以看到当期系统中有哪些容器,通过前面的指示灯可以看出是否在运行状态,还有他们的 CPU、内存、网络、IO 这些重要指标


2. 安装

Linux下安装方法:



执行命令:




3. 使用

ctop 运行后,通过下面的按键可以实现不同的功能
1)a - 只查看运行状态的容器



2)f - 过滤容器
点击 f 按键后,会出现输入框,输入字符后,会列出容器名中包含输入字符的容器



3)h - 显示帮助信息



4)s - 选择排序列

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: