如何限制 FreeBSD 12 中的 CPU 调度?

如何限制 FreeBSD 12 中的 CPU 调度?

其他管理员如何管理运行 jail 的多核主机上的 CPU 资源,比如分配适当数量的核心供特定 jail 专用,以及保留适当数量的核心供主机系统专用?

总结

我正在学习如何使用rctl(8)/etc/rctl.confcpuset(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 提出的补丁已无法访问。

相关内容