1. 简介
主要研究docker资源管理方面的问题,查看资源占用、管理占用资源…
docker可以管理的资源:网络资源、CPU、IO、内存
2.查看容器占用资源
查看容器占用的资源,该命令会以流的方式持续输出所有容器占用的资源情况
#docker stats 源代码帮助
Usage: docker stats [OPTIONS] [CONTAINER...]
Display a live stream of container(s) resource usage statistics
Aliases:
docker container stats, docker stats
Options:
-a, --all Show all containers (default shows just running)
--format string Format output using a custom template:
'table': Print output in table format with column headers (default)
'table TEMPLATE': Print output in table format using the given Go template
'json': Print in JSON format
'TEMPLATE': Print output using the given Go template.
Refer to https://docs.docker.com/go/formatting/ for more information about formatting output with templates
--no-stream Disable streaming stats and only pull the first result
--no-trunc Do not truncate output
docker stats [OPTIONS] [CONTAINER...]
OPTIONS 说明:
-
–all , -a :显示所有的容器,包括未运行的。
-
–format :指定返回值的模板文件。
-
–no-stream :展示当前状态就直接退出了,不再实时更新。
-
–no-trunc :不截断输出。
若想只显示一次当前资源占用情况,可以使用如下命令
docker stats --no-stream
# 启动一个容器
(MoeLove) ➜ ~ docker run -d redis
c98c9831ee73e9b71719b404f5ecf3b408de0b69aec0f781e42d815575d28ada
# 查看其所占用资源的情况
(MoeLove) ➜ ~ docker stats --no-stream $(docker ps -ql)
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
c98c9831ee73 amazing_torvalds 0.08% 2.613MiB / 15.56GiB 0.02% 3.66kB / 0B 0B / 0B 4
CONTAINER ID | 容器的 ID,也是一个容器生命周期内不会变更的信息 |
---|---|
NAME | 容器的名称,如果没有手动使用 --name 参数指定,则 Docker 会随机生成一个,运行过程中也可以通过命令修改 |
CPU % | 容器正在使用的 CPU 资源的百分比 |
MEM USAGE / LIMIT | 当前内存的使用及容器可用的最大内存 |
MEM % | 容器正在使用的内存资源的百分比 |
NET I/O | 容器通过其网络接口发送和接受到的数据量 |
BLOCK I/O | 容器通过块设备读取和写入的数据量 |
BLOCK I/O | 容器创建的进程或线程数 |
除了以table形式显示输出,还可以以 JSON 格式输出容器使用资源信息:
runoob@runoob:~$ docker stats nginx --no-stream --format "{{ json . }}"
{"BlockIO":"0B / 13.3kB","CPUPerc":"0.03%","Container":"n
ginx","ID":"ed37317fbf42","MemPerc":"0.24%","MemUsage":"2.352MiB / 982.5MiB","Name":"nginx","NetIO":"539kB / 606kB","PIDs":"2"}
输出指定的信息:
runoob@runoob:~$ docker stats --all --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}" fervent_panini 5acfcb1b4fd1 drunk_visvesvaraya big_heisenberg
{"BlockIO":"0B / 13.3kB","CPUPerc":"0.03%","Container":"nginx","ID":"ed37317fbf42","MemPerc":"0.24%","MemUsage":"2.352MiB / 982.5MiB","Name":"nginx","NetIO":"539kB / 606kB","PIDs":"2"}
CONTAINER CPU % MEM USAGE / LIMIT
fervent_panini 0.00% 56KiB / 15.57GiB
5acfcb1b4fd1 0.07% 32.86MiB / 15.57GiB
drunk_visvesvaraya 0.00% 0B / 0B
big_heisenberg 0.00% 0B / 0B
自定义format的使用:
docker stats 命令支持我们通过 --format 选项自定义输出的内容和格式:
下面是自定义的格式中可以使用的所有占位符:
.Container 根据用户指定的名称显示容器的名称或 ID。
.Name 容器名称。
.ID 容器 ID。
.CPUPerc CPU 使用率。
.MemUsage 内存使用量。
.NetIO 网络 I/O。
.BlockIO 磁盘 I/O。
.MemPerc 内存使用率。
.PIDs PID 号。
#使用format指定输出方式
lab@lab-virtual-machine:~$ docker stats --no-stream --format \
> "{\"container\":\"{{ .Container }}\",\"memory\":{\"raw\":\"{{ .MemUsage }}\",\"percent\":\"{{ .MemPerc }}\"},\"cpu\":\"{{ .CPUPerc }}\"}"
3.管理docker占用的资源
我们可以重新启动一个容器,在 docker run 时,为它添加资源限制
Docker资源(CPU/内存/磁盘IO/GPU)限制与分配指南
还有一种动态更改资源限制的办法,使用 docker update 命令
Docker 容器的资源管理
docker update命令参数
#docker update 源代码帮助
Usage: docker update [OPTIONS] CONTAINER [CONTAINER...]
Update configuration of one or more containers
Aliases:
docker container update, docker update
Options:
--blkio-weight uint16 Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
--cpu-period int Limit CPU CFS (Completely Fair Scheduler) period
--cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota
--cpu-rt-period int Limit the CPU real-time period in microseconds
--cpu-rt-runtime int Limit the CPU real-time runtime in microseconds
-c, --cpu-shares int CPU shares (relative weight)
--cpus decimal Number of CPUs
--cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
-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
--pids-limit int Tune container pids limit (set -1 for unlimited)
--restart string Restart policy to apply when a container exits
4.docker 资源管理 应用
这里以OAI与ueransim核心网为例子来应用上面的知识:
4.1查看核心网容器的资源占用:
#以表格形式输出,一直刷新
lab@lab-virtual-machine:~$ docker stats
#以表格形式输出,且只输出一次
lab@lab-virtual-machine:~$ docker stats --no-stream
#以json形式输出
lab@lab-virtual-machine:~$ docker stats --no-stream --format "{{ json . }}"
#查看单一容器的资源占用 88712c18c576为容器ID
lab@lab-virtual-machine:~$ docker stats --no-stream --format "{{ json . }}" 88712c18c576
#使用容器的名字代替id
docker stats $(docker ps --format={{.Names}})
如果想知道amf的cpu占用可以使用如下方法:
lab@lab-virtual-machine:~$ sudo docker stats --no-stream --format "{\"cpu\":\"{{ .CPUPerc }}\"}" 88712c18c576
4.2限制容器的资源使用
使用docker update在容器启动后限制容器的资源,在核心网启动后可以通过命令行限制容器的资源,在后续可以通过shell脚本一键限制所有核心网网元的资源:
先查看网元的资源使用:
lab@lab-virtual-machine:~$ docker stats --no-stream
sudo docker update --cpus "0.03" oai-udm
可以看见网元容器oai-udm的cpu可用资源已经被限制了
进一步还有如下一些命令可以使用:
#指定容器oai-udm只使用0.03的cpu,并且使用cpu内核1,即该容器只跑在第一个cpu上
docker update --cpus "0.03" --cpuset-cpus 0 oai-udm
docker 容器在docker run的时候或者容器运行时可以用docker update 来限制内存最大使用,但默认update 内存或者cpu是关闭的,需要在/etc/default/grub中添加一行如下:
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
然后更新grub
update grub
限制网元内存使用的内存:
#限制oai-ext-dn使用的内存1G
root@ubuntu180402:/etc/ansible# docker update -m 1G --memory-swap 1G oai-ext-dn