delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

26 Dec 2011

idprio和rtprio

记一笔,没啥特别。

Unix 系统的分时调度中,nice值(通过 nice(1) 来控制)是管理员告诉调度器的一个参数,这个参数令内核在考虑就绪进程优先级时,根据其值适当增大或减少执行绪的动态优先级。很明显,如果采用抢占式调度,如果执行绪等待时间较长,或者由于某种原因获得了优先级奖励(例如I/O导致的等待),即使有更重要的任务需要执行,内核还是会将这个执行绪调度进来并进行执行;反之,如果执行绪使用的 CPU 很多(计算密集型任务,如压缩等等),即使这个执行绪进行的就是最重要的任务,它仍然可能被置入休眠状态。

FreeBSD 的及时调度 (real-time scheduling) 实现中,增加了32个’及时(realtime)‘优先级和32个’闲时调度(idle)‘优先级。用户态进程可以通过 rtprio(2) 或 rtprio_thread(2) 系统调用来为进程或线程指定这些优先级。这些优先级不会动态调整,故在抢占式调度中可以一直获得时间片,或只有在系统闲时才获得时间片。

为了方便管理员使用,FreeBSD提供了与之对应的 rtprio(1)idprio(1) 命令。出于显然的安全考虑,rtprio 和减少 nice 值一样需要超级用户权限,而 idprio 默认也需要超级用户权限(目前,持锁执行绪可能由于优先级太低而被抢断,从而导致死锁),但可以通过将 security.bsd.unprivileged_idprio 设为 1 来允许非特权用户使用它。

典型的用法包括:

将 Xorg 设为 realtime 优先级,以改善其响应。这个命令必须以 root 身份运行。

副作用:如果 Xorg 陷入死循环,将没有机会令其终止。

# rtprio 31 -pgrep Xorg``

以 idle 优先级运行 make buildworld。需要以 root 身份运行或将 sysctl security.bsd.unprivileged_idprio 设为 1。

# idprio 31 make buildworld

对于单机运行的网站来说,也可以用类似的方法来做后台的日志分析处理。