Tweaking the Linux scheduler for “background” jobs

TL;DR version: If you’re building software (or some other “background” job) on your laptop, on Linux, prefix the build command with chrt --idle 0 instead of nice, e.g.: $ chrt --idle 0 make -j 12

So a while ago, a “Linux wonder patch” was making the rounds in the news. This patch happens to basically only be useful if you’re running things like make -j 12 on your laptop, which is hardly newsworthy really, and on top of that, many people (me included) think it’s a gross hack. This was discussed several times, but probably one of the best articles on it is a LWN article.

Now, in that thread, I argued that the Linux scheduler should do something better with the traditional Unix nice scheduler value, and Linus basically said that while nice wasn’t very useful, it did have some semantics that we couldn’t break.

Now as it happens, this is is one of those half-baked Unix things for which Linux has a better replacement. Just like how fork is obsoleted by clone and mmap, it turns out that nice is obsoleted by sched_setscheduler.

In particular, SCHED_IDLE is quite nice, pun intended. If you’re building software (or running other “background” jobs) on your laptop (or a server even), you don’t need a gross patch in the kernel or to set up cgroups manually; just patch your build process to use chrt --idle 0 (or type it manually), and you will notice the difference. If you’re a GNOME developer and use jhbuild, this is actually done by default now.


3 comments

  1. Note, changing a processes scheduling policy requires you to have the CAP_SYS_NICE capability. What you are doing will work if you are root but may not work for regular users.

    There is also a (theoretical) possibility that priority inversion could lead to a permanent stall because unlike a niced process a SCHED_IDLE process can be starved indefinitely…

    • SCHED_IDLE does not require root. Try it.

      And yes, it truly is an idle scheduling class. But how often do you run a non-idle process at long stretches of 100% cpu, making no system calls at all?


Leave a reply to Anon Cancel reply