У меня есть сервер с 12 ядрами, и я хочу запустить скрипт, который принимает файл в качестве входного аргумента и выполняет его обработку. Я хочу использовать 8 ядер и не более того, чтобы выполнять параллельную обработку 8 файлов одновременно на 8 ядрах, а затем перейти к следующему, как только обработка 1 будет завершена.
Я пробовал сделать это xargs
следующим образом:
ls /data/paths/ | grep new | xargs -i -P 8 -n 1 bash main.sh {}
Но когда я вижу ядро, загрузка ЦП прикрепляется к снимку.
Я также пробовал делать с параллелями следующим образом:
ls /data/paths/ | grep new | parallel -j 8 --no-notice bash main.sh {}
Мое условие — ограничиться 8 процессорами.
РЕДАКТИРОВАТЬ:
При запуске ps -ef | grep main.sh
отображается 11-12 процессов вместо 8.
решение1
Вы можете использоватьtaskset
для установки привязки к процессору процесса. Следующее гарантирует, что ваша xargs
команда будет использовать только первые 8 виртуальных ядер процессора:
ls /data/paths/ | grep new | taskset -c 0-7 xargs -i -P 8 -n 1 bash main.sh {}
Обратите внимание, что изнабор задач человека:
Для изменения привязки процесса к ЦП пользователь должен обладать привилегиями CAP_SYS_NICE.