SQL Serverは一般的にチューニング不要のデータベースと認識されている。しかし基幹系業務システムへの導入が進むにつれて、パフォーマンス・チューニングのニーズは急速に高まってきた。そこで本記事では、日本におけるSQL Serverコンサルタントの第一人者、熊澤幸生氏にSQL Serverチューニングのノウハウを語っていただくことにした。インタビュアーはSQL Serverへの造詣が深いITジャーナリスト、工藤淳氏が担当する。(編集部)
今回と次回は本連載の総仕上げという意味で、SQL Serverのエンジンの話をしていきましょう。具体的には、UMS(User Mode Scheduler)の話をかなり深くまで掘り下げて、UMSとハードウェア上のリソースの関係を紹介しようと思います。つまり、「ある程度の規模のデータベースサーバを立てようと思った場合に、CPUの数は最低限いくつあればいいのか」といったことを、アーキテクチャのレベルから理解していただこうというわけです。
急速に進化するCPU技術とSQL Serverの関係を学ぶ
最近はインテルやAMDから、従来のIA32の命令セットと拡張64bitの命令セットの両方を併せ持つ、x64という新しいアーキテクチャに対応したCPUが増えてきました。なおかつ、デュアルコア・プロセッサも当たり前になってきました。例えばAMDの「Opteron」や、2006年6月にインテルが発表した開発コード名「Woodcrest」で知られるデュアルコアの「Xeon」(5100番台)などです。また、Woodcrestのチップをさらに2つ合わせて、4コアで1ソケットというクアッドコアのXeon(5300番台)も2006年11月に発表されました。
このようにCPUが急速な進化を遂げていく状況の中で、SQL Serverのチューニングを行うエンジニアは、CPU技術の変化や仕組みを学んでいかなくてはなりません。というのも、SQL Serverではトランザクションの処理に際して、基本的にはCPU単位でUMSが動作する仕組みになっているからです。つまり、SQL Serverのパフォーマンスを引き出す最適なハードウェアを選ぶには、CPUの構造や動作について熟知していなければならないのです。
では、そもそもUMSとはどういうものか、SQL Server 2000のアーキテクチャを参考に見てみましょう(図1)。
図1 SQL ServerのOS機能であるSQL OS:User Mode Scheduler
UMSはプロセッサごとに生成される。図では4つのCPUに対して4つのUMSが生成されていることを示している。各スレッドは1つのUMSに割り当てられると、以降は同じUMSのみで動作する。(連載第1回の図1を再掲)
SQL Serverでは、基本的に1つのCPUに対して1個のUMSが割り当てられます。SQL Serverをインストールすると、そのマシン上に搭載されているCPUの数を、例えば4CPUマシンならば4つというように、自動的にSQL Server自身が認識します。そして、認識したCPUの数に合わせたUMSを立ち上げてくれるのです。
ここでちょっと注目してほしいのが、インテルのXeonプロセッサに代表されるHTT(ハイパースレッドテクノロジ)を搭載したCPUです。
インテルアーキテクチャのCPUは、さまざまな演算を処理するALU(Arithmetic Logic Unit:演算論理装置)の内部に、命令実行用のマイクロコードを持っています。マイクロコードとは、CPUが命令(インストラクション)を実行するのに必要な一連の手続きを記述したものです。マイクロコードはパイプラインを経由してレジスタ/アドレススタック領域のデータ/命令を処理します。一般のCPUであれば、仮想アドレス上の命令コードをいったんL1〜L3にキャッシュして、このデータ/命令をレジスタ/アドレススタック領域に読み込んで処理するという手順を踏んでいるのです。ところがHTTというのは、レジスタ/アドレススタック領域を複数持っていて、あるスレッドでCPUがアイドリングになるとこの部分を切り替えて別のスレッドを処理することで、疑似的にCPUが複数あるように見せているのです(図2)。
HTTの有効/無効はBIOSで設定できるようになっています。ハードウェアの導入時にBIOSをセットすることで、CPUのソケットが持っているハイパースレッド機能のオン/オフが切り替えられるのです。
これをオンにすると、4つの物理CPUのマシンでもSQL Serverからは8つのCPUに見えます。するとSQL Serverは、UMSのスケジューラを8つ起こしてくれます。この結果、物理的には4つのCPUしかないにもかかわらず、HTT機能オフに比べて120%くらいのパフォーマンスが出ます。ならば難しいことを考えずに、常時HTTオンでよいじゃないかと思われるかもしれませんが、そうばとかりは限りません。
確かにSQL ServerをHTTの入ったCPUで稼働させれば、1つのCPUがn個に見えます。ただし、HTTでは命令の実行ユニットが複数あるわけではないので、多少パフォーマンスは上がっても、しょせんは仮想メモリと同じで絵に描いたもちです。
さらに、最近のSQL Server 2005に関して米マイクロソフト社の技術者と話すと、「HTTはオフにしておいた方が、全体のパフォーマンスが出る」という意見も聞きます。これはデュアルコアなどが出てきてますます顕著になってきています。アルゴリズムユニットをコアとして別個に複数持っているCPUが出てきたこともあって、単にレジスタ/アドレススタック領域だけを別個にして、見せ掛けのCPUにするなんてオーバーヘッドだというのです。だからもう使わない方がいいという意見ですね。確かにそういうのも、1つの考え方だと思います。
最近は、マルチコア技術も普及してきています。これは1つのCPUの中に、アルゴリズムユニットからレジスタのスタック領域、キャッシュまで複数存在するわけです。AMDのOpteronやインテルのWoodcrestがそれです。また最近、Itanium 2の「Montecito」という新しい製品が出ました。これがすごくて、1つのチップの中にCPUの物理コアが2個あり、しかもその中にHTTまで入っています。このため1個のCPUが、SQL Serverからは4つの論理CPUに見えたりするわけです。その結果、4つのUMSでユーザープロセスのパラレル処理ができるわけです。
このようにCPUがどんどん進化していっても、SQL Serverにはそれがちゃんと見えるようになっているのが、お分かりいただけたでしょうか。なお、次世代のSQL Server2005になると、さらにそれが進化しています。(次ページへ続く)
Copyright © ITmedia, Inc. All Rights Reserved.