标签: cgroup

使用带有 `isolcpus` 和 `cpuset` 的内核

我有一个 Red Hat Enterprise Linux Server 6.9 版(圣地亚哥)(我不管理它)。在 GRUB 配置文件中,我有isolcpus=2-32(36 个核心)。我还有一个 cgroup,cpuset=2-32通过分配cgset.conf给该系统上的所有重要进程。

我的问题是:这两个设置如何相互作用?

通常,当我启动一个进程时,taskset -c 2-32所有线程都在核心 2 上结束,因为 isolcpus“从调度程序中删除核心”,正如我被告知的那样,因此没有负载平衡。

然而,观察到的 cpuset 效果是不同的 - 各种进程和线程最终位于不同的核心上。

有人可以解释一下isolcpusandtaskset命令如何产生一个结果,而isolcpuscgroups/cpusets 如何产生不同的结果吗?

linux cgroup

5
推荐指数
0
解决办法
1792
查看次数

cgroup fork 被 pids 控制器拒绝

有一个用 C/C++ 编写的小型服务器程序,使用 nginx 和 Postgres,目前都托管在同一个 ubuntu 系统上。我通常从 bash 命令行运行服务器程序。

\n

最近在较新版本的 Ubuntu 上,当服务器程序运行时,大约半分钟后我无法执行任何其他命令;如果屏幕保存,则我无法重新登录。终止我的服务器程序将恢复正常行为。

\n

在 bash 中:按 ENTER 键输入任意命令:

\n
bash: fork: retry: Resource temporarily unavailable\n
Run Code Online (Sandbox Code Playgroud)\n

并将以下内容写入 /var/log/syslog:

\n
Sep  5 09:46:08 ubuntu kernel: [  145.614883] cgroup: fork rejected by pids controller in /user.slice/user-1000.slice/user@1000.service\n
Run Code Online (Sandbox Code Playgroud)\n

系统重新启动后启动服务器程序与系统运行一段时间后启动服务器程序的体验是不同的。具体来说,重新启动后,服务器程序将正常运行。如果服务器程序重新启动,它将以 60% 的利用率运行半分钟,然后跳至 80% 约 5 秒,然后降至 20% 的利用率。看起来好像有什么东西直接限制了应用程序。C组?

\n

PAM 配置: \n在 /etc/pam.d/common-session 中有以下行:

\n
session required    pam_unix.so \nsession optional    pam_systemd.so \n
Run Code Online (Sandbox Code Playgroud)\n

我不认为这有什么区别,但在 /etc/security/limits.d/91-nofile.conf 中我设置了以下 PAM 设置:

\n
*                soft    nofile …
Run Code Online (Sandbox Code Playgroud)

pam cgroup systemd ubuntu-20.04

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

如何找到导致OOM的cgroup?

我正在使用 cgroup 对我的进程进行分区,并且在我的内核日志中收到 Out Of Memory 消息。

但是,我找不到导致它们的分区。我检查了内存控制器 cgroup,但没有明显的使用方法。

问题是,当我在系统日志中看到“任务被杀死”消息时,任务已经死亡,它的 /proc 条目消失了,cgroup 的任务文件没有被杀死任务的 pid。

linux oom cgroup

4
推荐指数
1
解决办法
2062
查看次数

在 Ubuntu 12.04 LTS 上的 cgroup 中找不到网络子系统

我正在尝试使用 cgroups 来限制进程的网络带宽,如本答案中所述。但是,我无法找到他们所指的“文件”。我正在使用安装了 cgroup-bin 的 Ubuntu 12.04 LTS。cgroups 自动挂载在 /sys/fs/cgroup 下,但是,我只看到以下子系统:

$ ls -l /sys/fs/cgroup/
total 0
drwxr-xr-x 3 root root 0 Mar  8 09:51 cpu
drwxr-xr-x 3 root root 0 Mar  8 09:51 cpuacct
drwxr-xr-x 3 root root 0 Mar  8 09:51 devices
drwxr-xr-x 3 root root 0 Mar  8 09:51 freezer
drwxr-xr-x 3 root root 0 Mar  8 09:51 memory
Run Code Online (Sandbox Code Playgroud)

此外,我尝试手动挂载“net”子系统但没有成功:

