По умолчанию процессы используют все ядра процессора, но иногда необходимо освободить 0 ядро, которое обычно больше всего загружено или назначить некоторые процессы только на второй CPU и т.д., в этом случае поможет taskset.
Переключимся на root пользователя:
sudo -i
Просмотр краткой справки по taskset:
taskset -h
Узнаем ID процесса bird или любого другого нужного процесса:
pidof bird
Посмотрим каким ядрам назначен этот процесс:
taskset -pc 744
taskset -p -c 744
Можно указать все в одной команде:
taskset -cp `pidof bird`
Например у меня отобразилось, что на все ядра:
pid 744’s current affinity list: 0-27
Посмотрим сколько ядер имеет процессор и сколько есть процессоров:
lscpu | grep -i numa
Например у меня отобразилось:
NUMA node(s): 2
NUMA node0 CPU(s): 0-13
NUMA node1 CPU(s): 14-27
В моем случае второй процессор загружен на 10% меньше чем первый, поэтому я привязал процесс к ядрам второго процессора:
taskset -pc 14-27 `pidof bird`
Или укажем на все кроме 0:
taskset -pc 1-27 `pidof bird`
В ответ у меня отобразилось:
pid 17092’s current affinity list: 0-27
pid 17092’s new affinity list: 14-27
Проверим:
taskset -pc `pidof bird`
Если с указанным именем запущено несколько процессов, то можно использовать скрипт (на примере процесс ixnfo_com):
(for thread in $(ps -T -C ixnfo_com | awk '{print $2}' | grep -E '[0-9]'); do /usr/bin/taskset -pc $thread; done)
Например у меня отобразилось:
pid 2455's current affinity list: 0-27
pid 2458's current affinity list: 0-27
pid 2459's current affinity list: 0-27
pid 2460's current affinity list: 0-27
pid 2461's current affinity list: 0-27
pid 2463's current affinity list: 0-27
Теперь привяжем все эти процессы к нужным ядрам:
(for thread in $(ps -T -C ixnfo_com | awk '{print $2}' | grep -E '[0-9]'); do /usr/bin/taskset -pc 14-27 $thread; done)
Чтобы изменения не сбросились после перезапуска операционной системы, укажем команду например в файле /etc/rc.local.
Смотрите также мои статьи:
- Распределение прерываний сетевой платы по ядрам процессора
- Как узнать на каких NUMA node сетевые интерфейсы
- Как отличить физические ядра процессора от виртуальных
- Решение: Нет файла /etc/rc.local в Ubuntu 18