一、虚拟化技术如何限制资源?
vmvare 安装的虚拟机可以通过界面设定cpu、内存... 的资源限制,如下图。docer 容器也同样可以通过指定参数来达到这个目的。其原理为何?请参见
我的环境是一台阿里云服务器。
二、为容器运行限定内存
通过docker run --help
-m, --memory bytes Memory limit --memory-reservation bytes Memory soft limit --memory-swap bytes Swap limit equal to memory plus swap: '-1' to enable unlimited swap
通过docker run指定memory 限制为20MB,算上swap总共可以申请40MB。--vm-bytes记得要改一下(以我的环境来说修改为10MB),否则默认是256MB,内存如果太小一直会分配失败.
stress: dbug: [5] allocating 10485760 bytes ... stress: dbug: [5] touching bytes in strides of 4096 bytes ... stress: dbug: [5] freed 10485760 bytes stress: dbug: [5] allocating 10485760 bytes ... stress: dbug: [5] touching bytes in strides of 4096 bytes ... stress: dbug: [5] freed 10485760 bytes stress: dbug: [5] allocating 10485760 bytes ... stress: dbug: [5] touching bytes in strides of 4096 bytes ... stress: dbug: [5] freed 10485760 bytes stress: dbug: [5] allocating 10485760 bytes ...
三、为容器运行限定cpu
-c, --cpu-shares int CPU shares (relative weight)
开启三个会话:
会话一: 指定cpu权重为10
~]# docker run --cpu-shares=10 --name=test1 ninesun0318/ubuntu-stress --cpu 1 --verbose stress: info: [1] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd stress: dbug: [1] using backoff sleep of 3000us stress: dbug: [1] --> hogcpu worker 1 [5] forked
会话二:top查看该container 的cpu信息
会话一: 指定cpu权重为5
~]# docker run --cpu-shares=5 --name=test2 ninesun0318/ubuntu-stress --cpu 1 --verbose
此时再查看top信息,刚开始两个stress 进程所占cpu分别是33% 70%,刚好是按照权重分配 2:1的关系,过一会两个进程所占cpu都是100%,
这是为什么呢?看完这张图片你应该就知道了。mpstat -P ALL 2 100
代表 查看每颗逻辑cpu的使用状况,每2s输出一次,一共输出100次。
也就是说有两个cpu所以可以并发执行两个stress,docker 运行容器时设定的cpu权重是针对单核cpu,或者说的那个并发任务大于cpu逻辑核心数时,该参数才会生效。
不信你再docker run 一个 strss,cpu权重设定为15%。
两颗cpu都跑慢了,但是cpu权重却生效了,这时也就发生了cpu时钟切换。