読者です 読者をやめる 読者になる 読者になる

VirtualBox + CentOS6.5 + Mac で 仮想CPUの数を増やすと SSHのシェル操作が遅い - その2

前回の続きエントリ です

https://blogs.oracle.com/LetTheSunShineIn/entry/running_perf_top_on_virtualbox に書かれていた設定にすると smp_affinity を変えなくてもシェルプロンプトのキー操作のレスポンスが改善しました

I thought high kernel CPU was caused by "acpi_pm_read". I googled and got some hints and
shut down the VM and changed the setting.

$ vboxmanage modifyvm Node01 --hpet on
$ vboxmanage modifyvm Node01 --acpi off

カーネルのクロックソースを ACPI から HPET にするとのことです。

Vagrantfile だとどう書くの?

Vagrantfile だと下記のように設定します

  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--cpus", 4]      # 適当に CPU 増やす
    vb.customize ["modifyvm", :id, "--hpet", "on"]   # ↑ のブログに書いてある
    vb.customize ["modifyvm", :id, "--acpi", "off"]  # ↑ のブログに書いてある
  end

上記ブログの内容は、私が調べているのとはまた別の問題のようですが ボトルネックの原因はおんなじなのかなー。HPET と ACPI の説明は 本の虫: 100ナノ秒ぐらいの分解能をもつクロック実装 が分かりやすいなと思いました。

perf で調べてみてます

この設定によってどんな風にボトルネックが解消されたのかを perf で調べてみてるのですが 難しくて分かりません ... https://gist.github.com/hiboma/9865994 に perf の結果をつらつらと並べています 。何か分かったら続きを書きます

追記

/sys/devices/system/clocksource/clocksource0/current_clocksource でクロックソースを確認できるのを思い出したので調べてみました

hpet on + acpi off

オラクルブログさんに書いてあった hpet on + acpi off 設定ではクロックソースが jiffies になってますね。aれー hpet であるべきだと思うんだけど、これでいいんだろうか?

$ cat /sys/devices/system/clocksource/clocksource0/current_clocksource 
jiffies

hpet on + acpi on

試しに hpet on + acpi on にしてみると hpet になりました。キー操作は快適です

$ echo hpet | sudo tee /sys/devices/system/clocksource/clocksource0/current_clocksource 
hpet

hpet on + acpi on の時は acpi_pm も使えるようです。available_clocksource で選択できるクロックソースを確認できます

$ cat /sys/devices/system/clocksource/clocksource0/available_clocksource 
hpet acpi_pm 

acpi_pm に変えると、もたつくような … perf で計測せねばー

$ echo acpi_pm | sudo tee /sys/devices/system/clocksource/clocksource0/current_clocksource 
acpi_pm

デフォルトでは acpi_pm がもっさりの原因

Vagrantfile で特に何もいじらない場合デフォルトで hept off + acpi on となっており、クロックソースは acpi_pm となります(デフォルト)。これがもっさり原因のようです。

$ cat /sys/devices/system/clocksource/clocksource0/current_clocksource 
acpi_pm

acpi_pm だとなんで駄目なんかなー