标签: cgroups

在 Docker 中挂载 cgroup 进行资源管理

这是参考https://docs.docker.com/config/containers/resource_constraints/#limit-a-containers-access-to-memory。我已经创建了工作容器,使用 Raspbian Jessie Lite(本质上是无 GUI 的 Debian Jessie)在 Raspberry Pi(64 位)上运行 Docker 版本 18.05.0-ce。

该文档声称您可以只在docker run命令上传递内存/CPU 标志。但是当我尝试类似的东西时docker run -it --name test --memory=512m container_os,它说:

WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap

如果我传递基于 cpu 的标志(例如 ),我会收到类似的消息,表明未安装 cpuset --cpuset-cpus。这显然意味着我没有为 Docker 安装这些不同的 cgroup 来正确管理资源,对吧?

现在参考https://docs.docker.com/config/containers/runmetrics/#control-groups,我阅读了有关 cgroups 的部分,但这对我理解情况并没有太大帮助。因此,有经验的人是否可以逐步解释如何以正确的方式执行此操作,而不仅仅是尝试随机内核命令?

linux resources cgroups docker

6
推荐指数
1
解决办法
1万
查看次数

当我在 kubernetes 中使用低于 1000m 的 cpu 请求时,同一容器中的多个线程可以同时使用多个核心并行运行吗?

当我谷歌搜索时,有一些答案说在kubernetes中,100ms cpu意味着你将使用一个cpu核心的1/10时间,而2300ms cpu意味着你将充分使用2个核心和3/10时间另一个CPU核心。这是对的吗?

我只是想知道在 kubernetes 中使用低于 1000ms 的 cpu 请求时,多个线程是否可以同时在多个核心上并行运行。

cpu multithreading multicore cgroups kubernetes

6
推荐指数
1
解决办法
1192
查看次数

Cgroup 和 Slurm

