让应用程序以与 CPU 空闲相同的优先级运行

让应用程序以与 CPU 空闲相同的优先级运行

我有一台 Solaris 服务器,需要尽快运行一个时间关键型应用程序,但将其设置为 RT 优先级似乎不是一个好主意,因为它可能长时间需要 100 个 CPU。

我想使用空闲的 CPU 时间来处理其他进程,但如果时间关键的进程有事要做,则此进程根本不应接收任何 CPU 时间。我该如何实现这一点,使用 nice -19 不会将 100% 的 CPU 分配给时间关键的进程。

答案1

在固定优先级类别下运行第二个应用程序,并使用最低优先级。如果它已在运行,您可以使用其 pid 进行设置:

priocntl -c FX -m 0 -p 0 -s -i pid <pid>

或者在启动时执行此操作:

priocntl -c FX -m 0 -p 0 -e command [arguments ...]

编辑:

请注意,FX 调度类不应与 RT 调度类混淆。虽然 RT(实时)优先级类也是固定优先级类,但被授予 RT 优先级的进程将抢占系统线程(即内核),因此应仅用于计算活动周期相对较短的进程。对于像您描述的需要长时间使用 100 个 CPU 线程的进程,绝对不建议使用 RT 类。FX 类不存在此问题,其(默认)优先级范围与常规分时优先级相同。

正如 Yedric 在回复中指出的那样,将低优先级进程优先级设置为 0 不足以确保当高优先级进程处于活动状态时它根本不会运行。

原因是后者属于分时类,调度程序会注意到一个进程已经等待了一段时间,因此会将关键进程的实际优先级降低到 0,从而允许低优先级进程进行小规模的活动。

为了避免这种情况,您可以将关键进程设置为具有中等优先级的 FX 类。在这种情况下,它永远不会让位于另一个进程:

priocntl -c FX -m 30 -p 30 -c critical_command ...  

答案2

Solaris 调度设计不可能提供您正在寻找的硬性限制。最接近的选项是:

  1. 关键过程的 RT;或者,
  2. 当关键进程需要 CPU 时终止非关键进程,并在满足该需求后重新启动;或者,
  3. 使用进程信号 SIGSTOP/SIGCONT 使非关键进程进入睡眠状态并允许其继续运行。

@jlliagre 提供的答案将比标准调度模型默认值更接近,但它仍然不会阻止非关键进程获得 CPU 时间。

如果您拥有的 CPU/核心数多于关键进程的线程数,那么 RT 可以轻松满足您的需求。否则,除非您不需要以任何其他方式使用系统,否则 RT 可能不是一个好主意。您很容易陷入无法登录的境地,因为关键进程没有为其留下任何 CPU。

相关内容