我的本機有多個CPU,每個CPU都有多個核心,每個CPU都可以支援多個執行緒。我有一個多線程進程,我想強制它僅在單個線程上運行。我明白numactrl
可以做到這一點。
如何numactl
強制進程僅在單一執行緒上運行?或者,是否有一個更簡單的內建實用程式可以做到這一點?
答案1
numactl --physcpubind=+1 /path/to/your/executable
這應該在分配給您的晶片組的第二個核心/CPU 上運行您的進程(索引 1)。有關更多詳細信息,請參閱手冊頁的範例部分: http://linux.die.net/man/8/numactl
編輯:我應該指出,這意味著程式最多會同時運行一個線程,但這並不意味著整個進程將僅由一個線程組成。如果編寫程式是為了產生一個新線程,它就會這樣做,但它將與進程的其餘部分在同一核心/CPU 上執行。雖然差異很小,但仍然可能很重要。
答案2
要將程式限制為一個 CPU 硬體核心/線程,也可以使用taskset 1 prog [args]
聚苯乙烯
限製程式可以擁有的進程(執行緒)數量的程式是prlimit --nproc=1 prog [args]
。我嘗試使用它,rsync
但得到“fork unavailable... IPC 中的錯誤”,最後 -rsync
被寫入不作為一個線程工作。
strace prlimit --nproc=1 rsync
運行strace
已顯示,如下面的 SO 連結中所述,調用的返回值clone
是-1 EAGAIN (resource temporary unavailable).
PS創意取自https://stackoverflow.com/questions/38637451/is-there-a-way-force-a-program-to-use-only-1-thread。