64ビット時代の「バランスド・システム」真・Dr. K's SQL Serverチューニング研修(5)(3/3 ページ)

» 2011年01月25日 00時00分 公開
[熊澤幸生株式会社 CSK Winテクノロジ]
前のページへ 1|2|3       

マルチコアプロセッサを使うときの注意

 64ビット化と歩調を合わせるように、x86プロセッサはマルチコア化が急速に進みました。今では薄型のノートパソコンもマルチコアのプロセッサを搭載するようになっています。

 サーバ用プロセッサのマルチコア化の勢いはすさまじいものがあり、現在では12コアのx64プロセッサも入手できるようになりました。それに伴って、SQL Serverが扱えるプロセッサコアの数もかなり増えました。

 プロセッサコアが増えると、複数のコアで同時並行的に処理を進められるので、性能を大幅に上げることが可能です。しかし、よいことばかりではありません。マルチコアプロセッサを活用するには、それなりの準備が必要なのです。

 連載第1回で解説しましたが、SQL Serverは内部でSQL OSという専用OSを持っています。SQL Serverで動作するプロセスやスレッドはすべてSQL OSが制御しています。スレッド切り替え時にレジスタ値などのコンテキストを退避させる領域をワーカースレッドスタックと呼びます。

 ワーカースレッドスタックは1スレッドに1つずつ生成されます。ここで問題になるのは、ワーカースレッドスタックもメモリを消費するということです。SQL Serverの32ビット版では、ワーカースレッドスタックの大きさは1スレッド当たり512KBでした。それが、64ビット版(x64)になると1スレッド当たり2MBまで大きくなりました。

 SQL Serverの設定パラメータの1つに「Max Worker Threads」というものがあります。これは、SQL Serverのサービスが起動している時に生成可能なスレッドの最大値を指します。この値は32ビット版と64ビット版で異なり、プロセッサコアの数に応じて増えていきます。下の表はプロセッサコアの数と生成可能なスレッドの最大の既定値を示したものです。

プロセッサコアの数 32ビット版 64ビット版
4個以下 256 512
8個 288 576
16個 352 704
32個 480 960
64個 - 1472
128個 - 4480
表1 SQL Serverが生成できるスレッドの最大値と、ハードウェアが搭載するプロセッサコアの関係

 プロセッサコアの数にかかわらず、32ビット版よりも64ビット版の方が多くのスレッドを生成できることがお分かりいただけるでしょう。そして、ここで思い出してほしいことが、ワーカースレッドスタックの大きさです。32ビット版は1スレッド当たり512KBで、64ビット版は1スレッド当たり2MBでしたね。

 つまり、プロセッサコアの数を増やせば増やすほど、多くのメモリを消費する可能性があり、その傾向は64ビット版に顕著だということです。例えば、128コアのハードウェアでは、最大で4480スレッドが動作します、1スレッド当たりのワーカースレッドスタックの大きさが2MBですので、およそ10GBのメモリをワーカースレッドスタックだけで消費するのです。128個ものプロセッサコアを搭載したハードウェアを使うには、それなりに大量のメモリが必要になるということです。

 ちなみに、Max Worker Threadsの値はユーザーが指定することも可能です。SQL Server Management Studioのオブジェクトエクスプローラでサーバ名を右クリックし、「プロパティ」を左クリックしてください。すると、「サーバーのプロパティ」というダイアログが現れます。ダイアログ左側にある「プロセッサ」という項目をクリックすると、下図のような画面になります。

図2 Max Worker Threadsの値はSQL Server Management Studioで変更できる 図2 Max Worker Threadsの値はSQL Server Management Studioで変更できる

 ここにある「ワーカースレッドの最大数」の数値を変更すれば、Max Worker Threadsの値を変えられます。初期状態では、「0」になっていますが、これは、SQL Serverが自動的に決定するという意味です。しかし、よほど特別な事情がない限り、この設定は変更するべきではありません。あくまで、標準の設定値を知っておいて、それに合わせたハードウェアを構成することが大切です。

 メモリ容量とプロセッサコアの最適な数の組み合わせは、実際にハードウェアに触れて設定してみないとなかなか身に付かないものです。

 上に挙げたMax Worker Threadsの表は、実はMSDNにもあります。しかし、プロセッサコアが32個の場合までしか記述がありません。64個、128個の数値は、お客様が購入した巨大なサーバを使わせていただいて、私が確認した数値です。こうして、めったに触れる機会もないような高価なハードウェアを使わせてくれるお客様がいることで、私は自身の技術を磨くチャンスをいただけているのだと感謝しております。

 次回は、クエリをプリペアード(パラメータ化クエリ)にしていく方法と留意点など、クエリチューニングについてお話ししたいと思います。

著者紹介

株式会社 CSK Winテクノロジ

熊澤 幸生(くまざわ ゆきお)

技術フェロー特別役員

メインフレーム環境で20年近くデータベース関連のITプロジェクトを数多く経験。また1979年から1983年まで米国に駐在し、データ主導型システム設計を実プロジェクトで学ぶ。1994年、アスキー・ネットワーク・テクノロジー(現、CSK Winテクノロジ)設立に参加し、SQL Server Ver 4.2からSQL Server 2000までシステム構築、教育にかかわってきた。

マイクロソフトMVP Data & Storage SQL Server(2007年4月から)。

2008年7月より、兼務形式で、マイクロソフト?SQL Server 技術顧問に就任中。



前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。