web-dev-qa-db-ja.com

KVM / CentOS7のCPUピニング戦略

XenからKvmに移行しています。

Xenでは、ホストCPUをゲストVMに簡単に固定でき、ホストCPUを "dom0"にも固定できました。

Kvmでは、ホストのCPUをゲストのVMに簡単に固定することもできますが、私の知る限り、ホストOSで実行されているアプリケーションがこれらのCPUを使用することを妨げるものはありません。 ホストで実行されているプログラムが枯渇する、またはゲストの待ち時間が長くなるのを防ぎたい

手動で複雑なcgroupポリシーを実行することもできますが、おそらくlibvirt/centos7の設定が不足しているだけでしょうか?

また、ゲスト用の「エミュレータピン」設定もあります。 「エミュレータ」を専用のホストCPUに固定する必要がありますか、それともゲストCPUに制限する必要があります目標は、ゲストの待ち時間をできるだけ制限することです

3
Olivier S

私があなたの質問を正しく理解した場合、達成したいことは、ハイパーバイザーを制限して、ハイパーバイザーが独自のプロセス、割り込み処理などすべてに単一のCPU /コア(または限られた数)のみを使用できるようにすることです。また、他のすべてのコアはlibvirtによってゲストシステムに割り当てることができます。

比較的単純なisolcpusブートパラメータを使用すると、1つ以上のCPUをスケジューラから分離できます。これにより、スケジューラーがこのCPUでユーザー空間スレッドをスケジュールするのを防ぎます。

つまり、ハイパーバイザーの/etc/default/grubセット:

GRUB_CMDLINE_LINUX="... quiet isolcpus=0,1"

ハイパーバイザー上のユーザースペースプログラムがコア> 1を使用するのを防ぐ必要があります。Libvirtは仮想サーバーを残りの空きコアに固定できます。

isolcpusブートパラメーターでも、すべての割り込みがそれらのコアに制限されることが保証されているかどうかはわかりません。それ以外の場合、割り込みには、割り込み要求を処理するプロセッサを定義する独自のアフィニティプロパティsmp_affinityもあります。特定の割り込み要求の割り込みアフィニティ値は、関連する/proc/irq/irq_number/smp_affinityファイルに保存され、デフォルトは/proc/irq/default_smp_affinityで設定されます。 smp_affinityは、システム内のすべてのプロセッサを表す16進数のビットマスクとして格納されます。デフォルト値はfです。これは、割り込み要求をシステム内の任意のプロセッサで処理できることを意味します。この値を1に設定すると、プロセッサ0のみが割り込みを処理できます。


RHELとCentOS 7のプロセッサとスケジューリングアフィニティを制御するツールは tuna と呼ばれます

5
HBruijn

Linuxでは、プロセスでホスト内の特定のCPUのみを使用する場合、 taskset コマンドが役立ちます

2つのCPUで新しいプログラムを実行する:

taskset -c 0,2 /home/app/myprogramm

すでに実行中のプロセスのCPUアフィニティを変更するには:

taskset -p -c 0,2 <pid_of_your_proccess>

kvmにはdom0がなく、kvmカーネルモジュールがあるため、すべてがカーネルに統合され、特権ドメインとしてdom0を持っているというxenとは異なり、カーネルが実行するプロセスを固定できます。

enter image description here

1
c4f4t0r

isolcpusは廃止されました 非推奨

          [Deprecated - use cpusets instead]
          Format: [flag-list,]<cpu-list>```

cpusetlibvirtとともに使用します

1
Stuart Cardall