Linuxネットワークアプリケーションのレイテンシを短縮しようとしています。プログラムを特定のCPUコアに「バインド」するには、タスクセットとcpusetの2つのツールがあることを学びました。
Tasksetは、プロセスを1つ以上のCPUにバインドするためのものです。基本的にを指定します最初の実行時または実行中に実行できます。最新のサーバー機器でRHEL/CentOSを使用している場合は、numactl
よりもtaskset
をお勧めします。
Cpuset/csetはCPUシールド用で、Linux cgroupを中心に構築されたフレームワークです。プロセス管理に利用可能な他のツールがあるため、Csetは特定のディストリビューション(RHELなど)では人気がありませんでした。
以下の最初のコマンドは、オペレーティングシステムのタスクをCPUコア0および8に制限するシールドを作成します。2番目のコマンドは、現在のシェルセッションを指定されたCPUシールドに移動し、システムプロセスとユーザープロセスを分離します。
# cset shield --cpu 1-7,9-15 --kthread=on
# cset proc --move --pid=$$ --threads --toset=user
CPUへのバインディングプロセスのパスに進む前に、確認および調整する可能性のある他の事項があります。割り込み(irqbalance
部分的な無効化)、省電力設定、システムスケジューラ、I/Oエレベーター、リアルタイムポリシー( chrt
)。
これは、コアを選択し、irqbalanceを停止し、開始し、選択したコアをブラックリストに登録し、。/ your_programを で実行するアプリケーションラッパーの(convoluted)の例です。選択したコアのSCHED_FIFO および優先度99。
Core=5
CoreMask=`echo "16 o 2 $Core ^ p" | dc`
service irqbalance stop
until [ "`service irqbalance status`" = "irqbalance is stopped" ] ; do sleep 1 ; done
IRQBALANCE_ONESHOT=1 IRQBALANCE_BANNED_CPUS=${CoreMask} irqbalance
sleep 1
until [ "`service irqbalance status`" = "irqbalance is stopped" ] ; do sleep 1 ; done
numactl --physcpubind=${Core} --localalloc chrt -f 99 ./your_program