2つのIntel E5645を搭載したホストでいくつかのCPUを予約しようとして、このようなものをテストしてきましたが、何らかの理由で動作させることができません。私が従ったステップ:
/ etc/default/grubを編集して、isolcpus = 0,1をGRUB_CMDLINE_LINUX_DEFAULTに追加しました
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash isolcpus=0,1"
Update-grubを実行します
その後、cat/proc/cmdlineは以下を明らかにします。
BOOT_IMAGE=/boot/vmlinuz-3.2.0-26-generic root=UUID=52cfedad-40be-41b9-9f88-c282a7ae3f24 ro quiet splash isolcpus=0,1 vt.handoff=7
ストレスを使用してテスト:
apt-get install stress && stress -c 24
Topを使用して監視し、1を押して個々のCPU統計を表示します。これまでのところ、スケジューラーからCPUが隔離されることはなく、すべてのCPUがストレスによって破壊されています。
Cpu0 : 99.7%us, 0.3%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu1 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu2 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu3 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu4 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu5 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu6 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu7 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu8 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu9 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu10 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu11 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu12 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu13 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu14 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu15 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu16 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu17 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu18 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu19 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu20 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu21 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu22 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu23 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
CentOS 6 x86_64で同じものをテストしましたが、期待どおりに機能します。
ランチパッドでUbuntuとLinuxのバグデータベースを検索しましたが、これまでのところ何も見つかりませんでした。
それは私が愚かであるか、何かを逃していますか?ヒント?
ありがとう!
参照:
http://www.kernel.org/doc/Documentation/kernel-parameters.txt
BIOSでSMT(ハイパースレッディング)を無効にし、電源を入れ直し、HTをオフにして再度テストし、isolcpusが正常に機能するようにします。
BIOSで再有効化されたSMTは、電源を入れ直しても、期待どおりに機能します。
間違いなくあなたが期待できる最良の答えではありませんが、それでも私にとってはうまくいきました。
isolcpusは、特定のユーザー空間アクティビティからのみ分離され、カーネルアクティビティ(ウォッチドッグ、kworkers、Linuxスタックなど)からCPUを分離しません。さらに、CPU 0(USBディスカバリー、ACPIタイマー設定、WRMSR/RDMSRディスパッチなどの多数の専用アクティビティがあります。これは、すべてのドライバーがデフォルトで有効になっている標準ディストリビューションで2%になる傾向があります)
すべてのスレッドをコア番号でソートして表示することにより、どのプロセスがどのコアで実行されているかを確認できます。
ps -aFeL | cut -c 48- | sort -n
割り込みアフィニティを変更しようとするために、/ proc/irq/*のアフィニティを確認および変更する必要もあります。
Cpusetツールを使用して、cpusを動的に節約し、Linuxカーネルタスクの「ほとんど」を削除できます。
の代わりに
taskset -c 3-7,11-15 program args
これを試して
Sudo apt install cpuset
cset set --list
cset shield -c 3-7,11-15
cset set --list
cset shield -e program -- args
そして、あなたは違いを理解することができます
ps -aFeL | cut -c 48- | sort -n
これら2つのコマンドを実行するとき
cset shield -e stress -- -c 16
stress -c 16
実際、isolcpus
は(私のテストでは)AMDとIntel CPUで異なる動作をするようです。
Kernel: 4.10.0-38-generic x86_64 (64 bit)
両方
/etc/default/grub
がisolcpus=2
にGRUB_CMDLINE_LINUX_DEFAULT= line
を追加しました。これはOPと同様です。次にSudo update-grub
と再起動します。
ハイパースレッディングを備えたIntelコアi7デュアルコアでは、ps -eF | grep " 2 "
は、ハイパースレッド2で開始される非常に少数のルート所有プロセスのみを示します(それらはすべてCMDの後に/ 2を持っているようです)。
ハイパースレッディングのないAMDクアッドコアでは、多くのルート所有プロセスがコア2で開始されます(ほとんどの場合、CMDの後に/ 2はありません)。
これはおそらく修正されるバグですか、それとも機能ですか?