我知道如何使用 cgroups(分配内存、CPU 使用情况...)和 slurm(提交、暂停/停止作业)。我想知道 cgroups 如何与 slurm 一起工作。当我向 slurm 提交作业时,在哪里可以修复内存或 CPU 使用情况?我阅读了 Slurm Schedmd( https://slurm.schedmd.com/cgroups.html )的文档,但它没有给出很好的解释。也许这是我的一个误会。谁能解释如何在 slurm 中使用 cgroup 为作业分配一些资源?提前致谢。

cgroups slurm

5
推荐指数
1
解决办法
1372
查看次数

如何在 Debian/Ubuntu 中启用 CFS cgroup 支持

我需要在主机上使用最新的 Debian (9) 或 Ubuntu (17.0.4) 来限制 Docker 容器中的 CPU。

\n\n
$ docker info\n  Containers: 0\n  Running: 0\n  Paused: 0\n  Stopped: 0\n  Images: 1\n  Server Version: 17.06.0-ce\n  Storage Driver: overlay2\n  Backing Filesystem: extfs\n  Supports d_type: true\n  Native Overlay Diff: true\n  Logging Driver: json-file\n  Cgroup Driver: cgroupfs\n  Plugins: \n    Volume: local\n    Network: bridge host macvlan null overlay\n  Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog\n  Swarm: inactive\n  Runtimes: runc\n  Default Runtime: runc\n  Init Binary: docker-init\n  containerd version: cfb82a876ecc11b5ca0977d1733adbe58599088a\n  runc …
Run Code Online (Sandbox Code Playgroud)

ubuntu cgroups docker

5
推荐指数
1
解决办法
1万
查看次数

如何防止Java超出容器内存限制?

我在硬内存限制为 4GB 的 Docker 容器中运行 Java 程序。我已将最大堆设置为 3GB,但 Java 程序仍然超出限制并被杀死(OOMKilled)。

我的问题是:如何配置 Java 以遵守设置的容器限制并抛出 OutOfMemoryException 而不是尝试分配超出限制并让主机内核踢它的屁股?

更新:我是一名经验丰富的 Java 开发人员,对 JVM 有一定的了解。我知道如何设置最大堆,但我想知道是否有人知道设置JVM 进程从操作系统声明的内存限制的方法。

java containers memory-limit cgroups docker

5
推荐指数
2
解决办法
1763
查看次数

cgroup上下文中cpu.shares和cpu.cfs_quota_us之间有什么关系?

我使用的是centos6/7并使用cgroup来管理cpu资源。我已阅读RHEL 文档,但没有回答我的以下问题:

如果我同时设置了 cfs_quota_us 和 cgroup 之间的共享,那么会发生什么?

(例如,cfs_quota_us 会优先于份额吗?)

谢谢期待!

cpu cgroups cfs

5
推荐指数
1
解决办法
3513
查看次数

如何更改 podman 的 cgroup 版本

我正在尝试在启用 cgroups v2 的情况下运行 podman。我发现了几篇博文,解释了如何将运行时更改为crun并将cgroup_manager更改为cgroupfs。但我不知道如何实际将 cgroup 版本设置为 v2。

我在 Manjaro Linx Kernerl 5.4 上运行 podman,所以,如果我是正确的,应该支持 cgroups v2。

这是 podman info 的输出:

host:
  BuildahVersion: 1.14.3
  CgroupVersion: v1
  Conmon:
    package: Unknown
    path: /usr/bin/conmon
    version: 'conmon version 2.0.15, commit: 1bddbf7051a973f4a4fecf06faa0c48e82f1e9e1'
  Distribution:
    distribution: manjaro
    version: unknown
  IDMappings:
    gidmap:
    - container_id: 0
      host_id: 1000
      size: 1
    - container_id: 1
      host_id: 65536
      size: 66536
    uidmap:
    - container_id: 0
      host_id: 1000
      size: 1
    - container_id: 1
      host_id: 65536
      size: 66536
  MemFree: …
Run Code Online (Sandbox Code Playgroud)

containers cgroups podman

5
推荐指数
1
解决办法
4678
查看次数

eBPF - 加载、附加和链接之间的区别?

我对系统调用和函数eBPF中使用的术语非常困惑。有人可以分解我对加载/附加进程的理解是错误的吗?bpflibbpfbpf


我的理解:

我一直在查看代码,cgroups因此我将使用它作为示例。我知道 cgroup 的 bpf 程序存储在cgroup_bpf->effective[bpf_attach_type](请参阅此处此处)。我知道,当从任何处理程序调用它们(例如在本例中为 function )调用类似__cgroup_bpf_run_filter_sysctl()(在cgroup.cproc_sys_call_handler()中)的函数时,这些程序就会被访问和运行。但是这些程序是如何加载/存储/附加/链接的,每个术语之间有什么区别?

加载- 显然,这需要在附加之前发生。我猜测这是 cgroup 程序存储在通用位置(即不在cgroup_bpf->effective[bpf_attach_type]中的位置,因此尚未附加/链接以在内核中执行。因此,加载与bpf_attach_type. 如果我是正确的,cgroup 程序类型的通用加载位置在哪里?

附加- 也许这是程序与bpf_attach_type. 就像这样,现在我们采用通用存储的程序,现在我们可以cgroup_bpf->effective[bpf_attach_type]使用bpf_attach_type我们想要的任何内容将其放入数组中。然后,当到达内核中相应的附加点时,程序就会运行。

链接- 这只是一种特殊类型的附件吗?这与普通附加有何不同?我看到了link_create(),当使用 cgroup 程序类型时,两者最终都会调用。cgroup_bpf_prog_attach() cgroup_bpf_attach()

linux linux-kernel cgroups bpf ebpf

5
推荐指数
1
解决办法
2546
查看次数

在 docker 容器内运行 docker 容器时如何解决 cgroup 错误?

我正在尝试在一个正在运行的 ubuntu docker 容器中运行一些多容器构建测试,我用它来构建我的应用程序(通常,我有一个 Gitlab CI 设置)。

我发现当尝试运行指定内存限制的容器时,我遇到如下错误:

ERROR: for <service-name>  Cannot start service <service-name>: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:385: applying cgroup configuration for process caused: cannot enter cgroupv2 "/sys/fs/cgroup/docker" with domain controllers -- it is in threaded mode: unknown
Run Code Online (Sandbox Code Playgroud)

最小工作示例

这是一个(几乎)最小的工作示例:

# start from ubuntu base image
docker run -it --privileged ubuntu:18.04 /bin/bash

# once inside the container, install docker
apt-get update
apt-get remove docker docker-engine docker.io containerd runc
apt-get install -y apt-transport-https ca-certificates …
Run Code Online (Sandbox Code Playgroud)

cgroups docker docker-in-docker

5
推荐指数
1
解决办法
1万
查看次数

使用 cgroup v2 的 docker 容器内的 CPU 百分比

我一直在使用这个很棒的 Golang 库来收集容器的 CPU 百分比(不是像 top 命令检索的主机),但存储库似乎处于非活动状态,只能收集 ​​cgroup v1 cpu 百分比。https://github.com/HobbyBear/cmetric

对于 cgroup v2,我设法计算了内存使用百分比,但无法获得正确的 CPU 百分比。

cgroup v2 的内存百分比:

  1. 计算是否使用 cgroup v2 - 下面应该等于 cgroup2fs
stat -fc %T /sys/fs/cgroup/
Run Code Online (Sandbox Code Playgroud)
  1. 将当前内存除以最大内存。注意需要设置docker中的内存限制。
cat /sys/fs/cgroup/memory.max

cat /sys/fs/cgroup/memory.current
Run Code Online (Sandbox Code Playgroud)

任何有关如何计算 CPU 百分比的建议将不胜感激。:)

cpu-usage go cgroups docker docker-compose

5
推荐指数
1
解决办法
930
查看次数