我有一个solaris服务器,需要尽快运行一个timecritical应用程序,虽然设置为RT优先级类似乎不是一个好主意,因为它可能需要100个CPU长时间。
我想使用空闲的CPU时间来处理另一个进程,但是如果时间紧迫的话,这个进程不应该接收任何CPU时间。 我怎么能实现这一点,使用不错的-19不分配100%的CPU到时间关键的一个。
在固定的优先级下运行你的第二个应用程序,并尽可能低的优先级。 如果它已经在运行,可以使用它的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,允许来自低优先级进程的小活动爆发。
为了避免这种情况,您可以将中间优先级的关键stream程设置为FX类。 在这种情况下,它决不会屈服于另一个:
priocntl -c FX -m 30 -p 30 -c critical_command ...
在Solaris计划devise中不可能提供您正在寻找的硬性限制。 最接近的选项是:
@jlliagre提供的答案将使您比默认的标准调度模型更接近您,但它仍然不会阻止非关键进程获取CPU时间。
如果你有更多的CPU /内核比关键进程有线程,那么RT将很容易地满足你的需求。 否则,除非您不需要以其他方式使用系统,否则RT可能不是一个好主意。 由于关键stream程不为CPU留下任何CPU,您甚至可能无法login。