私のローカル マシンには複数の CPU があり、それぞれが複数のコアを持ち、それぞれが複数のスレッドをサポートできます。 マルチスレッド プロセスがあり、それを 1 つのスレッドでのみ強制的に実行したいと考えています。numactrl
それが可能であることは理解しています。
プロセスを単一のスレッドでのみ実行するように強制するにはどうすればよいでしょうかnumactl
? あるいは、それを実行できるさらに簡単な組み込みユーティリティはありますか?
答え1
numactl --physcpubind=+1 /path/to/your/executable
これにより、チップセットに割り当てられた 2 番目のコア/CPU (インデックス 1) でプロセスが実行されます。詳細については、マニュアル ページの例のセクションを参照してください。 http://linux.die.net/man/8/numactl
編集: これは、プログラムが最大で 1 つのスレッドを同時に実行することを意味しますが、プロセス全体が 1 つのスレッドのみで構成されることを意味するわけではないことを指摘する必要があります。プログラムが新しいスレッドを生成するように記述されている場合、そのプログラムは新しいスレッドを生成しますが、プロセスの残りの部分と同じコア/CPU で実行されます。わずかな違いですが、それでも潜在的に重要です。
答え2
プログラムを1つのCPUハードウェアコア/スレッドに制限するには、以下を使用することもできます。taskset 1 prog [args]
追伸
プログラムが持つことができるプロセス (スレッド) の数を制限するプログラムは ですprlimit --nproc=1 prog [args]
。これを で使用しようとしましたrsync
が、「fork が利用できません... IPC でエラーが発生しました」というメッセージが表示され、最後に - はrsync
1 つのスレッドとして動作しないように記述されています。
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。