其他管理员如何管理运行 jail 的多核主机上的 CPU 资源,比如分配适当数量的核心供特定 jail 专用,以及保留适当数量的核心供主机系统专用?
总结
我正在学习如何使用rctl(8)
、/etc/rctl.conf
和cpuset(1)
相关工具来管理 CPU。
作为练习,我正在使用一个 8 核系统。我希望将 CPU 0-3 专用于主机系统进程,并将 CPU 4-7 专用于被监禁的进程。
我在思考这个问题时遇到了两个根本问题。第一个是,由于cpuset
只能将 CPU 掩码应用于现有目标(进程、监狱等),因此我目前必须先启动监狱,然后限制其 CPU 集。这意味着在cpuset
创建限制之前生成的监狱进程将在 CPU 集之外运行。如果这些监狱进程是长期存在的,则必须在调用后重新启动它们,cpuset
以确保监狱保持在其限制范围内。
其次,出于与 #1 类似的原因,我不清楚如何让主机系统限制自己的 CPU 使用率,以便它不使用任何专用于运行 jail 的 CPU。同样,由于必须在进程诞生之前建立 CPU 集限制,因此似乎进程init(8)
本身需要以受限制的 CPU 集启动。我找不到任何机制来做到这一点。
为了解决第一个问题,即能够启动具有立即cpuset
限制的监狱,这种语法在以下情况下不起作用/etc/jail.conf
:
path = "/jail/$name";
test {
jid = 42;
# This is the default value before tweaking:
# exec.start = "/bin/sh /etc/rc";
# restrict this jail to CPU7 only:
exec.start = "/usr/bin/cpuset -c -l 7 /bin/sh /etc/rc";
host.hostname = "test";
ip4.addr = "public|10.160.161.162";
mount.devfs = true;
allow.raw_sockets = true;
allow.sysvipc = true;
}
另一个不成功的方法是恢复默认值exec.start
并启动监狱:
# cpuset -c -l 7 service jail start test
关于第二个问题,即限制主机系统以防止非监禁进程(jail id = 0)使用为监禁进程保留的 CPU(jail id > 0,我不确定从哪里开始。最优雅的方式似乎是从一开始就进行限制init(8)
,以便它产生的任何进程都继承相同的 CPU 限制。一种不太优雅的黑客可能是用来rctl.conf
创建基于特定登录类的 CPU 限制,并将所有用户分配给该登录类。这似乎仍然无法限制在初始化init
之前启动的系统守护进程rctl
。简单的观察rcorder(8)
表明 rctl 在 rc 启动过程中运行得相对较晚,在我的系统上排在 166 个中的第 127 位:
# cd /etc/rc.d
# rcorder * | grep -xn rctl
127:rctl
# rcorder * | wc -l
166
为解决此类问题,已经开发了哪些解决方案和最佳实践?目前我正在阅读2014 年的一些历史讨论关于使用特定 cpuset 启动的问题init(8)
。遗憾的是,该帖子的 OP 提出的补丁已无法访问。