手当たり次第に書くんだ

飽きっぽいのは本能

CPU pinning を外すと何が変わるのか – VM を専有から共有へ戻す設計

CPU pinning を外すことは、単なる性能 tuning の取り消しではありません。VM の実行資源を、専有に近い状態から host scheduler による共有実行へ戻す設計変更です。

平均 throughput がほとんど変わらなくても、tail latency、jitter、packet drop、性能の再現性、障害切り分けの前提は変わる可能性があります。特に NFV、仮想 router、仮想 firewall、低遅延 workload では、変更前後を同じ条件で測定する必要があります。

CPU pinning が決めていること

状態実行モデル運用上の特徴
pinning ありvCPU の実行先を限定する競合範囲を読みやすいが、scheduler の自由度は下がる
pinning なし許可された CPU pool で共有する空き CPU を使いやすいが、他 workload の影響を受ける
isolated CPU と併用host の通常処理から CPU を分けるvCPU 以外の thread と IRQ も含めた設計が必要
overcommit と併用複数 vCPU が物理 CPU を共有するrun queue と待ち時間の変動を監視する

pinning は VM を必ず高速化する設定ではありません。改善したい指標と競合させたくない処理を決め、実行場所を限定する手段です。解除する場合は、その限定をどこまで戻すのかを明確にします。

外す対象を分けて確認する

対象役割解除時の注意
vcpupinvCPU thread の affinity一部の vCPU だけ残さず、全 vCPU を確認する
emulatorpinQEMU emulator thread の affinityvCPU だけ解除すると補助処理の配置方針が残る
iothreadpinQEMU I/O thread の affinitystorage I/O の競合範囲が変わる
numatuneゲストメモリの NUMA policyCPU だけ共有化しても memory policy は別に残る
cpuset / isolated CPUhost 側の実行可能 CPUVM の XML だけでは host の予約 CPU は戻らない
capacity reservation運用上の専有枠監視、配置、台帳、課金の前提も更新する

vcpupin を削除しただけで、完全に共有実行へ戻ったとは限りません。emulator thread、I/O thread、NUMA memory policy、host の cpuset、IRQ affinity、予約 CPU を別々に確認します。

変更前の live 設定と永続設定を記録する

実行中の設定と次回起動時の設定は一致しているとは限りません。変更前に両方を保存し、CPU topology と NUMA node の対応も記録します。

virsh dumpxml vm01
virsh dumpxml vm01 --inactive
virsh vcpuinfo vm01
virsh vcpupin vm01 --live
virsh vcpupin vm01 --config
virsh emulatorpin vm01 --live
virsh emulatorpin vm01 --config
virsh numatune vm01
lscpu -e=CPU,NODE,SOCKET,CORE,ONLINE
numactl --hardware

--live は実行中の domain、--config は永続設定を対象にします。live だけを変更すると再起動後に戻り、config だけを変更すると実行中の VM には直ちに反映されません。

XML から削除する範囲を確認する

次は vCPU と emulator thread を固定している例です。共有実行へ戻す場合は、対象となる pinning 要素を永続 XML から削除します。ただし、cputune 内に quota、period、shares など他の制御がある場合は、cputune 全体を削除しません。

<cputune>
  <vcpupin vcpu='0' cpuset='2'/>
  <vcpupin vcpu='1' cpuset='3'/>
  <emulatorpin cpuset='0-1'/>
</cputune>

NUMA memory policy を残すかは別の判断です。CPU affinity を広げても numatunestrict policy が残れば、memory allocation は指定 node に制約されます。CPU とメモリを同時に変更すると原因を追いにくいため、段階を分けます。

共有実行で変わること

観点pinning あり解除後
scheduler実行先が限定されるCPU pool 内で実行先を選びやすい
競合固定先の処理と競合する他 VM と host process の影響範囲が広がる
tail latency条件を固定しやすい瞬間的な待ち時間が増える可能性がある
capacity専有に近い CPU 枠で数える共有 pool と overcommit ratio で数える
migration移行先の CPU map を合わせる配置の自由度を上げやすい
障害解析CPU ID と競合相手を追いやすい時刻ごとの co-tenant と run queue も確認する

外してよい VM と残す VM を分ける

