一連の分離されたCPUでマルチスレッドベンチマークを実行しようとしています。長い話を短くカットするには、私が最初にしてみましたisolcpus
とtaskset
、しかし、ヒットの問題を。今、私はcgroups / csetsで遊んでいます。
「単純な」cset shield
ユースケースはうまく機能すると思います。私は4つのコアを持っているので、ベンチマークにコア1〜3を使用します(これらのコアもアダプティブティックモードに設定しました)。その後、コア0を他のすべてに使用できます。
ここのチュートリアルに従うと、次のように簡単になります。
$ sudo cset shield -c 1-3
cset: --> shielding modified with:
cset: "system" cpuset of CPUSPEC(0) with 105 tasks running
cset: "user" cpuset of CPUSPEC(1-3) with 0 tasks running
これで、分離された「シールド」(ユーザーcset)があり、コア0はそれ以外のもの(システムcset)用です。
よし、これまでのところよさそうだ。では、を見てみましょうhtop
。プロセスはすべてCPU 0に移行されているはずです。
え?一部のプロセスは、シールドされたコアで実行されているように示されています。htopにバグがあるというケースを除外taskset
するために、シールドに表示されているプロセスのアフィニティマスクを調べてみました。
多分それらのタスクは移動できませんでしたか?CPU3(シールド内にあるはずです)で実行されていると示されている任意のプロセスを取り出しhtop
て、システムのcgroupに表示されるかどうかを確認しますcset
。
$ cset shield -u -v | grep 864
root 864 1 Soth [gmain]
vext01 2412 2274 Soth grep 864
うん、それはによるとシステムcgroupで実行されていますcset
。だから、htop
とcset
反対します。
ここで何が起こっているのでしょうか?私は誰を信頼しますか:CPUアフィニティ(htop
/ taskset
)またはcset
?
あなたcset
とアフィニティを一緒に使用することは想定されていません。おそらくシールドは正常に機能しており、アフィニティマスクとhtop
出力は無視する必要があります。いずれにしても、これは混乱を招きます。誰かが光を当てることはできますか?
numactl
、cgconfig
andとcgrules
/ cgred
を使用して、あなたがやっていることを合理化します。これらはDebianで使用できる場合があります。