web-dev-qa-db-ja.com

Precise 12.04 AMD64で動作するisolcpusカーネルパラメーターを取得する方法

2つのIntel E5645を搭載したホストでいくつかのCPUを予約しようとして、このようなものをテストしてきましたが、何らかの理由で動作させることができません。私が従ったステップ:

  1. / etc/default/grubを編集して、isolcpus = 0,1をGRUB_CMDLINE_LINUX_DEFAULTに追加しました

    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash isolcpus=0,1"

  2. Update-grubを実行します

  3. リブート

その後、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

5
rubiojr

BIOSでSMT(ハイパースレッディング)を無効にし、電源を入れ直し、HTをオフにして再度テストし、isolcpusが正常に機能するようにします。

BIOSで再有効化されたSMTは、電源を入れ直しても、期待どおりに機能します。

間違いなくあなたが期待できる最良の答えではありませんが、それでも私にとってはうまくいきました。

4
rubiojr

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
1
Pierre

実際、isolcpusは(私のテストでは)AMDとIntel CPUで異なる動作をするようです。

Kernel: 4.10.0-38-generic x86_64 (64 bit)両方

/etc/default/grubisolcpus=2GRUB_CMDLINE_LINUX_DEFAULT= lineを追加しました。これはOPと同様です。次にSudo update-grubと再起動します。

  • ハイパースレッディングを備えたIntelコアi7デュアルコアでは、ps -eF | grep " 2 "は、ハイパースレッド2で開始される非常に少数のルート所有プロセスのみを示します(それらはすべてCMDの後に/ 2を持っているようです)。

  • ハイパースレッディングのないAMDクアッドコアでは、多くのルート所有プロセスがコア2で開始されます(ほとんどの場合、CMDの後に/ 2はありません)。

これはおそらく修正されるバグですか、それとも機能ですか?

0
Graham