Memory限制:
OOME(内存溢出),一旦发生OOME,任何进程都可能被杀死,包括docker daemon在内。
内存资源限制无非就两种:一种物理内存,一种交换内存(swap)
-m or --memory= 表示设置容器能使用的物理机内存可接受 K,M,B
--memory-swap * 表示设置容器使用物理交换内存的限制,注意:先设置ROM这项才有效。
--oom-kill-disable 这项参数表示设置容器不想被OOME kill掉,必须与-m 一块用
--memory-swappiness 表示使用交换分区的倾向性,"0"表示能不用就不用,"100"表示有一点能用也要用。
--oom-score-adj int 调整这个参数int范围为(-1000 to 1000)越小越好。
内存与交换分区的区别与联系!
--memory-swap --memory 功能
整数S 正数M 容器可用空间为S,其中ram为M,swap为(S-M),若S=M,则无可用swap资源
0 正数M 相当于未设置swap(unset)
unset 正数M 若主机(docker host)启用了swap,则容器可用swap为2*M
-1 正数M 若主机(docker Host)启用了swap,则容器可使用最大主机上所有的swap空间的swap资源。
注意:在容器内使用free命令可以看到的swap空间并不具其所展现的空间指示意义。
CPU资源限制:
CFS scheduler:完全公平调度器
CPU处理进程根据进程的优先级来调度处理的
普通进程120 非实时进程有效范围优先级为100-139 需要调整nice值来调整进程的优先级
nice值为 -20到19
实时进程优先级为 0-99
--CPU=<value> 这个参数设置容器使用CPU的核数
--CPUset-CPUS 这个参数设置容器进程固定运行在那个CPU上
内存资源的限制实列:
[root@node2 ~]# docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress -vm 2
这表示启动一个容器,指明使用内存为256m,运行stress命令启动2个进程进行对内存压测。
stress-ng: debug: [1] 1 processors online
stress-ng: debug: [1] main: can't set oom_score_adj failed, errno=13 (Permission denied)
stress-ng: info: [1] defaulting to a 86400 second run per stressor
stress-ng: info: [1] dispatching hogs: 2 vm
stress-ng: debug: [1] starting processes
stress-ng: debug: [1] 2 processes running
stress-ng: debug: [6] : can't set oom_score_adj failed, errno=13 (Permission denied)
stress-ng: debug: [6] stress-ng-vm: started [6] (instance 0)
stress-ng: debug: [7] : can't set oom_score_adj failed, errno=13 (Permission denied)
stress-ng: debug: [7] stress-ng-vm: started [7] (instance 1)
stress-ng: debug: [7] stress-ng-vm: child died: 9 (instance 1)
stress-ng: debug: [7] stress-ng-vm: assuming killed by OOM killer, restarting again (instance 1)
stress-ng: debug: [6] stress-ng-vm: child died: 9 (instance 0)
stress-ng: debug: [6] stress-ng-vm: assuming killed by OOM killer, restarting again (instance 0)
stress-ng: debug: [7] stress-ng-vm: child died: 9 (instance 1)
stress-ng: debug: [7] stress-ng-vm: assuming killed by OOM killer, restarting again (instance 1)
stress-ng: debug: [6] stress-ng-vm: child died: 9 (instance 0)
stress-ng: debug: [6] stress-ng-vm: assuming killed by OOM killer, restarting again (instance 0)
stress-ng: debug: [7] stress-ng-vm: child died: 9 (instance 1)
stress-ng: debug: [7] stress-ng-vm: assuming killed by OOM killer, restarting again (instance 1)
stress-ng: debug: [6] stress-ng-vm: child died: 9 (instance 0)
stress-ng: debug: [6] stress-ng-vm: assuming killed by OOM killer, restarting again (instance 0)
stress-ng: debug: [7] stress-ng-vm: child died: 9 (instance 1)
[root@node2 registry]# docker container ls -a
fsCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ddafb3aa39c2 lorel/docker-stress-ng:latest "/usr/bin/stress-ng …" 10 seconds ago Up 8 seconds stress
3bba75138e72 vmware/harbor-log:v1.4.0 "/bin/sh -c /usr/loc…" 2 days ago Up 3 hours (healthy) 127.0.0.1:1514->10514/tcp harbor-log
33c419f14fe4 tinyh6 "nginx -g 'daemon of…" 3 days ago Exited (0) 3 days ago tinyh6
7be147a2755a tinyh5 "ls" 3 days ago Exited (0) 3 days ago tinyh5
b85b3fd6f010 tinyhttpd3 "nginx -g 'daemon of…" 3 days ago Exited (0) 3 days ago tinyhttpd3
d75559396659 84d83ea007ef "/bin/sh -c 'cd /usr…" 6 days ago Exited (1) 6 days ago gifted_buck
500c93a38eb0 84d83ea007ef "/bin/sh -c 'cd /usr…" 8 days ago Exited (1) 8 days ago eloquent_cray
a20ccccce668 busybox "sh" 2 weeks ago Exited (255) 8 days ago b2
7c175579ff63 busybox "sh" 2 weeks ago Exited (255) 8 days ago b1
bf46e9ef9620 busybox "sh" 2 weeks ago Exited (0) 2 weeks ago web1
244437368c16 yanss/httpd:v0.1-2 "sh" 3 weeks ago Exited (137) 2 weeks ago web4
57392c202bd2 yanss/httpd:v0.1-1 "sh" 4 weeks ago Exited (137) 2 weeks ago web3
[root@node2 ~]# docker top stress
UID PID PPID C STIME TTY TIME CMD
root 849 833 0 15:13 pts/0 00:00:00 /usr/bin/stress-ng stress -vm 2
root 968 849 0 15:13 pts/0 00:00:00 /usr/bin/stress-ng stress -vm 2
root 969 849 0 15:13 pts/0 00:00:00 /usr/bin/stress-ng stress -vm 2
root 984 968 28 15:13 pts/0 00:00:00 /usr/bin/stress-ng stress -vm 2
root 985 969 51 15:13 pts/0 00:00:00 /usr/bin/stress-ng stress -vm 2
[root@node2 ~]# docker stats 查看内存的使用率,只限制到256m
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
9cd78767b210 stress 98.72% 256MiB / 256MiB 100.00% 656B / 0B 0B / 0B 5
3bba75138e72 harbor-log 0.00% 3.629MiB / 812.6MiB 0.45% 94.3kB / 55.7kB 0B / 0B 11
^C
[root@node2 ~]#
CPU资源限制实列:
[root@node2 ~]# docker run --name stress -it --cpus 1 lorel/docker-stress-ng:latest stress --cpu 8
stress-ng: info: [1] defaulting to a 86400 second run per stressor
stress-ng: info: [1] dispatching hogs: 8 cpu
[root@node2 ~]# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
71e9e5eca907 lorel/docker-stress-ng:latest "/usr/bin/stress-ng …" 49 seconds ago Up 48 seconds stress
3bba75138e72 vmware/harbor-log:v1.4.0 "/bin/sh -c /usr/loc…" 2 days ago Up 3 hours (healthy) 127.0.0.1:1514->10514/tcp harbor-log
[root@node2 ~]# docker top stress
UID PID PPID C STIME TTY TIME CMD
root 128738 128721 0 14:47 pts/0 00:00:00 /usr/bin/stress-ng stress --cpu 8
root 128765 128738 12 14:47 pts/0 00:02:46 /usr/bin/stress-ng stress --cpu 8
root 128766 128738 12 14:47 pts/0 00:02:46 /usr/bin/stress-ng stress --cpu 8
root 128767 128738 12 14:47 pts/0 00:02:46 /usr/bin/stress-ng stress --cpu 8
root 128768 128738 12 14:47 pts/0 00:02:46 /usr/bin/stress-ng stress --cpu 8
root 128769 128738 12 14:47 pts/0 00:02:46 /usr/bin/stress-ng stress --cpu 8
root 128770 128738 12 14:47 pts/0 00:02:46 /usr/bin/stress-ng stress --cpu 8
root 128771 128738 12 14:47 pts/0 00:02:46 /usr/bin/stress-ng stress --cpu 8
root 128772 128738 12 14:47 pts/0 00:02:46 /usr/bin/stress-ng stress --cpu 8
[root@node2 ~]# docker stats 查看运行中docker的cpu使用率
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
71e9e5eca907 stress 98.82% 15.81MiB / 812.6MiB 1.95% 656B / 0B 0B / 0B 9
3bba75138e72 harbor-log 0.00% 3.684MiB / 812.6MiB 0.45% 92.6kB / 54.8kB 0B / 0B 11
^C
[root@node2 ~]#
(2)特定指明使用那个cpu来运行。
[root@node2 ~]# docker run --name stress -it --cpuset-cpus 0 lorel/docker-stress-ng:latest stress --cpu 8
这表示指定0号CPU来运行。因为我本机可用cpu为1,所以只能运行在0号CPU上
stress-ng: info: [1] defaulting to a 86400 second run per stressor
stress-ng: info: [1] dispatching hogs: 8 cpu
(3)分享cpu的资源。
[root@node2 ~]# docker run --name stress -it --cpu-shares 1024 lorel/docker-stress-ng:latest stress --cpu 8
stress-ng: info: [1] defaulting to a 86400 second run per stressor
stress-ng: info: [1] dispatching hogs: 8 cpu
[root@node2 ~]# docker top stress
UID PID PPID C STIME TTY TIME CMD
root 2557 2542 0 15:25 pts/0 00:00:00 /usr/bin/stress-ng stress --cpu 8
root 2586 2557 12 15:25 pts/0 00:00:15 /usr/bin/stress-ng stress --cpu 8
root 2587 2557 12 15:25 pts/0 00:00:15 /usr/bin/stress-ng stress --cpu 8
root 2588 2557 12 15:25 pts/0 00:00:15 /usr/bin/stress-ng stress --cpu 8
root 2589 2557 12 15:25 pts/0 00:00:15 /usr/bin/stress-ng stress --cpu 8
root 2590 2557 12 15:25 pts/0 00:00:15 /usr/bin/stress-ng stress --cpu 8
root 2591 2557 12 15:25 pts/0 00:00:15 /usr/bin/stress-ng stress --cpu 8
root 2592 2557 12 15:25 pts/0 00:00:15 /usr/bin/stress-ng stress --cpu 8
root 2593 2557 12 15:25 pts/0 00:00:15 /usr/bin/stress-ng stress --cpu 8
[root@node2 ~]#
[root@node2 ~]# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
41d85a89f54f stress 99.91% 15.81MiB / 812.6MiB 1.95% 656B / 0B 0B / 0B 9
3bba75138e72 harbor-log 0.00% 3.629MiB / 812.6MiB 0.45% 98.9kB / 58.5kB 0B / 0B 11
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
41d85a89f54f stress 99.15% 15.81MiB / 812.6MiB 1.95% 656B / 0B 0B / 0B 9
3bba75138e72 harbor-log 0.00% 3.629MiB / 812.6MiB 0.45% 98.9kB / 58.5kB 0B / 0B 11
^C
[root@node2 ~]#
docker资源限制已经完成了。