如何配置 cgroups 以在用户之间公平地共享资源?

Nig*_*Fan 11 linux performance kernel administration

cgroups 下曾经有一个名为 sched_user 或类似的内核配置选项。这允许(据我所知)所有用户公平地共享系统资源。在 2.6.35 中它不可用。有没有一种方法可以将我的系统配置为在所有用户(包括 root 用户)之间自动共享 io/cpu/内存资源?我以前从未设置过 cgroup,有没有好的教程可以这样做?非常感谢。

wag*_*wag 12

内核文档通过示例提供了 cgroup 的一般覆盖。

发行版已经提供的cgroups-bin包(取决于libcgroup1)应该没问题。

通过编辑以下两个文件来完成配置:

/etc/cgconfig.conf
Run Code Online (Sandbox Code Playgroud)

由 libcgroup 用于定义控制组、它们的参数和挂载点。

/etc/cgrules.conf
Run Code Online (Sandbox Code Playgroud)

由 libcgroup 用于定义进程所属的控制组。

这些配置文件中已经包含示例,因此请尝试根据您的要求调整它们。手册页很好地涵盖了它们的配置。

然后,启动工作负载管理器和规则守护进程:

service cgconfig restart
service cgred restart
Run Code Online (Sandbox Code Playgroud)

工作负载管理器 (cgconfig) 负责分配资源。
向管理器添加一个新进程:

cgexec [-g <controllers>:<path>] command [args]
Run Code Online (Sandbox Code Playgroud)

向管理器添加一个已经运行的进程:

cgclassify [-g <controllers>:<path>] <pidlist>
Run Code Online (Sandbox Code Playgroud)

或者自动覆盖 cgrules.conf 文件和 CGroup 规则守护进程 (cgred),它强制每个新生成的进程进入指定的组。


示例 /etc/cgconfig.conf :

group group1 {
    perm {
            task {
                    uid = alice;
                    gid = alice;
            }
            admin {
                    uid = root;
                    gid = root;
            }
    }

    cpu {
            cpu.shares = 500;
    }

}

group group2 {
    perm {
            task {
                    uid = bob;
                    gid = bob;
            }
            admin {
                    uid = root;
                    gid = root;
            }
    }

    cpu {
            cpu.shares = 500;
    }

}

mount {
    cpu = /dev/cgroups/cpu;
    cpuacct = /dev/cgroups/cpuacct;
}
Run Code Online (Sandbox Code Playgroud)

示例 /etc/cgrules.conf :

alice            cpu             group1/
bob              cpu             group2/
Run Code Online (Sandbox Code Playgroud)

这将在用户 'alice' 和 'bob' 之间共享大约 50-50 的 CPU 资源