マシンの起動時にハイパースレッディングを無効にするスクリプト...
ハイパースレッディングを無効にするには、マシン/etc/rc.localにスクリプトを含めます。完全にクリーンではありませんが、インストールが簡単で、CPUアーキテクチャに依存せず、最新のLinuxディストリビューションで動作するはずです。
nano /etc/rc.local
# place this near the end before the "exit 0"
for CPU in /sys/devices/system/cpu/cpu[0-9]*; do
CPUID=$(basename $CPU)
echo "CPU: $CPUID";
if test -e $CPU/online; then
echo "1" > $CPU/online;
fi;
COREID="$(cat $CPU/topology/core_id)";
eval "COREENABLE=\"\${core${COREID}enable}\"";
if ${COREENABLE:-true}; then
echo "${CPU} core=${CORE} -> enable"
eval "core${COREID}enable='false'";
else
echo "$CPU core=${CORE} -> disable";
echo "0" > "$CPU/online";
fi;
done;
これはどのように機能しますか?
Linuxカーネルの情報とコントロールは、最新のLinuxディストリビューションの/ sysディレクトリ内のファイルとしてアクセスできます。例えば:
/ sys / devices / system / cpu / cpu3に
は、論理CPU 3のカーネル情報とコントロールが含まれています。
cat / sys / devices / system / cpu / cpu3 / topology / core_id
は、この論理CPUが属するコア番号を表示します。
echo "0"> / sys / devices / system / cpu / cpu3 / online
により、論理CPU 3を無効にできます。
なぜ機能するのか?
正確な理由はわかりませんが、ハイパースレッディングをオフにすると、システムの応答性が向上します(i5ノートブックおよび60以上のコアを備えた大規模なXeonサーバー)。CPUごとのキャッシュ、CPUごとのメモリ割り当て、CPUスケジューラの割り当て、プロセスの優先度の複雑な繰り返しに関係していると思います。ハイパースレッディングの利点は、それを使用する方法を知っているCPUスケジューラーを作成する複雑さのために重要だと思います。
私にとって、ハイパースレッディングの問題は、論理コアと同じ数のCPU集中型スレッドを開始すると、CPU集中型タスクの高速コンテキストスイッチが使用されますが、ハイパースレッドがCPU集中タスク。一方、CPUを集中的に使用するスレッドを物理コアと同じ数だけ起動すると、それらのタスクへのコンテキストスイッチやバックグラウンドタスクの高速コンテキストスイッチがなくなります。良いように見えますが、バックグラウンドタスクは無料の論理プロセッサを検出し、ほとんど仲介なしで実行されます。リアルタイムのパフォーマンスのようです(-20)。
最初のシナリオでは、ハイパースレッディングはusellesです。通常の処理でハイパースレッディングを最大にしたため、バックグラウンドタスクは高価なコンテキストスイッチを使用します。2つ目は、CPUパワーの最大50%がバックグラウンドタスクよりも優先されるため、受け入れられません。
私が話している「CPU集中型」タスクは、人工知能データマイニングおよび承認サーバー(私の仕事)です。安価なコンピューターとクラスターでのBlenderのレンダリング(将来の家をスケッチするため)。
また、これは当て推量です。
私はより良い印象を持っていますが、そうではないかもしれません。
sysbench --num-threads=1 --test=cpu run
、異なるnum-threadsとHTのオンとオフを使用すると、HTを無効にすると、スレッドが多い場合にパフォーマンスが低下し、スレッドが1つしかない場合でもHTをオフにするメリットはありません。したがって、そのままにしておくことをお勧めします。最適です。