Про параллельный архиватор, который работает с использованием сразу нескольких процессоров (ядер), мы уже как-то говорили. А вот если задача противоположная? Если есть приложение, и надо умерить его аппетиты в процессорах?
Сразу оговорюсь, что речь идёт о немногих приложениях, умеющих работать в несколько потоков на нескольких ядрах. Вроде того же параллельного архиватора. Хотя, справедливости ради, надо сказать, что он сам легко настраивается в плане использования процессоров. А вот “отсадить” на одно ядро кодирование видео, дабы не мешало жизни других приложений — дело жизненно необходимое.
На выручку приходит команда taskset. Обычно она входит в состав дистрибутива Linux, но если нет, то поискать её можно по ключевому слову schedutils. После установки начинаем “шаманить”. Для этого необходимо знать pid процесса, который занимает ядра. Для примера пусть это будет 3477.
Вначале отдаём команду на просмотр использования ядер:
# taskset -p 3477 pid 3477's current affinity mask: 1
Замечу, что процессоры отображаются по бинарной маске. То есть первый — это 1, второй — это 10 в двоичной системе и 2 в десятичной, третий — 4 (100 в двоичной). А первый, второй и третий — будет 7 (111).
# taskset -p 07 3477 pid 3477's current affinity mask: 1 pid 3477's new affinity mask: 7
Но чтобы не заморачиваться с двоичным устным счётом, можно использовать ключ -c и писать номера процессоров через запятую и/или тире:
# taskset -pc 1,4,5-7 3477
Только не забывайте, что в этом случае процессоры нумеруются, уже начиная с нуля 😉