# mkdir -p /sys/fs/cgroup/net
# mount -t cgroup -o net net /sys/fs/cgroup/net/
mount: special device …
Run Code Online (Sandbox Code Playgroud)

networking linux linux-kernel cgroup ubuntu-12.04

4
推荐指数
1
解决办法
3176
查看次数

cgroups 内存 16GB 上限

我正在尝试使用 cgroups 来限制用户进程在具有大量内存(128 GB 或更多)的服务器上的内存使用。我们想要实现的是为 OS 和 root 进程保留大约 6GB 的 ram,其余的留给用户。我们希望确保我们始终有可用内存,并且我们不希望服务器积极交换。

如果限制设置得足够低( < 16GB ),这可以正常工作。用户进程被 cgred 正确分配到正确的 cgroup,一旦达到限制,oom 将终止内存饥渴的进程。

当我们将限制设置得更高时,问题就会出现。然后,如果进程使用超过 16G 的 ram,服务器将开始交换,即使内存使用量仍远低于限制并且有足够的 ram 可用。

是否有任何设置或某种最大值会限制我们可以在 cgroups 下授予访问权限的内存量?

这是更多信息:

我使用以下代码来模拟用户进程占用内存。代码在链表中跟踪分配的内存,以便在程序内部使用和访问内存,而不是仅使用 malloc 保留(并每次覆盖指针)。

/* gragram.c 的内容 */

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>



struct testlink {
  void *ram;
  struct testlink *next;
};

