プロセッサ親和性という用語を聞いたことがありますか?これは、プロセスを特定の中央処理装置または一連のCPUにバインドまたはバインド解除できるようにする機能です。はい、特定のプロセスを実行するためにどのCPUコアを使用する必要があるかをシステムに伝えることができます。プロセッサ親和性が存在する理由の理論的な詳細については、こちらをご覧ください。
ここでは、このチュートリアルで、タスクセットと呼ばれるユーティリティについて説明します。 -これにより、プロセッサアフィニティを実現できます。ただし、その前に、このチュートリアルのすべての例がUbuntu20.04LTSマシンとDebian10でテストされていることを言及する価値があります。
Linuxタスクセットコマンド
tasksetコマンドを使用すると、プロセスのCPUアフィニティを設定または取得できます。その構文は次のとおりです。
taskset [options] mask command [argument...]
taskset [options] -p [mask] pid
ツールのマニュアルページで説明されている方法は次のとおりです。
taskset is used to set or retrieve the CPU affinity of a running
process given its pid, or to launch a new command with a given CPU
affinity. CPU affinity is a scheduler property that "bonds" a process
to a given set of CPUs on the system. The Linux scheduler will honor
the given CPU affinity and the process will not run on any other CPUs.
Note that the Linux scheduler also supports natural CPU affinity: the
scheduler attempts to keep processes on the same CPU as long as practi?
cal for performance reasons. Therefore, forcing a specific CPU affin?
ity is useful only in certain applications.
The CPU affinity is represented as a bitmask, with the lowest order bit
corresponding to the first logical CPU and the highest order bit corre?
sponding to the last logical CPU. Not all CPUs may exist on a given
system but a mask may specify more CPUs than are present. A retrieved
mask will reflect only the bits that correspond to CPUs physically on
the system. If an invalid mask is given (i.e., one that corresponds to
no valid CPUs on the current system) an error is returned. The masks
may be specified in hexadecimal (with or without a leading "0x"), or as
a CPU list with the --cpu-list option. For example,
0x00000001 is processor #0,
0x00000003 is processors #0 and #1,
0xFFFFFFFF is processors #0 through #31,
32 is processors #1, #4, and #5,
--cpu-list 0-2,6
is processors #0, #1, #2, and #6.
When taskset returns, it is guaranteed that the given program has been
scheduled to a legal CPU.
以下は、タスクセットコマンドがどのように機能するかをよりよく理解するためのQ&Aスタイルの例です。
Q1。タスクセットを使用してプロセスのCPUアフィニティを取得するにはどうすればよいですか?
タスクセットにすでに実行中のプロセスのCPUアフィニティを表示する場合は、次の方法でコマンドを使用します。
taskset -p [PID]
PIDを、CPUアフィニティを取得するプロセスのIDに置き換えるだけです。例:
taskset -p 9726
上記のコマンドは次の出力を返しました:
pid 9726's current affinity mask: f
したがって、ここでの16進値'f'は、プロセスが4つのプロセッサコア(0、1、2、3)のいずれかで実行できることを意味します。
CPU範囲で出力したい場合は、-cコマンドラインオプションを追加できます。
taskset -cp 9726
この場合の出力は次のとおりです。
pid 9726's current affinity list: 0-3
Q2。タスクセットを使用してCPUアフィニティを変更するにはどうすればよいですか?
既存のプロセスのCPUアフィニティを微調整するには、(前のセクションで行ったように)プロセスIDと、新しいアフィニティを定義する16進マスクを指定する必要があります。
たとえば、Geditプロセス(PID:9726)の現在のCPUアフィニティは「f」です。
アフィニティを0x11に変更するには、次のコマンドを使用します。
taskset -p 0x11 9726
次に、次のコマンドを使用して、新しいアフィニティを再度確認できます。
taskset -p 9726
次のスクリーンショットは、私の場合のこれらのコマンドの出力を示しています。
これで、アフィニティが変更されたことがわかります。
Q3。アフィニティを変更しながらCPUの範囲を割り当てる方法は?
これは大したことではありません。前のセクションで使用したコマンドに、入力としてCPUコア範囲とともに-cコマンドラインオプションを追加するだけです。
例を次に示します:
タスクセット-cp0,39726
この場合に生成される出力は次のとおりです:
pid 9726's current affinity list: 0
pid 9726's new affinity list: 0,3
Q4。事前定義されたCPUアフィニティを使用してプロセスを起動するにはどうすればよいですか?
はい、CPUアフィニティを設定してプロセスを起動することもできます。
たとえば、CPUアフィニティ0xaでテキストgeditエディターを起動しました。
タスクセット0xagedit
同意しました。tasksetコマンドは、平均的なコマンドラインユーザー向けではありません。これは主に、マルチコア環境でのプロセス最適化のためにサーバー側の専門家によって使用されます。ここでは、ツールの基本について説明しました。詳細については、manページにアクセスしてください。