Kodama's home / tips.

vmware ESX サーバ での 仮想 PC の時刻ずれの問題

vmware ESX サーバ で負荷が高いと, 時刻がずれたり, 応答性が悪くなったりする. 特に, タイマー割り込みを取り落とすために ntp で同期できないほど時刻の進行が不規則になる. Linux 使う場合の対策を考えてみる.

症状

Vmware ESX サーバの仮想マシンで Linux を動作させた場合
  1. 時刻が遅れる:
    負荷が高い場合, 時刻の進行が不規則になる.
  2. 応答性が悪い:
    コンソールやネットワークからの要求に対して, 応答が悪いためサービスに支障が出る.
Linux 以外の OS でも同様の問題が起こり, メーカーの情報では vmware tools をインストールすることで対処することになっている.

原因

Linux2.6 では 1000回/秒 のタイマー割り込みで時刻を管理することがデフォルトになっている. しかし, 仮想マシンの割り込み処理はコストが高いため, 応答が追い付かなくなり, 割り込みを取り落としてしまう. また,タスクの切替えのタイミングを失うため処理が滞る.

CPU の不足と考えて, 割り当てる仮想CPU数を増やすと, より状況が悪化してしまう. CPU を増やすことで, SMP 管理のためのコストが増え, 応答性が悪くなる. カーネルのタイマー割り込みが 1000×(CPU数+1)回/秒 であるため.

対策

割り込みの取り落としを避け, タスク切替えを効率化することで対処する. 以下の対策のうち適当な組合せで対策をとり, ntp で時刻を同期させる.
  1. タイマー割り込み回数を減らす:
    Linux カーネル コンパイル時に Timer frequency を 100(毎秒100回) に設定する.(CONFIG_HZ_100) Timer frequency は 100, 250, 300,1000 などに設定可能. デフォルトでは応答性を高めるため 1000 になっているが, 仮想マシンの場合は減らす方が良い.
  2. タイマー割り込み回数を減らす:
    Linux カーネルの版に依っては, 上記のようにカーネルをコンパイルする代りに, 起動オプションで与えることもできる. カーネルの起動オプションに divider=10 を与える. タイマー割り込み回数 100回/秒 になる.
  3. 割り込み取りこぼしの補正:
    起動時に Linux のカーネルオプション clock=pit を与える.
  4. CPU 数を減らす: 仮想マシンへの割り当て CPU 数を減らす.
    SMP カーネルでは 1000×(CPU数+1)回/秒 のタイマー割り込みが発生する. タイマー割り込みとタスク切替えの負荷で, 応答性が劣化し, 負荷が高くなる. この場合, CPU 数を増やすと逆に応答性が悪くなってしまう.
  5. CPU 数を減らす:
    起動時に Linux のカーネルオプションを設定し CPU を1個だけにする. nosmp noapic nolapic を追加. (注. SMP が必要な場合はこの項の手法は使えない.)
    例: カーネル オプションの例.
    kernel /vmlinuz ro root=/dev/sda1 ro divider=10 clocksource=acpi_pm clock=pit nosmp noapic nolapic
    
  6. vmware tools を使う:
    Linux カーネルにもパッチがあたるが内容は不明. カーネルの再コンパイルが必要.
  7. カーネルのプロセス処理モデルを変更する:
    Linux カーネル コンパイル時に Preemptible Kernel にする. この場合, 応答性は上がるが, CPU 効率は落ちる可能性がある事に注意.
    サーバでは CPU の利用効率を重視して No Forced Preemption を使う事が多い. これは, CPU の利用効率は高いが, プロセス切替えの応答性が悪くなる. そのため, 複数の要求に同時に応答する必要のあるネットワークサービスを行うサーバでは, 負荷が高い場合に処理を取り落としてしまう可能性がある. カーネル中での Preemption を有効にすることで, カーネルでブロックされる部分を減らすことができる. Voluntary Kernel Preemption 又は Preemptible Kernel の方が処理の取り落としが少ない

    割り込み処理に能力を食われるので, 処理効率とタスク切替えのトレードオフになるが, 最近のCPUの処理能力を考慮すると, 科学技術計算を目的とするような場合以外は, カーネルの Preemption を有効にする方が良いと思われる. 上記のタイマー割り込み回数を減らす対策と併用してバランスをとる.

    	  (make menuconfig の操作画面より Linux2.6.27.2の例)
    	  Preemption Model
    	  ( ) No Forced Preemption (Server)
    	  ( ) Voluntary Kernel Preemption (Desktop)
    	  (X) Preemptible Kernel (Low-Latency Desktop) 
    	  

コメント

vmware の仮想環境では運用の柔軟性に関しては十分に満足できる. 一方で, 障害の分析が困難になる等, 安定運用のためのノウハウ等に関してはまだ不足を感じる.
Kodama's home / tips.