RunC 学习笔记 - 获取容器资源

Docker容器可以cpu、memory等资源限制,在容器中,如何查询当前容器可使用的资源?

在真是物理环境中,可以通过proc文件系统获取,当前可以使用的CPU的信息

cat /proc/cpuinfo

但是上述方式获取资源配置,在RunC中,将获取错误的信息:读取到的数据为host端全局数据,并不会显示容器内、隔离、限制资源后的资源,所以在运行的容器中不能使用此种方式获取隔离容器资源。

获取容器资源

在上述方式在容器中,通过PROC接口获取资源,为什么会获取到全局的host端的资源?
容器的中的 /proc 文件系统是怎么来的?

 cat config.json | python -m json.tool

config.json(容器运行时配置文件)获取方式:

runc list # 获取容器bundle目录

容器的config.json配置文件,就在bundle目录下

容器内外映射关系(json 关系截图)

          ...
    "mounts": [
        {
            "destination": "/proc",
            "options": [
                "nosuid",
                "noexec",
                "nodev"
            ],
            "source": "proc",
            "type": "proc"
        },
           ...

每个容器的 /proc (目前,linux内核还没有对应的机制进行隔离或限制)由host端主机的host映射到容器形成,所以容器中的/proc和主机的/proc是同一份数据,在容器中直接读取或间接获取(通过软件,如free等)/proc数据,数据和host端一致,不能单独获取容器资源
在容器中,如何正确获取限制资源?
容器利用了cgroup文件系统对资源进行限制,可以通过cgroup系统获取容器限制资源。
容器cgroup文件系统映射 config.json 配置
cgroup host端映射路径

   ...
   "linux": {
           "cgroupsPath": "/docker/${container-id}",
   ...

在 HOST 端主机获取容器资源方式://例如memory

   cat /sys/fs/cgroup/memory/docker/<container-id>/memory.limit_in_bytes

在容器中获取此资源限制://例如memory

   cat /sys/fs/cgroup/memory/memory.limit_in_bytes

在容器中,只能看到当前容器的资源限制(理因如此)

你可能感兴趣的:(golang,dokcer,runC)