这是参考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 的部分,但这对我理解情况并没有太大帮助。因此,有经验的人是否可以逐步解释如何以正确的方式执行此操作,而不仅仅是尝试随机内核命令?
当我谷歌搜索时,有一些答案说在kubernetes中,100ms cpu意味着你将使用一个cpu核心的1/10时间,而2300ms cpu意味着你将充分使用2个核心和3/10时间另一个CPU核心。这是对的吗?
我只是想知道在 kubernetes 中使用低于 1000ms 的 cpu 请求时,多个线程是否可以同时在多个核心上并行运行。
我知道如何使用 cgroups(分配内存、CPU 使用情况...)和 slurm(提交、暂停/停止作业)。我想知道 cgroups 如何与 slurm 一起工作。当我向 slurm 提交作业时,在哪里可以修复内存或 CPU 使用情况?我阅读了 Slurm Schedmd( https://slurm.schedmd.com/cgroups.html )的文档,但它没有给出很好的解释。也许这是我的一个误会。谁能解释如何在 slurm 中使用 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) 我在硬内存限制为 4GB 的 Docker 容器中运行 Java 程序。我已将最大堆设置为 3GB,但 Java 程序仍然超出限制并被杀死(OOMKilled)。
我的问题是:如何配置 Java 以遵守设置的容器限制并抛出 OutOfMemoryException 而不是尝试分配超出限制并让主机内核踢它的屁股?
更新:我是一名经验丰富的 Java 开发人员,对 JVM 有一定的了解。我知道如何设置最大堆,但我想知道是否有人知道设置JVM 进程从操作系统声明的总内存限制的方法。
我使用的是centos6/7并使用cgroup来管理cpu资源。我已阅读RHEL 文档,但没有回答我的以下问题:
如果我同时设置了 cfs_quota_us 和 cgroup 之间的共享,那么会发生什么?
(例如,cfs_quota_us 会优先于份额吗?)
谢谢期待!
我正在尝试在启用 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) 我对系统调用和函数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()
我正在尝试在一个正在运行的 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) 我一直在使用这个很棒的 Golang 库来收集容器的 CPU 百分比(不是像 top 命令检索的主机),但存储库似乎处于非活动状态,只能收集 cgroup v1 cpu 百分比。https://github.com/HobbyBear/cmetric
对于 cgroup v2,我设法计算了内存使用百分比,但无法获得正确的 CPU 百分比。
cgroup v2 的内存百分比:
stat -fc %T /sys/fs/cgroup/
Run Code Online (Sandbox Code Playgroud)
cat /sys/fs/cgroup/memory.max
cat /sys/fs/cgroup/memory.current
Run Code Online (Sandbox Code Playgroud)
任何有关如何计算 CPU 百分比的建议将不胜感激。:)
cgroups ×10
docker ×5
containers ×2
cpu ×2
linux ×2
bpf ×1
cfs ×1
cpu-usage ×1
ebpf ×1
go ×1
java ×1
kubernetes ×1
linux-kernel ×1
memory-limit ×1
multicore ×1
podman ×1
resources ×1
slurm ×1
ubuntu ×1