int main (int argc, char *argv[]) {

    int block=8192;
    char buf[block];
    void *ram=NULL;
    FILE *frandom;
    int nbproc,i;
    pid_t pID;
  struct …
Run Code Online (Sandbox Code Playgroud)

memory cgroup

4
推荐指数
1
解决办法
1010
查看次数

使用 cgroups 作为用户设置用户创建的 systemd 作用域的 MemoryLimit

相关:限制子进程的总体内存使用量

有没有办法让非特权用户或 root 允许非特权用户创建一个 systemd 作用域(或由 systemd 管理的其他控制组),以便限制该作用域的内存使用量,并且该限制可以由用户?

或者说,为什么这样达不到上面描述的效果:

$ systemd-run --scope --user --unit=limit-test.scope bash
Running as unit limit-test.scope.
$ systemctl show --user limit-test.scope |grep Mem
MemoryAccounting=no
MemoryLimit=18446744073709551615
$ systemctl set-property --user limit-test.scope MemoryAccounting=yes
$ systemctl set-property --user limit-test.scope MemoryLimit=100M
$ systemctl show --user limit-test.scope |grep Mem
MemoryAccounting=yes
MemoryLimit=104857600
$ python
>>> a = [1]*1000000000    # happily eats 7.4G of RAM
Run Code Online (Sandbox Code Playgroud)

我正在使用 systemd 215 的 Debian stable 上进行测试。内核是 3.18.2 并使用所需的支持进行编译,我相信:

$ zgrep -E 'CGROUP|MEMCG' /proc/config.gz 
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is …
Run Code Online (Sandbox Code Playgroud)

linux debian memory-usage cgroup systemd

4
推荐指数
1
解决办法
7034
查看次数

Centos 6 到 Centos 7 cgroups

我正在尝试在 Centos 7 中为每个用户设置资源限制,但是我找不到用于 cgroups 的新实现的正确命令(我确实阅读了文档,但它讨论的是限制服务而不是用户)。

这是 Centos 6 中的步骤

  1. 添加 /etc/cgconfig.conf

    group mygroup{ cpu { cpu.shares = 200; } memory { memory.limit_in_bytes = 128m; } }

  2. 重新开始 service cgconfig restart

  3. 在系统引导中启动: chkconfig cgconfig on
  4. 验证正确添加的组: lscgroup
  5. 将我们希望限制资源的进程添加到我们创建的 cgroup 中:添加到 /etc/cgrules.conf

    myuser cpu,memory mygroup/

  6. 启动 cgred 服务以使 cgrules 配置更改生效: service cgred start

  7. 确保启用 cgred 服务以在系统启动时启动,以便我们的规则在重新启动后保持不变: chkconfig cgred on

Centos 7 中等价物是什么

cgroup centos7

4
推荐指数
1
解决办法
5017
查看次数

有没有办法设置 systemd 启动进程的 cgroup?

systemd 在 /system.slice/process-name.service cgroup 中启动一个进程。我想在不同的 cgroup 中启动该进程。我可以在 ExecStart 选项中使用 cgexec 来完成此操作,但是有更好的方法吗?

cgroup systemd

3
推荐指数
1
解决办法
1369
查看次数

Kubernetes cgroup 驱动程序配置错误

CentOS 中的默认 Docker 安装从 Cgroup 开始systemd。我从官方 YUM 仓库安装了 Kubernetes,systemddrop-in 10-kubeadm.conf有以下内容:

[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true"
Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin"
Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local"
Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt"
Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=0"
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"
Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki"
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ_ARGS $KUBELET_CADVISOR_ARGS $KUBELET_CGROUP_ARGS $KUBELET_CERTIFICATE_ARGS $KUBELET_EXTRA_ARGS
Run Code Online (Sandbox Code Playgroud)

我还尝试获取环境变量以查看 systemd 插件是否正确覆盖 ( systemctl show --property=Environment kubelet | cat):

Environment=KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf\x20--kubeconfig=/etc/kubernetes/kubelet.conf KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests\x20--allow-privileged=true KUBELET_NETWORK_ARGS=--network-plugin=cni\x20--cni-conf-dir=/etc/cni/net.d\x20--cni-bin-dir=/opt/cni/bin KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10\x20--cluster-domain=cluster.local KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook\x20--client-ca-file=/etc/kubernetes/pki/ca.crt KUBELET_CADVISOR_ARGS=--cadvisor-port=0 KUBELET_CGROUP_ARGS=--cgroup-driver=systemd KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true\x20--cert-dir=/var/lib/kubelet/pki
Run Code Online (Sandbox Code Playgroud)

当我使用 初始化集群时kubeadm init --apiserver-advertise-address=X.X.X.X --pod-network-cidr=10.244.0.0/16,过程成功。但是,运行kubelet version会给我一个 Cgroup 配置错误错误:

error: failed to run Kubelet: failed to create …
Run Code Online (Sandbox Code Playgroud)

centos cgroup systemd docker kubernetes

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

了解 OOM 杀手日志

我在 docker 容器中运行了一些进程,并且我对该容器使用了内存限制。有时 docker 容器内的一些进程被 OOM 杀手杀死。我在 syslog 文件中看到:

beam.smp invoked oom-killer: gfp_mask=0xd0, order=0, oom_score_adj=0
beam.smp cpuset=/ mems_allowed=0
CPU: 0 PID: 20908 Comm: beam.smp Not tainted 3.13.0-36-generic #63~precise1-Ubuntu
Hardware name: Xen HVM domU, BIOS 4.2.amazon 05/23/2014
 ffff880192ca6c00 ffff880117ebfbe8 ffffffff817557fe 0000000000000007
 ffff8800ea1e9800 ffff880117ebfc38 ffffffff8174b5b9 ffff880100000000
 000000d08137dd08 ffff880117ebfc38 ffff88010c05e000 0000000000000000
Call Trace:
 [<ffffffff817557fe>] dump_stack+0x46/0x58
 [<ffffffff8174b5b9>] dump_header+0x7e/0xbd
 [<ffffffff8174b64f>] oom_kill_process.part.5+0x57/0x2d4
 [<ffffffff81075295>] ? has_ns_capability_noaudit+0x15/0x20
 [<ffffffff8115b709>] ? oom_badness.part.4+0xa9/0x140
 [<ffffffff8115ba27>] oom_kill_process+0x47/0x50
 [<ffffffff811bee4c>] mem_cgroup_out_of_memory+0x28c/0x2b0
 [<ffffffff811c122b>] mem_cgroup_oom_synchronize+0x23b/0x270
 [<ffffffff811c0ac0>] ? memcg_charge_kmem+0xf0/0xf0
 [<ffffffff8115be08>] pagefault_out_of_memory+0x18/0x90
 [<ffffffff81747e91>] mm_fault_error+0xb9/0xd3
 [<ffffffff81766267>] ? __do_page_fault+0x317/0x570
 [<ffffffff81766495>] __do_page_fault+0x545/0x570 …
Run Code Online (Sandbox Code Playgroud)

linux cgroup oom-killer docker

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