docker 是一个非常不错的容器, 让我们可以先把程序部署在镜像中, 然后再放到某个实体机器上跑. 若一个实体机中我们使用多个容器, 我们可能需要限制一个容器占用的系统资源. 比如内存, CPU 等
docker run reference 中提供了一些参数来处理系统限制.
内存,CPU的系统限制如下:
Option | Description |
---|---|
-m, --memory="" | Memory limit (format: <number>[<unit>] , where unit = b, k, m or g) |
--memory-swap="" | Total memory limit (memory + swap, format: <number>[<unit>], where unit = b, k, m or g) |
-c, --cpu-shares=0 | CPU shares (relative weight) |
--cpu-period=0 | Limit the CPU CFS (Completely Fair Scheduler) period |
--cpuset-cpus="" | CPUs in which to allow execution (0-3, 0,1) |
--cpuset-mems="" | Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems. |
--cpu-quota=0 | Limit the CPU CFS (Completely Fair Scheduler) quota |
--blkio-weight=0 | Block IO weight (relative weight) accepts a weight value between 10 and 1000. |
--oom-kill-disable=false | Whether to disable OOM Killer for the container or not. |
--memory-swappiness="" | Tune a container’s memory swappiness behavior. Accepts an integer between 0 and 100. |
设置内存处理标志
Option | Result |
---|---|
memory=inf, memory-swap=inf (default) | There is no memory limit for the container. The container can use as much memory as needed. |
memory=L<inf, memory-swap=inf | (specify memory and set memory-swap as -1) The container is not allowed to use more than L bytes of memory, but can use as much swap as is needed (if the host supports swap memory). |
memory=L<inf, memory-swap=2*L | (specify memory without memory-swap) The container is not allowed to use more than L bytes of memory, swap *plus* memory usage is double of that. |
memory=L<inf, memory-swap=S<inf, L<=S | (specify both memory and memory-swap) The container is not allowed to use more than L bytes of memory, swap *plus* memory usage is limited by S. |
比如我们可以使用
docker run -ti -m 300M --memory-swap -1 centos /bin/bash
其中 -m 300M 限制内存最多占用 300MB, 此处支持 B, K, M, G 等.
--memory-swap -1 表示交换分区不限制
docker run -ti --memory-swappiness=0 centos /bin/bash
表示 docker 不使用交换分区.
docker run -ti --cpuset-cpus="1,3" centos /bin/bash
表示 docker 仅使用 1, 3 两个 cpu 进程
docker run -ti --cpuset-cpus="0-2" centos /bin/bash
表示 docker 仅使用 0, 1, 2 三个 cpu 进程
docker run -ti --cpuset-mems="1,3" centos /bin/bash
表示 docker 仅使用 1, 3 两个 cpu 进程管理的内存
docker run -ti --cpuset-mems="0-2" centos /bin/bash
表示 docker 仅使用 0, 1, 2 三个 cpu 进程管理的内存
--cpu-period 和 --cpu-quota 一般一起使用.
docker run -ti --cpu-period=50000 --cpu-quota=25000 centos /bin/bash
这样表示一个 cpu 每 50ms 占用 cpu 50% 的资源占用.
References:
- Docker —— 从入门到实践 http://yeasy.gitbooks.io/docker_practice/content/index.html
- Docker run reference https://docs.docker.com/reference/run/#runtime-constraints-on-resources
8 Comments
Nail · May 13, 2016 at 10:15
整理得很好
Alex · September 29, 2015 at 19:59
docker现在很火呢。
yu · September 30, 2015 at 22:02
@Alex docker上就是一些使用更加友好的虚拟机. 相比于少量高性能的机器, 大规模的廉价计算机组成的集群可以节省很多成本, 因此, 一直以来, 大家都在寻找更加简单的自动部署工具.
docker的部署非常容易, 系统又是开源免费而且功能足够强大的linux, 部署后运行的本地码效率和在真机上几乎相当, 因此理所当然的被推崇.
其实,像Amazon等公司,早在很多年前就开始这方面的工作了, 只是这两年才被广为人知.
Leniy · September 18, 2015 at 11:05
你也好久不更新了
yu · September 18, 2015 at 14:18
@Leniy 连续消失四五个月的也好意思说我…
yu · September 21, 2015 at 10:07
@Leniy 又–你服务器挂了
Leniy · September 22, 2015 at 15:01
@yu 看了下二级域名,没问题,顶级域名响应时间长。看来服务器质量太差了
yu · September 22, 2015 at 20:25
@Leniy 现在好了,当时报错来着