На моих локальных машинах установлено несколько процессоров, каждый из которых имеет несколько ядер, и каждый может поддерживать несколько потоков. У меня есть многопоточный процесс, который я хочу заставить работать только в одном потоке. Я понимаю, что numactrl
это можно сделать.
Как я могу использовать, numactl
чтобы заставить процесс работать только в одном потоке? Или есть ли еще более простая встроенная утилита, которая может это сделать?
решение1
numactl --physcpubind=+1 /path/to/your/executable
это должно запустить ваш процесс на втором ядре/процессоре, назначенном вашему чипсету (индекс 1). Более подробную информацию см. в разделе «Примеры» на странице руководства: http://linux.die.net/man/8/numactl
Редактировать: Я должен отметить, что это означает, что программа будет выполнять максимум один поток одновременно, но это не означает, что весь процесс будет состоять только из одного потока. Если программа написана так, чтобы порождать новый поток, она это сделает, но он будет выполняться на том же ядре/процессоре, что и остальная часть процесса. Тонкое различие, но тем не менее потенциально важное.
решение2
Чтобы ограничить программу одним аппаратным ядром/потоком ЦП, можно также использоватьtaskset 1 prog [args]
ПС
Программа для ограничения количества процессов, которые может иметь программа (потоки), это prlimit --nproc=1 prog [args]
. Я пытался использовать ее с rsync
и получил "fork unavailable... error in IPC" и конец - rsync
написано, чтобы не работать как один поток.
strace prlimit --nproc=1 rsync
Запуск strace
показал, как описано в ссылке SO ниже, возвращаемое значение из clone
вызова:-1 EAGAIN (resource temporary unavailable).
P.S. Идея взята изhttps://stackoverflow.com/questions/38637451/is-there-a-way-force-a-program-to-use-only-1-thread.