[DBチューニングコンテスト とんがりナレッジ] CPUを100%活用する

11/27(金)に社内SQL Serverのチューニングコンテスト決勝戦が開催されました。
前回のOracleは2位でしたが、今回は優勝しましたのでその要因について紹介したいと思います。

今回はチューニングを始めるにあたって前回は何が良くて何が悪かったのかをまずは考えてみました。

  • 良かった点

    • マシンスペック??
  • 悪かった点

    • チューニング不足


悪かった点のチューニング不足については知識不足もあり、マテリアライズビューをしようとしなかったことが敗因の一つだと考えました。
SQL Serverにはインデックス付きビューというマテリアライズビューにあたる機能があります。
今回はインデックスビューを使用しましたが下手に使うよりはカラムナーストアインデックスの方が速かったため今回は割愛します。

良かった点に挙げているマシンスペック??は本来であれば同じ予算内でマシンを構築するルールのため存在しません。
実際に自分のマシンとほぼ同等の構成のマシンを使用している参加者もいます。
ではマシンスペックの差とはなんなのか?
TPC-HではCPU使用率が100%になることがあります。
その場合、一般的にはCPUリソースを100%活用できているということになるかと思います。
しかし

CPU使用率100%=CPUスペックを100%活かせている

とは限りません!

前回のOracleのチューニングコンテスト終了後に自分が理由がいまいち理解できなかったこともあり、ある実験をしました。

  • 実験内容

    • CPUのコアを100%使用する
  • 環境

    1. Hさんのマシン
      • OS : CentOS 5.7
      • CPU : Core i7 4790K
    2. soneetaのマシン(Cent OS)
      • OS : CentOS 6.2
      • CPU : Core i7 4790K
    3. soneetaのマシン(Arch Linux)
      • OS : Arch Linux
      • CPU : Core i7 4790K


soneetaとHさんのマシンには一点だけ大きく違う点がありますがCPUは共通でCore i7 4790Kです。
※ 厳密に言うとマザーボードも違うのですが今回の実験には関係ないことも今回のチューニングコンテスト終了後に確認しています。

  • 結果

    約2分後の状態

    1. Hさんのマシン
      h_cpu
    2. soneetaのマシン(CentOS)
      soneeta_cpu_archlinux

    3. soneetaのマシン(Arch Linux)
      soneeta_cpu_centos

  • 詳細

    1. Hさんのマシン
      • 起動時 : 4.0GHz
      • 負荷開始時 : 4.0GHz前後
      • 2分後 : 3.1GHzで安定
    2. soneetaのマシン(Arch Linux)
      • 起動時 : 4.0GHz
      • 負荷開始時 : 4.0GHzで安定
      • 2分後 : 4.0GHzで安定
    3. soneetaのマシン(Arch Linux)
      • 起動時 : 4.0GHz
      • 負荷開始時 : 4.0GHzで安定
      • 2分後 : 4.4GHzで安定



Core i7 4790Kは倍率ロックフリーモデルで定格クロック4.0GHzで状況に応じて最大4.4GHzまでクロックアップします。
この為、正しい動作は3のsoneetaのマシン(Arch Linux)のみになります。
それでは1,2の違いと2,3の違いとは何なのか?

1,2については先に挙げたハード面での1点の違いによるものです。
違いはCPUファンです。
HさんのマシンはCore i7 4790Kに付属するファンを使用、soneetaのマシンではReserator 3 Maxという簡易水冷ファンを使用しています。
倍率ロックフリーモデルの場合は通常時は定格クロックで動作し、CPUがビジーな状態になるとクロックアップしますがここに問題があります。
もしクロックアップした時にCPU温度が上がりすぎた場合にはどうなるか?
答えは簡単で当然クロックを維持できない為、クロックを下げるといった動作を取ります。
その時にクロックがどこまで下がるかというと、実は定格クロック以下まで下がってしまいます。
Hさんのマシンの場合には、付属のファンでは定格クロックの4.0GHzでもCPU温度が高すぎるため、定格クロックを下回ってしまったということになります。

2,3の違いはOSによるものでCPU周波数スケーリングの問題です。
Arch LinuxのWikipediaに記載されていますがLinuxでもカーネル3.4から必要モジュールが自動ロードされるようになっており、CentOS 5.7,6.2が対応していなかったため、倍率ロックフリーの機能を活かしきれず最大クロック数までクロックアップしません。


さて今回はSQL ServerのチューニングコンテストでしたがWindowsではどうでしょうか?

  • 実験内容

    • CPUのコアを100%使用する
  • 環境

    1. Kさんのマシン
      • OS : Windows Server 2016 CTP3
      • CPU : Core i7 4790K
      • CPUファン : 付属のファン
    2. Iさんのマシン
      • OS : Windows Server 2016 CTP3
      • CPU : Core i7 4790K
      • CPUファン : 虎徹 SCKTT-1000
    3. soneetaのマシン
      • OS : Windows Server 2016 CTP3
      • CPU : Core i7 4790K
      • CPUファン : Reserator 3 Max


  • 結果

    約3分後の状態

    1. Kさんのマシン
      k_cpu
    2. Iさんのマシン
      i_cpu

    3. soneetaのマシン
      soneeta_cpu




2,3は同等の結果でArch Linuxの場合と同等の状態で空冷のファンでも十分に冷却できていることがわかります。
驚きなのは1はCentOSのときより悪く2.2GHzまでクロックダウンしてしまっています。
さらにはCPU使用率も100%を維持できなくなってしまいました。
Oracleのチューニングコンテストのときから、オーバークロックの設定をしても速くならないとか逆に遅くなってしまうという話があったのはこの為だと考えられます。


それではCentOSとArch Linuxの違いのようにOSによる制限はあるのか?
Windowsでは電源オプションがそれにあたります。
powerplan

デフォルトではバランスになっているため高パフォーマンスに設定する必要があります。
Core i7 4790Kでバランスの場合には4.0GHz、高パフォーマンスにすると4.4GHzのクロックで動作します。


今回の教訓

  • CPUは冷やせ!
  • 想定通りのクロックで動作するか確認する!