docker 限制应用资源的原理 --- cgroup-- namespace
内存限制 cgroup
# 1.docker如何做资源限制(内存限制)
docker run -m 限制内存
# 2.原理是什么?
-m指定限制内存的数量,docker通过内核参数 Cgroup对资源进行限制
# 3.Cgroup作用?
在操作系统解决了资源相互隔离的问题以后,还需要解决资源限制的问题,也就是避免在同一个操作系统中,
防止有些资源消耗较大的容器,将整个物理机器(宿主机)的硬件资源(CPU, Memory) 占满。
# 4.容器与容器之间的资源如何隔离?
Namespace 名称空间隔离
# 5.为什么容器与容器之间的资源可以通过ns进行隔离?
因为docker容器运行起来是一个进程,每一个容器都是一个进程,进程之间用来资源隔离的就是Namespace
[root@docker01 ~]# cat /proc/cgroups
#subsys_name hierarchy num_cgroups enabled
cpuset 10 5 1
cpu 2 56 1
cpuacct 2 56 1
memory 4 56 1
devices 9 56 1
freezer 11 5 1
net_cls 5 5 1
blkio 3 56 1
perf_event 6 5 1
hugetlb 7 5 1
pids 8 56 1
net_prio 5 5 1
## 给SSH服务资源限制
[root@docker01 ~]# cd /sys/fs/cgroup/memory/system.slice/sshd.service
[root@docker01 sshd.service]# cat memory.limit_in_bytes
9223372036854771712 = 7.777G
[root@docker01 ~]# cd /sys/fs/cgroup/memory/system.slice/sshd.service
[root@docker01 sshd.service]# echo 64k > memory.limit_in_bytes
[root@docker01 sshd.service]# echo 9223372036854771712 > memory.limit_in_bytes
[root@docker01 sshd.service]# cat memory.limit_in_bytes
9223372036854771712
CPU限制 cpulimit
## 安装
yum install cpulimit -y
### 查询帮助
[root@docker03 ~]# cpulimit --help
Usage: cpulimit [OPTIONS...] TARGET
OPTIONS
-l, --limit=N percentage of cpu allowed from 0 to 400 (required)
-v, --verbose show control statistics
-z, --lazy exit if there is no target process, or if it dies
-i, --include-children limit also the children processes
-h, --help display this help and exit
TARGET must be exactly one of these:
-p, --pid=N pid of the process (implies -z)
-e, --exe=FILE name of the executable program file or path name
COMMAND [ARGS] run this command and limit it (implies -z)
命令帮助
# NUM 为整数值,默认为对 1 个 CPU的限制,多个 CPU 时可以累计,如 NUM * CPU_NUM
# PID 为进程 ID,限制该进程的 CPU 使用率为 NUM%
cpulimit -l <限制的CPU百分比> -p <进程ID>
常用参数:
-l 或 --limit:指定 CPU 使用的上限百分比(例如:50 表示该进程使用的 CPU 不超过 50%)。
-p 或 --pid:指定要限制的进程 ID。
-e 或 --exe:通过可执行文件的名称限制进程(无需提供 PID)。例如 cpulimit -e firefox -l 30 限制 firefox 的 CPU 使用率为 30%。
-P 或 --path:通过提供可执行文件的完整路径来限制 CPU 使用率。
-b 或 --background:在后台运行 cpulimit。
-z 或 --lazy:仅在进程完全占用一个 CPU 核心时才应用限制。
-v 或 --verbose:显示详细的执行信息,帮助调试和了解运行过程
注意:
更多参数可通过 cpulimit --help 查看;
限制 CPU 的百分比按照实际的 CPU 数量而定,比如单核最高为 100%,双核最高为 200%,三核最高为 300%,以此类推即可;
root 用户可以限制所有的进程,普通用户只能限制用户有权限管理的进程。
cpulimit 并不改变进程的优先级,它只通过对进程的 CPU 调度施加限制来减少 CPU 使用率。
示例
限制 CPU 使用率最高的进程的 CPU 使用率为 50%.
# 获取 CPU 使用率最高的进程 ID,输入下面的 top 命令后,按 P 以CPU使用率排序进程
top
# 限制该进程的 CPU 使用率为 50%
cpulimit -p PID -l 50、
# 根据软件的绝对路径限制
cpulimit -P /usr/local/nginx/sbin/nginx -l 60
# 通过 PID 限制进程的 CPU 使用率:这将限制进程 ID 为 12345 的进程使用 CPU 不超过 40%。
cpulimit -p 12345 -l 40
# 通过进程名称限制 CPU 使用率:这将限制名为 my_program 的进程使用 CPU 不超过 20%。
cpulimit -e my_program -l 20
# 在后台限制 CPU 使用率:这将在后台限制进程 ID 为 6789 的进程使用 CPU 不超过 30%。
cpulimit -p 6789 -l 30 -b