XenからKvmに移行しています。
Xenでは、ホストCPUをゲストVMに簡単に固定でき、ホストCPUを "dom0"にも固定できました。
Kvmでは、ホストのCPUをゲストのVMに簡単に固定することもできますが、私の知る限り、ホストOSで実行されているアプリケーションがこれらのCPUを使用することを妨げるものはありません。 ホストで実行されているプログラムが枯渇する、またはゲストの待ち時間が長くなるのを防ぎたい
手動で複雑なcgroupポリシーを実行することもできますが、おそらくlibvirt/centos7の設定が不足しているだけでしょうか?
また、ゲスト用の「エミュレータピン」設定もあります。 「エミュレータ」を専用のホストCPUに固定する必要がありますか、それともゲストCPUに制限する必要があります? 目標は、ゲストの待ち時間をできるだけ制限することです。
私があなたの質問を正しく理解した場合、達成したいことは、ハイパーバイザーを制限して、ハイパーバイザーが独自のプロセス、割り込み処理などすべてに単一の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
と呼ばれます
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とは異なり、カーネルが実行するプロセスを固定できます。