Taskset — привязка процесса к ядрам CPU в Linux
По умолчанию процессы в Linux используют все ядра процессора, но иногда необходимо освободить 0 ядро, которое обычно больше всего загружено или назначить некоторые процессы только на второй CPU и т.д., в этом случае поможет taskset.
Переключимся на root пользователя:
Узнаем ID процесса mc или любого другого нужного процесса:
Результат у меня был 249 , посмотрим каким ядрам назначен этот процесс:
Мой вывод содержал все ядра:
pid 249’s current affinity list: 0-11
Укажем ядра или процессоры которые хотим задействовать под данный процесс:
root@U0LC3:~# taskset -pc 10-11 249
pid 249’s current affinity list: 0-11
pid 249’s new affinity list: 10,11
Если с указанным именем запущено несколько процессов, то можно использовать скрипт (на примере процесс mc):
(for thread in $(ps -T -C mc | awk » | grep -E ‘8’); do /usr/bin/taskset -pc $thread; done)
Bывод в моём случае был следующий:
pid 249’s current affinity list: 10,11
pid 307’s current affinity list: 0-11
pid 323’s current affinity list: 0-11
Теперь привяжем все эти процессы к нужным ядрам:
(for thread in $(ps -T -C mc | awk » | grep -E ‘4’); do /usr/bin/taskset -pc 10-11 $thread; done)
pid 249’s current affinity list: 10,11
pid 249’s new affinity list: 10,11
pid 307’s current affinity list: 0-11
pid 307’s new affinity list: 10,11
pid 323’s current affinity list: 0-11
pid 323’s new affinity list: 10,11
Чтобы изменения не сбросились после перезапуска операционной системы, укажем команду например в файле /etc/rc.local.
Отключить/включить ядра CPU в Linux
В Linix вы можете временно включить или отключить ядра процессора без перезагрузки с помощью консольной утилиты chcpu.
Выведите информацию о доступных ядрах:
CPU(s): 3 On-line CPU(s) list: 0-2
В этом примере для гостевой ОС на виртуальной машине Linux доступны три ядра 0, 1 и 2.
В Linux вы можете отключить любые ядра процессора, кроме нулевого (CPU0).
Чтобы отключить ядра 1 и 2, выполните команду:
CPU 1 disabled CPU 2 disabled
Проверьте теперь какие ядра доступны:
On-line CPU(s) list: 0 Off-line CPU(s) list: 1,2
Также можно вывести информацию о доступных процессорах так:
$ grep «processor» /proc/cpuinfo
Чтобы включить ядра процессора, выполните:
CPU 1 enabled CPU 2 enabled
Также вы можете отключить определенное ядро командой. В этом примере мы отключаем CPU1:
$ sudo echo 0 | sudo tee /sys/devices/system/cpu/cpu1/online
Проверьте сообщения в dmseg:
[ 2257.253801] smpboot: CPU 1 is now offline
Чтобы включить его, выполните:
$ sudo echo 1 | sudo tee /sys/devices/system/cpu/cpu1/online
Если вы хотите, чтобы Linux всегда загружалась с меньшим количество доступных ядер, нужно настроить параметр ядра maxcpus=N.
N в этом случае – это количество доступных ядер процессора, доступных в Linux.
$ sudo mcedit /etc/default/grub
Измените строку следующим образом:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash maxcpu=2"
Вы можете использовать отключение ядер CPU в Linux, когда нужно уменьшить количество vCPU для виртуальной машины Linux и вы хотите протестировать, как работает операционная система и приложения с меньшим количеством доступных vCPU.
Также в Linux вы можете запускать приложения на определённых ядрах с помощью CPU affinity. Чтобы получить информацию о привязки определенного процесса к ядрам, выполните:
pid 894's current affinity mask: 3
pid 894's current affinity list: 0,1
Этому процессу разрешено выполняться на ядрах 0 и 1.
Чтобы разрешить запушенному процессу выполняться только на CPU0, выполните:
pid 894's current affinity list: 0,1 pid 894's new affinity list: 0
Или, чтобы разрешить процессу firefox использовать ядра с 0 по 3:
$ sudo taskset -c 0-3 firefox
Как назначить ядра процессора с помощью набора задач в Linux
Многоядерная обработка может иметь преимущества и недостатки, и иногда вам необходимо вручную назначать ядра ЦП программам (так называемое «сходство с ЦП»), чтобы добиться максимальной производительности. В Linux основным инструментом является набор задач. Это звучит потенциально пугающе, но мы разберем его на простые шаги, чтобы упростить процесс.
Основы набора задач
Использование набора задач можно разделить на две части: соответствие ЦП запускаемым программам и уже запущенным программам. Запускать программы проще из двух, поэтому мы начнем с него. Команда запуска выглядит так:
taskset -c cpu-core-number(s) application
Прежде чем ввести номер ядра ЦП, которое вы хотите назначить, не забывайте, что схема нумерации Unix обычно начинается с 0, поэтому ваше первое ядро будет 0, второе ядро - 1 и так далее. Таким образом, двухъядерная машина будет иметь ядра 0 и 1, а четырехъядерная машина будет иметь ядра 0, 1, 2 и 3.
Допустим, вы хотите запустить Audacity на двухъядерной системе и хотите, чтобы она работала на втором ядре. Эта команда будет такой:
набор задач - c 1 audacity
Использование нескольких ядер
На одной из наших машин Chrome иногда пропускал кадры при потоковой передаче видео, но при назначении на два ядра вел себя нормально. Если вы хотите попробовать то же самое на четырехъядерной системе и хотите назначить Chrome на три и четыре ядра, команда будет такой:
Вам не нужно назначать привязку ЦП к последовательным ядрам — вы можете выбрать любое ядро наугад. Допустим, у вас есть шестиядерный компьютер и вы хотите использовать Chrome на втором и шестом ядрах. Вы должны ввести команду:
Вы также можете использовать тире, чтобы распределить приложение по нескольким ядрам. Например, многие старые программы или системные функции по умолчанию будут работать на вашем первом ядре. Что, если вы хотите оставить первое ядро как можно более свободным, а большое приложение распределить по всем остальным ядрам?
Допустим, у вас есть восьмиъядерная система и вы хотите запустить Steam со второго по восьмое ядро. Эта команда будет такой:
Изменение привязанности к уже запущенной программе
Набор задач не ограничивается только запуском приложений. Вы также можете изменить привязку к процессору для уже запущенной программы. Однако, прежде чем вы сможете изменить привязку приложения, вам сначала нужно узнать его идентификатор процесса (или для краткости PID).
Чтобы узнать PID вашего приложения, вы можете попробовать использовать системный монитор вашего рабочего стола, но самый быстрый способ — просто использовать top . Неудивительно, что он использует команду:
Имена всех запущенных команд находятся в правой части экрана. Соответствующие идентификаторы процессов находятся слева.
Запишите свой PID, как вы собираетесь использовать его через мгновение. В этом примере мы будем использовать VLC, который находится в процессе воспроизведения видео высокой четкости Matroska на старом ПК с шестью ядрами. Мы экспериментируем с разными типами ЦП, чтобы выжать максимальную производительность из VLC.
Чтобы изменить привязку существующего процесса, синтаксис выглядит следующим образом:
taskset - cp PID core-numbers
Если вы видите наш снимок экрана выше, идентификатор процесса VLC — 20485. Мы собираемся попробовать запустить VLC на четвертом, пятом и шестом ядрах, которые в Unix-системе будут 3-5. Итак, после всего этого команда будет:
Но что, если вы хотите проверить существующую привязку перед ее изменением? Для этого не вводите никаких основных чисел, и набор задач сообщит вам, как присваивается привязка. Итак, если мы изменим последнюю команду на:
это показывает нам, что VLC распределен по всем ядрам.
Давайте попробуем еще раз с другой программой. Допустим, вместо этого мы запускаем большую Matroska с SMPlayer, а SMPlayer уже запущен. Вверху указано, что PID — 16058.
Но сначала мы хотим узнать его существующую близость. Используя команду с переключателем -cp , но без номеров ядер, мы видим, что сходство в настоящее время распространяется по всем ядрам.
Теперь мы можем попробовать распространить SMPlayer на те же три ядра, что и эксперимент VLC, с помощью команды:
Это легко, не правда ли? Если вы хотите протестировать свой компьютер, ознакомьтесь с нашим руководством по 8 полезный инструмент для стресс-тестирования вашего процессора.
Программе необходимо использовать все ядра/потоки ЦПУ
Всех приветствую! Помогите по проблеме: Есть некоторая программа, которой необходимо использовать все ядра/потоки ЦПУ при необходимости, ей доступно лишь одно ядро и один поток, программа имеется в исполнении как для Windows так и для Linux, в Windows все нормально, т.е. ей доступны для задействования все ядра и потоки моего ЦПУ а Linux только одно ядро и один его поток, а именно пробовал в Kubuntu 16.04 и 18.04 в других линуксах пока не пробовал, хотя есть вероятность что и в остальных такое же может быть, процессор у меня AMD Ryzen 7 и видимо для ЦПУ от AMD, для подобной программы, требуется какая то дополнительная настройка через настройки устройств системы в псевдофайловой системе Sysfs, я в этом не силен, может поможет кто советом? Т.к. с процессорами от Intel c задействованием ядер/потоков в линуксе ни у этой ни у каких либо других программ проблем нет
нужно несколько функций int __ryzen main(), по количеству ядер
Куда эту функцию вставить?
которой необходимо использовать все ядра/потоки ЦПУ при необходимости
Она написана специально с расчётом на это? libpthread в выводе ldd путь/к/исполняемому/файлу есть?
ей доступно лишь одно ядро и один поток
Ох уж этот заветный потанцевал.
Короче это прога-майнер, XMRig, вот отсюда https://github.com/xmrig/xmrig/releases Там же и исходники есть, в принципе там есть файлики — Cpu.cpp, Cpu.h, Cpu_unix.cpp, в них видимо и надо код допиливать А доступно ей лишь одно ядро-поток это мне видно по результатам её работы — её производительность в линуксе ровно в 8 раз меньше чем в винде ( у меня 8 ядер — 16 потоков)
/sys, /proc смонтированы? Ты там не из-под голого ядра его запускаешь?
пиши в гитхаб аффтарам, у них спрашивай, почему у тебя в 8 раз меньше производительсность на линуксе, мы откуда знаем тут
Писал без ответа, вот думаю может систему надо поднастроить
Стандартно установленная Убунта(кубунта точнее), без самодеятельности, вся система на одном томе — /, /Home на втором, свап на третьем, sys и proc на томе с системой как я вижу имеются
может там видеокарта нужна
Нет, это только CPU майнер, для видюх у этих авторов отдельная прога
может у амдкукурузенов AVX инструкций нет, а сабж их активно использует?
В винде то XMrig работает нормально — выдает около 500-600 H/s В линуксе мне выдает около 50-60 H/s AVX у меня на Ryzen’е есть
А самой программы настройки посмотреть? Там можно жёстко задать и кол-во ядер/потоков, и даже какие именно по счёту. Например тут посмотреть https://xmr.ru/mining/xmrig/
А я все эти настройки и смотрел и в конфиге прописывал, ничего не изменилось
А top например, что пишет по загруженности ядер? Может быть не в ядрах и дело.
В смысле что другие процессы могли загрузить ядра и проге ничего не осталось? Вряд ли в этом дело, как бы только на свежеустановленной системе запускал прогу, больше ничего особенно лишнего в системе не устанавливал и не запускал, откуда там столько лишней нагрузки сразу на все 8 ядер возьмется, сейчас вот к сожалению не могу посмотреть, снес систему чтобы другие линуксы перепробовать, хотя есть сомнения что это чтото изменит Также по инструкции включал поддержку больших страниц в памяти
On Linux you will need to configure large page support and increase your ulimit -l.
To set large page support, add the following lines to /etc/sysctl.conf:
To increase the ulimit, add following lines to /etc/security/limits.conf:
* soft memlock 262144 * hard memlock 262144
You WILL need to log out and log back in for these settings to take affect on your user (no need to reboot, just relogin in your session).
Вообщем явно XMRig почему то не может использовать больше одного ядра, кстати качал с инета другие майнер-проги для Monero (XMR) под ЦПУ, тоже для линукса, и на них тоже такой же результат, производительность в 8-10 раз меньше чем на винде, у людей же у которых intel’ы в линуксе все норм. Явно надо в системе еще чтото допилить настройках