docker 资源限制


docker 资源限制
主要讲四个关键字: CPU 内存 交换分区 内存溢出是否关掉进程(容器)
#docker run -it --rm -m 200m --cpus 1.5--memory-swap 512M --oom-kill-disable centos



默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的尽可能多给定资源, Docker提供了控制容器可以限制容器使用多少内存或CPU 的方法, 设置 docker run 命令的运行时配置标志。 其中许多功能都要求宿主机的内核支持 Linux 功能 ,要检查支持,可以使用docker
info 命令 , 如果内核中禁用了某项功能 可能会在输出结尾处看到警告, 如下所示: WARNING: No swap limit support 一、容器的Memory限制 OOM (Out of Memory Exception) 对于 Linux 主机,如果没有足够的内容来执行其他重要的系统任务,将会抛出OOM (Out of Memory Exception,内存溢出、内存泄漏、内存异常 ), 随后系统会开始杀死进程以释放内存, 凡是运行在宿主机的进程都有可能被 kill ,包括 Dockerd和其它的应用程序, 如果重要的系统进程被 Kill,会导致和该进程相关的服务全部宕机。通常越消耗内存比较大的应用越容易被kill,比如:mysql数据库,java程序等 范例:OOM发生后的日志信息 [root@localhost7B ~]# tail -f /var/log/messages Nov 23 15:18:05 localhost7B kernel: Memory cgroup out of memory: Kill process 68605 (stress-ng-vm) score 1256 or sacrifice child Nov 23 15:18:05 localhost7B kernel: Killed process 68605 (stress-ng-vm), UID 0, total-vm:268400kB, anon-rss:141332kB, file-rss:116kB, shmem-rss:0kB 产生 OOM 异常时, Dockerd尝试通过调整 Docker 守护程序上的 OOM 优先级来减轻这些风险,以便它比系统上的其他进程更不可能被杀死 但是容器的OOM 优先级未调整, 这使得单个容器被杀死的可能性比 Docker守护程序或其他系统进程被杀死的可能性更大, 不推荐通过在守护程序或容器上手动设置–oom-score-adj为极端负数,或通过在容器上设置 —oom-kill-disable来绕过这些安全措施 OOM 优先级机制: linux会为每个进程算一个分数,最终将分数最高的kill /proc/PID/oom_score_adj #范围为 -10001000,值越高容易被宿主机 kill掉,如果将该值设置为 -1000 ,则进程永远不会被宿主机 kernel kill /proc/PID/oom_adj #范围为 -17 到+15 ,取值越高越容易被干掉,如果是 -17 , 则表示不能被 kill ,该设置参数的存在是为了和旧版本的 Linux 内核兼容。 /proc/PID/oom_score #这个值是系统综合进程的内存消耗量、 CPU 时间 (utime + 、存活时间 (uptime – start time) 和 oom_adj 计算出的进程得分 ,消耗内存越多得分越高,容易被宿主机 kernel 强制杀死 [root@localhost7B ~]# cat /proc/3028/oom_score_adj -999 [root@localhost7B ~]# cat /proc/3028/oom_score 0 [root@localhost7B ~]# cat /proc/3028/oom_adj -16 容器的内存限制 Docker 可以强制执行硬性内存限制,即只允许容器使用给定的内存大小。 Docker 也可以执行非硬性内存限制,即容器可以使用尽可能多的内存,除非内核检测到主机上的内存不够用了 内存相关选项 b,k,m,g 表示字节,千字节,兆字节或千兆字节 -m,--memory= #容器可以使用的最大内存量,硬限制,此选项最小允许值为4m --memory-swap #允许此容器交换到磁盘的内存量,容器可以使用的交换分区大小,必须要设置了(-m)物理内存限制的前提才能设置交换分区限制,而且要比(-m)物理内存大。 --memory-swappiness #设置容器使用交换分区的倾向性,值越高表示越倾向于使用swap分区,范围为0-100,0为能不用就不用,1000为能用就用 --memory-reservation#允许指定小于—memory 的软限制 ,当 Docker 检测到主 机上的争用或内存不足时会激活该限制,如果使–memory-reservation,则必须将其设置为低于 — memory 才能使其优先。 因为它是软限制,所以不能保证容器不超过限制 --kernel-memory #容器可以使用的最大内核内存量,最小为 4m,由于内核内存与用户空间内存隔离,因此无法与用户空间内存直接交换,因此内核内存不足的容器可能会阻塞宿主主机资源,这会对主机和其他容器或者其他服务进程产生影响,因此不要设置内核内存大小此项设置 --oom-kill-disable #默认情况下,如果发生内存不足(OOM)错误,则内核将终止容器中的进程。要更改此行为,请使用该--oom-kill-disable选项。仅在设置了该-m/--memory选项的容器上禁用OOM杀手。如果-m未设置该标志,则主机可能会用完内存,内核可能需要终止主机系统的进程以释放内存 swap限制说明: --memory-swap 只有在设置了--memory 后才会有意义。使用 Swap,可以让容器将超出限制部分的内存置换到磁盘上,WARNING:经常将内存交换到磁盘的应用程序会降低性能 不同的–memory-swap 设置会产生不同的效果: --memory-swap #值为正数, 那么--memory 和--memory-swap 都必须要设置,--memory-swap 表示你能使用的内存和 swap 分区大小的总和,例如: --memory=300m, --memory-swap=1g, 那么该容器能够使用 300m 物理内存和 700m swap,即--memory 是实际物理内存大小值不变,而 swap 的实际大小计算方式为(--memory-swap)-(--memory)=容器可用 swap --memory-swap #如果设置为 0,则忽略该设置,并将该值视为未设置,即未设置交换分区 --memory-swap #如果等于--memory 的值,并且--memory 设置为正整数,容器无权访问 swap --memory-swap #如果未设置,如果宿主机开启了 swap,则实际容器的swap 值最大为 2x( --memory),即两倍于物理内存大小,例如,如果--memory="300m"与--memory-swap没有设置,该容器可以使用300m总的内存和600m交撒空间,但是并不准确(在容器中使用free 命令所看到的 swap 空间并不精确,毕竟每个容器都可以看到具体大小,宿主机的 swap 是有上限的,而且不是所有容器看到的累计大小) --memory-swap #如果设置为-1,如果宿主机开启了 swap,则容器可以使用主机上 swap 的最大空间 注意:默认情况下,在容器中执行free命令看到的是宿主机的内存和swap使用,而非容器自身的swap使用情况 范例: [root@ubuntu1804 ~]#free total used free shared buff/cache available Mem: 3049484 278484 1352932 10384 1418068 2598932 Swap: 1951740 0 1951740 [root@ubuntu1804 ~]#docker run -it --rm centos:centos7.7.1908 bash [root@f5d387b5022f /]# free total used free shared buff/cache available Mem: 3049484 310312 1320884 10544 1418288 2566872 Swap: 1951740 0 1951740 [root@localhost7B web]# docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 55b0b18b4c35 test1 0.00% 416KiB / 3GiB 0.02% 656B / 0B 73.7kB / 0B 1 [root@ubuntu1804 ~]#docker run -it --rm -m 2G centos:centos7.7.1908 bash [root@localhost7B web]# docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 55b0b18b4c35 test1 0.00% 416KiB / 2GiB 0.02% 656B / 0B 73.7kB / 0B 1 stress-ng 压力测试工具 stress是Linux的一个压力测试工具,可以对CPU、Memory、IO、磁盘进行压力测试。 一、软件包方式安装 [root@centos7 ~]#yum -y install stress-ng [root@ubuntu1804 ~]#apt -y install stress-ng 二、容器安装 docker pull lorel/docker-stress-ng 查看帮助参数 docker run -it --rm lorel/docker-stress-ng 参数 stress [OPTION [ARG]] -c, --cpu 指定产生N个处理sqrt()函数的CPU进程,也就是每个进程不停计算随机数的平方根 -i, --io 产生N个进程,每个进程循环调用sync将内存缓冲区内容写到磁盘上,产生IO压力。通过系统调用sync刷新内存缓冲区数据到磁盘中,以确保同步。 如果缓冲区内数据较少,写到磁盘中的数据也较少,不会产生IO压力。在SSD磁盘环境中尤为明显,很可能iowait总是0,却因为大量调用系统调用sync,导致系统CPU使用率sys 升高。 -m, --vm 指定产生n个进程,每个进程不断调用内存分配malloc函数和内存释放free函数 –vm-bytes 指定调用malloc函数时分配内存的字节数 (默认256MB),与—m的个数有关。 –vm-stride 应该是给内存赋值,让COW(Copy On Write)发生, (default is 4096) –vm-hang 指定malloc函数分配的内存转入睡眠状态 N 秒,然后free()释放掉,一直重复执行这个过程 –vm-keep 冗余内存,区别于不断的释放和重新分配(默认是不断释放并重新分配内存) -d, --hdd 指定产生N个不断执行 writeunlink 函数的进程(创建文件,写入内容,删除文件) –hdd-bytes 指定写入文件大小,默认为1GB --hdd-noclean: 不要将写入随机ASCII数据的文件Unlink -t, --timeout N: 在N秒后结束程序 --backoff N: 等待N微秒后开始运行 -q, --quiet: 程序在运行的过程中不输出信息 -n, --dry-run: 输出程序会做什么而并不实际执行相关的操作 --version: 显示版本号 -v, --verbose: 显示详细的信息 范例:默认一个works 分配256M内存,2个即占512M内存 [root@localhost7B web]#docker run --name c1 -it --rm lorel/docker-stress-ng --vm 2 [root@localhost7B web]# docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS c2136859ceff c1 146.91% 512MiB / 2.591GiB 21.72% 656B / 0B 5.41GB / 5.87GB 5 [root@localhost7B web]#docker run --name c1 -it --rm lorel/docker-stress-ng --vm 4 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 3b4d0f3503b9 c1 401.26% 1GiB / 2.591GiB 38.60% 586B / 0B 0B / 0B 9 范例:指定内存最大值(说明只能使用300M) [root@localhost7B web]# docker run --name c1 -it --rm -m 300m lorel/docker-stress-ng --vm 2 [root@localhost7B web]# docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS c2136859ceff c1 146.91% 300MiB / 300MiB 99.99% 656B / 0B 5.41GB / 5.87GB 5 内存溢出 [root@localhost7B ~]# tail -f /var/log/messages Nov 23 15:18:05 localhost7B kernel: Memory cgroup out of memory: Kill process 68605 (stress-ng-vm) score 1256 or sacrifice child Nov 23 15:18:05 localhost7B kernel: Killed process 68605 (stress-ng-vm), UID 0, total-vm:268400kB, anon-rss:141332kB, file-rss:116kB, shmem-rss:0kB 范例:内存限制200m #宿主机限制容器最大内存使用: [root@ubuntu1804 ~]#docker run -it --rm -m 200M lorel/docker-stress-ng --vm 2 --vm-bytes 256M stress-ng: info: [1] defaulting to a 86400 second run per stressor stress-ng: info: [1] dispatching hogs: 2 vm [root@ubuntu1804 ~]#docker stats --no-stream CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS f69729b2acc1 sleepy_haibt 85.71% 198MiB / 200MiB 98.98% 1.05kB / 0B 697MB / 60.4GB 5 [root@ubuntu1804 ~]# #查看宿主机基于 cgroup 对容器进行内存资源的大小限制 [root@ubuntu1804 ~]#cat /sys/fs/cgroup/memory/docker/f69729b2acc16e032658a4efdab64d21ff97dcb6746d1cef451ed82d5c98a81f/memory.limit_in_bytes 209715200 [root@ubuntu1804 ~]#echo 209715200/1024/1024|bc 200 #动态修改内存限制,通过echo 命令可以改内存限制的值,但是可以在原基础之上增大内存限制,缩小内存限制会报错write error: Device or resource busy [root@ubuntu1804 ~]#echo 300*1024*1024|bc 314572800 [root@ubuntu1804 ~]#echo 314572800 > /sys/fs/cgroup/memory/docker/f69729b2acc16e032658a4efdab64d21ff97dcb6746d1cef451ed82d5c98a81f/memory.limit_in_bytes [root@ubuntu1804 ~]#cat /sys/fs/cgroup/memory/docker/f69729b2acc16e032658a4efdab64d21ff97dcb6746d1cef451ed82d5c98a81f/memory.limit_in_bytes 314572800 [root@ubuntu1804 ~]#docker stats --no-stream CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS f69729b2acc1 sleepy_haibt 76.69% 297.9MiB / 300MiB 99.31% 1.05kB / 0B 1.11GB / 89.1GB 5 范例:内存大小软限制: [root@ubuntu1804 ~]#docker run -it --rm -m 256m --memory-reservation 128m --name magedu-c1 lorel/docker-stress-ng --vm 2 --vm-bytes 256M stress-ng: info: [1] defaulting to a 86400 second run per stressor stress-ng: info: [1] dispatching hogs: 2 vm [root@ubuntu1804 ~]#docker stats --no-stream CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS aeb38acde581 magedu-c1 72.45% 253.9MiB / 256MiB 99.20% 976B / 0B 9.47GB / 39.4GB 5 #查看硬限制 [root@ubuntu1804 ~]#cat /sys/fs/cgroup/memory/docker/aeb38acde58155d421f998a54e9a99ab60635fe00c9070da050cc49a2f62d274/memory.limit_in_bytes 268435456 #查看软限制 [root@ubuntu1804 ~]#cat /sys/fs/cgroup/memory/docker/aeb38acde58155d421f998a54e9a99ab60635fe00c9070da050cc49a2f62d274/memory.soft_limit_in_bytes 134217728 #软限制不能高于硬限制 [root@ubuntu1804 ~]#docker run -it --rm -m 256m --memory-reservation 257m --name magedu-c1 lorel/docker-stress-ng --vm 2 --vm-bytes 256M docker: Error response from daemon: Minimum memory limit can not be less than memory reservation limit, see usage. See 'docker run --help'. 范例:关闭OOM机制 #查看docker OOM机制默认值 [root@ubuntu1804 ~]#cat /sys/fs/cgroup/memory/docker/memory.oom_control oom_kill_disable 0 under_oom 0 oom_kill 0 #启动容器时关闭OOM机制 [root@ubuntu1804 ~]#docker run -it --rm -m 200m --oom-kill-disable lorel/docker-stress-ng --vm 2 --vm-bytes 256M stress-ng: info: [1] defaulting to a 86400 second run per stressor stress-ng: info: [1] dispatching hogs: 2 vm [root@ubuntu1804 ~]#docker stats --no-stream CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS b655d88228c0 silly_borg 0.00% 197.2MiB / 200MiB 98.58% 1.31kB / 0B 1.84MB / 484MB 5 [root@ubuntu1804 ~]#c [root@ubuntu1804 ~]#cat /sys/fs/cgroup/memory/docker/b655d88228c04d7db6a6ad833ed3d05d4cd596ef09834382e17942db0295dc0c/memory.oom_control oom_kill_disable 1 under_oom 1 oom_kill 0 交换分区限制: # docker run -it --rm -m 256m --memory-swap 512m --name magedu-c1 centos bash #宿主机cgroup验证: # cat /sys/fs/cgroup/memory/docker/容器 ID/memory.memsw.limit_in_bytes 536870912 #返回值 范例: [root@ubuntu1804 ~]#docker run -it --rm -m 200m --memory-swap 512m lorel/docker-stress-ng --vm 2 stress-ng: info: [1] defaulting to a 86400 second run per stressor stress-ng: info: [1] dispatching hogs: 2 vm [root@ubuntu1804 ~]#cat /sys/fs/cgroup/memory/docker/23733a0cafa21f3e94ca8c96110978b12e53076261f1b92fd2052bafe659c8ab/memory.memsw.limit_in_bytes 536870912 ---------------------------------------------------------------- 二、容器的CPU限制 一个宿主机,有几十个核心的CPU,但是宿主机上可以同时运行成百上千个不同的进程用以处理不同的任务,多进程共用一个 CPU 的核心依赖计数就是为可压缩资源, 即一个核心的 CPU 可以通过调度而运行多个进程,但是同一个单位时间内只能有一个进程在 CPU 上运行,那么这么多的进程怎么在 CPU 上执行和调度的呢? Linux kernel 进程的调度基于CFS(Completely Fair Scheduler),完全公平调度 服务器资源密集型 1.CPU 密集型的场景:优先级越低越好,计算密集型任务的特点是要进行大量的计算,消耗CPU 资源,比如计算圆周率、数据处理、对视频进行高清解码等等,全靠CPU 的运算能力。 2.IO 密集型的场景:优先级值高点,涉及到网络、磁盘IO 的任务都是IO 密集型任务,这类任务的特点是 CPU 消耗很少,任务的大部分时间都在等待 IO 操作完 成(因为 IO 的速度远远低于 CPU 和内存的速度),比如 Web 应用,高并发,数据量大的动态网站来说,数据库应该为IO 密集型 CFS原理 cfs定义了进程调度的新模型,它给cfs_rq(cfs的run queue)中的每一个进程安排一个虚拟时钟,vruntime。如果一个进程得以执行,随着时间的增长,其vruntime将不断增大。没有得到执行的进程vruntime不变, 而调度器总是选择vruntime跑得最慢的那个进程来执行。这就是所谓的“完全公平”。为了区别不同优先级的进程,优先级高的进程vruntime增长得慢,以至于它可能得到更多的运行机会。 CFS的意义在于, 在一个混杂着大量计算型进程和IO交互进程的系统中,CFS调度器相对其它调度器在对待IO交互进程要更加友善和公平。 范例:查看磁盘调度算法, [root@ubuntu1804 ~]#cat /sys/block/sda/queue/scheduler noop deadline [cfq] 配置默认的CFS调度程序 CFS是用于常规Linux进程的Linux内核CPU调度程序。几个运行时标志允许您配置对容器拥有的CPU资源的访问量。使用这些设置时,Docker会在主机上修改容器cgroup的设置。 1.--cpus=指定一个容器可以使用多少可用的CPU资源。例如,如果主机有两个CPU,如果设置了--cpus="1.5",则可以保证容器最多使用1.5个的CPU(如果是4核CPU,那么还可以是4核心上每核用一点,但是总计是1.5核心的CPU)。这相当于设置--cpu-period="100000"和--cpu-quota="150000"。此设置可在Docker1.13及更高版本中可用,目的是替代–cpu-period和–cpu-quota两个参数,从而使配置更简单,但是最大不能超出宿主机的CPU总核心数(在操作系统看到的CPU超线程后的数值),此项较常用 2.--cpu-period=指定CPU CFS调度程序周期,必须与--cpu-quota一起使用 。默认为100微秒。大多数用户不会更改默认设置。如果您使用Docker 1.13或更高版本,请改用--cpus 3.--cpu-quota=在容器上添加 CPU CFS 配额,计算方式为 cpu-quota / cpu-period的结果值,docker1.13 及以上版本通常使用–cpus 设置此值 4.--cpuset-cpus用于指定容器运行的CPU编号,也就是所谓的CPU绑定。如果一个或多个CPU,则容器可以使用逗号分隔的列表或用连字符分隔的CPU范围。第一个CPU的编号为0。有效值可能是0-3(使用第一,第二,第三和第四CPU)或1,3(使用第二和第四CPU) 5.--cpu-shares用于设置 cfs 中调度的相对最大比例权重,cpu-share 的值越高的容器,将会分得更多的时间片(宿主机多核 CPU 总数为 100%,假如容器 A 为1024,容器 B 为 2048,那么容器 B 将最大是容器 A 的可用 CPU 的两倍 ),默认的时间片 1024,最大 262144。这是一个软限制。 范例:不限制容器CPU [root@ubuntu1804 ~]#lscpu |grep CPU [root@ubuntu1804 ~]#docker run -it --rm lorel/docker-stress-ng --cpu 4 --vm 4 [root@ubuntu1804 ~]#docker stats --no-stream CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 818a85e1da2f frosty_taussig 595.57% 1.037GiB / 2.908GiB 35.64% 1.12kB / 0B 0B / 0B 13 [root@ubuntu1804 ~]#cat /sys/fs/cgroup/cpuset/docker/818a85e1da2f9a4ef297178a9dc09b338b2308108195ad8d4197a1c47febcbff/cpuset.cpus 0-5 [root@ubuntu1804 ~]#top top - 15:41:50 up 13 days, 6:39, 5 users, load average: 5.25, 3.77, 2.97 Tasks: 242 total, 5 running, 237 sleeping, 0 stopped, 0 zombie %Cpu0 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu1 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu2 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu3 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 2717120 total, 1261264 free, 1009976 used, 445880 buff/cache KiB Swap: 4194300 total, 3528624 free, 665676 used. 1525996 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 70448 root 20 0 6892 2140 252 R 99.7 0.1 0:35.29 stress-ng-cpu 70450 root 20 0 6892 2140 252 R 99.7 0.1 0:35.32 stress-ng-cpu 70452 root 20 0 268392 262080 132 R 99.7 9.6 0:35.25 stress-ng-vm 70453 root 20 0 268392 262080 132 R 99.7 9.6 0:35.30 stress-ng-vm 88195 root 20 0 640864 1276 532 S 0.3 0.0 13:47.16 vmtoolsd 1 root 20 0 191400 2792 1420 S 0.0 0.1 1:25.74 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.99 kthreadd 范例:限制使用CPU [root@ubuntu1804 ~]#docker run -it --rm --cpu-quota 2000 --cpu-period 1000 lorel/docker-stress-ng --cpu 4 --vm 4 老版本的方法。 [root@ubuntu1804 ~]#docker run -it --rm --cpus 1.5 lorel/docker-stress-ng --cpu 4 --vm 4 stress-ng: info: [1] defaulting to a 86400 second run per stressor stress-ng: info: [1] dispatching hogs: 4 cpu, 4 vm [root@ubuntu1804 ~]#docker stats --no-stream CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 9f8b2e693113 busy_hodgkin 147.71% 786.8MiB / 2.908GiB 26.42% 836B / 0B 0B / 0B 13 [root@ubuntu1804 ~]#top top - 15:43:20 up 13 days, 6:41, 5 users, load average: 5.49, 4.07, 3.14 Tasks: 248 total, 9 running, 239 sleeping, 0 stopped, 0 zombie %Cpu0 : 36.2 us, 1.3 sy, 0.0 ni, 62.1 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st %Cpu1 : 36.5 us, 1.3 sy, 0.0 ni, 62.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu2 : 37.2 us, 1.3 sy, 0.0 ni, 61.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu3 : 35.5 us, 1.0 sy, 0.0 ni, 63.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 2717120 total, 1402956 free, 868144 used, 446020 buff/cache KiB Swap: 4194300 total, 3528624 free, 665676 used. 1667732 avail Mem 范例:绑定CPU #一般不建议绑在0号CPU上,因0号CPU一般会较忙 [root@ubuntu1804 ~]#docker run -it --rm --cpus 1.5 --cpuset-cpus 0,2-3 lorel/docker-stress-ng --cpu 4 --vm 4 stress-ng: info: [1] defaulting to a 86400 second run per stressor stress-ng: info: [1] dispatching hogs: 4 cpu, 4 vm [root@ubuntu1804 ~]#docker stats --no-stream CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 585879094e73 hungry_albattani 154.35% 1.099GiB / 2.908GiB 37.79% 906B / 0B 0B / 0B 13 [root@ubuntu1804 ~]#cat /sys/fs/cgroup/cpuset/docker/585879094e7382d2ef700947b4454426eee7f943f8d1438fe42ce34df789227b/cpuset.cpus 2,4-5 [root@ubuntu1804 ~]#top top - 15:47:06 up 13 days, 6:44, 5 users, load average: 3.51, 4.69, 3.67 Tasks: 248 total, 9 running, 239 sleeping, 0 stopped, 0 zombie %Cpu0 : 46.3 us, 4.3 sy, 0.0 ni, 49.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu1 : 0.0 us, 0.0 sy, 0.0 ni, 98.0 id, 0.0 wa, 0.0 hi, 2.0 si, 0.0 st %Cpu2 : 41.7 us, 8.3 sy, 0.0 ni, 50.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu3 : 46.4 us, 3.6 sy, 0.0 ni, 50.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 2717120 total, 857840 free, 1413128 used, 446152 buff/cache KiB Swap: 4194300 total, 3528880 free, 665420 used. 1122760 avail Mem 范例:多个容器的CPU利用率比例 #同时开两个容器 [root@ubuntu1804 ~]#docker run -it --rm --name c1 --cpu-shares 1000 lorel/docker-stress-ng --cpu 4 --vm 4 stress-ng: info: [1] defaulting to a 86400 second run per stressor stress-ng: info: [1] dispatching hogs: 4 cpu, 4 vm [root@ubuntu1804 ~]#docker run -it --rm --name c2 --cpu-shares 500 lorel/docker-stress-ng --cpu 4 --vm 4 stress-ng: info: [1] defaulting to a 86400 second run per stressor stress-ng: info: [1] dispatching hogs: 4 cpu, 4 vm [root@ubuntu1804 ~]#docker stats --no-stream CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS a1d4c6e6802d c2 195.88% 925.3MiB / 2.908GiB 31.07% 726B / 0B 0B / 0B 13 d5944104aff4 c1 398.20% 1.036GiB / 2.908GiB 35.64% 906B / 0B 0B / 0B 13 [root@ubuntu1804 ~]# #查看c1容器的cpu利用比例权重 [root@ubuntu1804 ~]#cat /sys/fs/cgroup/cpu,cpuacct/docker/d5944104aff40b7b76f536c45a68cd4b98ce466a73416b68819b9643e3f49da7/cpu.shares 1000 #查看c2容器的cpu利用比例 [root@ubuntu1804 ~]#cat /sys/fs/cgroup/cpu,cpuacct/docker/a1d4c6e6802d1b846b33075f3c1e1696376009e85d9ff8756f9a8d93d3da3ca6/cpu.shares 500 #再打开新的容器,cpu分配比例会动态调整 [root@ubuntu1804 ~]#docker run -it --rm --name c3 --cpu-shares 2000 lorel/docker-stress-ng --cpu 4 --vm 4 [root@ubuntu1804 ~]#docker stats --no-stream CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS c2d54818e1fe c3 360.15% 664.5MiB / 2.908GiB 22.31% 726B / 0B 1.64GB / 150MB 13 a1d4c6e6802d c2 82.94% 845.2MiB / 2.908GiB 28.38% 936B / 0B 103MB / 4.54MB 13 d5944104aff4 c1 181.18% 930.1MiB / 2.908GiB 31.23% 1.12kB / 0B 303MB / 19.8MB 13 范例:动态调整cpu shares值 [root@ubuntu1804 ~]#echo 2000 > /sys/fs/cgroup/cpu,cpuacct/docker/a1d4c6e6802d1b846b33075f3c1e1696376009e85d9ff8756f9a8d93d3da3ca6/cpu.shares [root@ubuntu1804 ~]#docker stats --no-stream CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS a1d4c6e6802d c2 389.31% 1.037GiB / 2.908GiB 35.64% 1.01kB / 0B 1.16GB / 14MB 13 d5944104aff4 c1 200.28% 1.036GiB / 2.908GiB 35.63% 1.19kB / 0B 2.66GB / 26.7MB 13 [root@ubuntu1804 ~]#

 

posted @ 2022-11-22 14:43  yuanbangchen  阅读(509)  评论(0编辑  收藏  举报