私は解決策を見つけようとしましたが、私が見つけたのは、ワークセットまたはsched_setaffinityを使用してプロセスをCPUに固定する方法だけでした。しかし、これはプロセスにCPUへの排他アクセスを与えないようです。つまり、スケジューラはそのCPUに別のプロセスを割り当てることができます。 CPUがプロセス専用かどうかを確認する方法やコマンドはありますか?ワークセットを使用すると、特定のプロセスが特定のCPUでのみ実行されるようにすることができますが、その逆も実行することを望みます。つまり、CPU がプロセスにバインドされています。同様の質問が見つかりました特定のCPUパフォーマンスをプロセスに割り当てる方法は?そしてLinuxで1つのCPUコアのみを使用するようにプロセスを制限する方法は?しかし、重複としてマークされています。Linuxでプロセスのプロセッサアフィニティを設定するには?これは私が望むものではありません。
答え1
フルスケジューリングからCPUを除外する必要があり、次の手順でCPUにプロセスを割り当てることができます。
taskset
あなたがすでに見つけたように。 CPUを除外するには、起動パラメータを追加してください。
isolcpus=N
数字(N)は0から始まります。
答え2
systemdを実行しているシステムでは、systemd構成で構成することもできます。システムに4つのコアがあると仮定すると、
[Manager]
CPUAffinity=0-2
/etc/systemd/system.conf
systemd(PID 1)が最初の3つのCPUで実行されるようにします。デフォルトでは、systemdによって直接または間接的に開始されたプロセス(すべてのプロセスに対応)はこの設定を継承するため、4番目のCPU(3回)は使用されません。ただ追加してください
[Service]
CPUAffinity=3
4番目のコアで実行するサービスの単位ファイルに追加します。このアプローチの1つの利点は、LimitMEMLOCK
同じ場所で異なるリアルタイム関連設定を調整できることです。LimitRTPRIO
複数のツールを使用する必要はありません。
注:最初の変更を適用するには、systemdに対してシステムを再起動する必要があります。サービス構成のみを変更した場合は、影響を受けるサービスを再起動するだけで十分です。
systemctl daemon-reload
systemctl restart my-service.service