パフォーマンスチューニングの応用概念 Part 1

Hiroshi Tomioka
(2009年4月28日 12:00) |

※このエントリーは、developerWorks : AIX and UNIXの「Advanced performance tuning concepts」を翻訳したエントリーのPart 1です。

最高のアプリケーションがあっても、それが適切に構成されていないホストの上で動いているのでは十分なパフォーマンスを出す事は出来ません。この記事では、パフォーマンスチューニングの4つの主要分野とそれぞれ何を見ればいいかを紹介したいと思います。それに加えて、Javaベースのアプリーションではガーベジコレクション・サイクルのようにパフォーマンスチューニングに影響を与える前提が存在します。この記事では、ガーベジコレクションに関して知っておくべきことについても紹介しようと思います。

あなたのサーバーには負荷をうまく処理するために変更出来る設定が多数あります。ただし、ファイルサーバーとデータベースサーバーではチューニングする箇所は異なりますし、2種類のアプリケーションサーバーがあったとしても、サーバーへの負荷の性質によってはチューニング方法が異なるかもしれません。チューニングには、サーバーの限られたリソースをOSやアプリケーションの別の部分に割り当てることにより、アプリケーションレスポンスを改善するという性質があります。次に紹介するのが、考慮すべき領域です。

  1. CPU(中央処理装置)
  2. メモリー
  3. ディスク(ディスクスペースとアクセス速度の両方)
  4. ネットワーク

これらの領域はしばしば相互に影響を与え合っています。例えば、メモリーをキャッシュに割り当てることでディスクアクセスを減らすことや、ローカルディスクから読み出すのではなくネットワーク越しにリソースアクセスをすることもあり得ます。この記事では、メモリについては、JVM(Java Virtual Machine)に特に焦点を当てたいと思います。JVMには独自のメモリ管理システムが存在し、あなたはそれを監視・構成しなければなりません。

CPU

サーバーのCPUは大部分の時間を処理の待ち時間に費やしています。その中でも最も多いのが、ディスクからデータが返されるのを待つことです。マルチタスキングでは、CPUが待ち状態の時間に他のことを処理させるようとします。そのため、より早いCPUを購入することは、CPUの処理待ちに費やしていた時間を有効活用することが出来ます。

vmstatコマンドは、システムがどの作業に時間を費やしているかをリアルタイムに分解して表示してくれます。また、sarコマンドは長期のモニタリングに適したツールです。これらのツールにより、CPUが大部分の時間をユーザー時間に費やしており、アイドルサイクルが低下し続けているのが確認出来たのであれば、次の一手を考えるべき時です。このシチュエーションでは、負荷を他のサーバーに振り分けるか、CPUのキャパシティを増やす必要があります。

負荷によっては、パラレルに処理させることが不可能な場合があり、複数サーバーに負荷を分散させたり、CPUを追加することでは解決しない場合があります。その場合は、より高速のCPUを投入し、問題になっている処理のコードをより少ないサイクルで動くように最適化するのに時間を費やして下さい。

メモリー

メモリーチューニングにはいくつかの項目が関連してきます。最も単純な方法は、アプリケーションがスワップ領域を使用することがないだけの十分なRAMを搭載することです。OSの仮想メモリではアプリケーションに対して実際にシステムに搭載している以上のメモリを割り当てることを可能にします。そして、メモリが不足した場合には、ディスク上の一時的な保存領域で補おうとします。メモリのページアウトとディスクからのページインはRAMに直接アクセスした場合と比べて著しく遅くなります。そのため、この動作は出来るだけ回避すべきです。

仮想メモリについては、チューニングが必須だと言われています。それは、システムがメモリを使い切る前に、ディスクへ書き出すことが出来るためです。そして、問題が発生した時にスワップ領域を調べなくてはならなくなるのです。重要なことは、いつ仮想メモリが使われているかを突き止めることです。UNIXでは、フリーなメモリーが割り当てられる際、スワップアウトさせる候補となるメモリーページを探し出すことをカーネルは最終的には決断せざるを得なくなります。そしてその直後、処理するためにメモリへの割り当てが必要なプロセスの存在をカーネルが検知し、スワップ候補となったページのいくつかをディスクにスワップさせます。もし負荷を処理出来るだけの十分なメモリが搭載されていたら、スワップによる遅れを排除することが出来ます。

Solarisでは、/etc/systemファイルでチューニングが可能です。IBM AIXでは、vmoコマンドが利用出来ます。Linuxでは、/etc/sysctl.confです。これらの挙動はOSの進化に従い絶え間なく変化しています。そのため、設定変更の前には十分な調査を実施して下さい。

最後に、余計なメモリが手元にあるならば、ファイルシステムのファイルキャッシュやメモリのメタデータに使う事が出来ます。大部分のUNIXでは、空いたメモリはキャッシュに使おうとします。これが、システムに空きメモリがないように見える原因です。これによりディスクアクセスが減るので、ウェブサーバーへの負荷に重要な影響を与えることとなります。

【訳注】 「パフォーマンスチューニングの応用概念 Part 2」に続きます。