判断条件
解除を検討する一般的な業務 VM で、集約率と migration の柔軟性を優先する
解除を検討する現状の CPU 使用率が低く、競合負荷試験でも SLO を満たす
残す候補p99 latency、jitter、packet loss に明確な上限がある
残す候補DPDK、vhost-user、SR-IOV、NFV で CPU と NIC queue を対応付けている
残す候補性能保証の契約や専有 capacity の前提がある
再設計する固定 CPU が他 VM と重複し、専有の前提が成立していない

パブリック cloud では物理 CPU の詳細が見えなくても、dedicated host、専有 instance、placement、CPU overcommit の選択が同じ判断に関係します。制御できる範囲と性能保証の境界を確認します。

capacity を共有 CPU pool で再計算する

解除前の capacity を固定 CPU 数だけで管理していた場合、その数をそのまま共有 pool の余力とはみなしません。物理 core、SMT sibling、host 用 CPU、既存 vCPU、overcommit ratio、通常負荷と peak 負荷を使って再計算します。

  • 物理 core と SMT thread を別の単位として記録する
  • host OS、QEMU、IRQ、監視処理の headroom を残す
  • 平均 CPU 使用率だけでなく run queue と steal を確認する
  • 障害時に VM が片側 host へ寄った状態でも SLO を満たせるか確認する
  • 固定 CPU の解放後に別 VM を詰め込みすぎない

単独試験と競合負荷試験を分ける

VM 単独の benchmark だけでは、共有実行へ戻した影響を評価できません。変更前後で同じ workload を実行し、さらに同じ host の別 VM や host process に負荷を加えた状態を比較します。

virsh domstats vm01 --cpu-total --vcpu --memory
mpstat -P ALL 1
pidstat -u -t 1
numastat -c
cat /proc/interrupts
試験確認すること
baseline変更前の throughput、p50、p95、p99、drop、CPU 使用率
解除後の単独負荷pinning 以外の条件を変えず、同じ時間と request 数で比較する
co-tenant 負荷別 VM の CPU 負荷で latency と jitter が許容範囲にあるか
I/O 併用softirq、I/O thread、packet drop、storage latency の変化を見る
再起動後永続設定が反映され、同じ結果を再現できるか
migration 後移行先でも NUMA と capacity の条件を満たすか

平均値と tail latency を一緒に見る

平均 throughput が維持されても、p99 latency や jitter が悪化すれば、低遅延サービスでは同じ品質とはいえません。CPU 使用率に加えて、run queue、steal、context switch、softirq、packet drop、retransmission を同じ時刻軸で確認します。

  • p50、p95、p99 latency と最大値
  • throughput、packet per second、request per second
  • host CPU、guest CPU、steal、run queue
  • softirq、IRQ、network drop、retransmission
  • NUMA remote access と memory pressure
  • 同じ host で動く VM と batch job の負荷

ロールバック条件を変更前に決める

変更後に判断を迷わないよう、SLO と capacity の閾値を先に決めます。p99 latency、packet drop、throughput、CPU wait のいずれかが許容値を超えた場合は、保存した XML と CPU map を使って元の affinity へ戻します。

ロールバックでは vcpupin だけでなく、emulatorpiniothreadpinnumatune、host の isolated CPU、IRQ affinity まで対象を照合します。live と config の片方だけを戻さないことも重要です。

よくある失敗

失敗問題確認すること
vCPU pinning だけを外す補助 thread と memory policy が残るemulator、I/O、NUMA、cpuset
live だけを変更する再起動後に元へ戻るlive と config の差分
config だけを変更する実行中の VM は旧設定のまま適用時刻と再起動計画
平均値だけで合格にするtail latency と jitter を見落とすp95、p99、最大値、drop
単独負荷だけで試すnoisy neighbor の影響が分からないco-tenant 負荷試験
解放した CPU をすぐ埋める障害時と peak 時の余力がなくなるheadroom と縮退 capacity

まとめ

CPU pinning の解除は、VM を遅くするか速くするかだけの話ではありません。実行資源を専有に近い状態から共有実行へ戻し、scheduler の自由度を上げる代わりに、他 workload との競合範囲と性能変動の可能性を広げます。

最初に live / config の affinity、NUMA memory policy、host の予約 CPU を記録します。その後、capacity を共有 pool として再計算し、単独負荷と co-tenant 負荷で tail latency まで比較します。解除対象、合格基準、ロールバック条件を一組で管理することが、安全に共有実行へ戻すための要点です。

関連する記事
CPU pinning を外すと何が変わるのか – VM を専有から共有へ戻す設計

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る