パフォーマンス効率
組織の最近の製品発表の 1 つに関するニュース記事が公開されるとします。 ニュース記事による追加の宣伝によって、Web サイトに大量のトラフィックが送信されます。 Web サイトではこのトラフィックの増加を処理できるでしょうか。 サイトが遅くなったり応答しなくなったりすることなく、追加の負荷に対応できるでしょうか。
このユニットでは、優れたアプリケーション パフォーマンスを確保するための基本的な原則をいくつか説明します。 特に、パフォーマンス効率の柱を構成する、スケーリングと最適化の原則についてです。
パフォーマンス効率とは
パフォーマンス効率とは、アプリケーションが利用可能なリソースと、そのアプリケーションへの需要が一致することです。 パフォーマンス効率には、リソースをスケーリングすること、潜在的なボトルネックを識別して最適化すること、最高のパフォーマンスが得られるようアプリケーション コードを最適化することが含まれています。
アプリケーションのスケーラビリティとパフォーマンスを強化できるいくつかのパターンとプラクティスを見てみましょう。
スケールアップとスケールアウト
コンピューティング リソースは、2 つの方向にスケーリングできます。
スケール "アップ" では、より多くのリソースが 1 つのインスタンスに追加されます。 "垂直方向のスケーリング" とも呼ばれます。
スケール "アウト" では、インスタンスが追加されます。 "水平方向のスケーリング" とも呼ばれます。
"スケールアップ" では、CPU やメモリなどのリソースが 1 つのインスタンスにさらに追加されます。 このインスタンスは、仮想マシンまたは PaaS サービスである場合があります。
インスタンスにより多くの容量を追加する操作により、アプリケーションで使用できるリソースが増えますが、制限があります。 仮想マシンはそれが実行されているホストの容量に制限され、ホスト自体に物理的な制限があります。 最終的には、インスタンスのスケールアップを行うときに、これらの制限に達します。 それにより、インスタンスにさらにリソースを追加する能力が制限されます。
"スケールアウト" には、サービスにインスタンスを追加する操作が関係しています。 それらは仮想マシンや PaaS サービスの場合があります。 1 つのインスタンスをより強力にすることで多くの容量を追加する代わりに、インスタンスの合計数を増やすことで容量を増加させます。
スケールアウトのメリットは、アーキテクチャに追加できるマシンさえあれば、考え得る限りどこまでもスケールアウトできることです。 スケールアウトする場合は、何らかの種類の負荷分散が必要です。 たとえば、利用可能な複数のサーバー間で要求を分散させるロード バランサーや、要求の送信先となるアクティブなサーバーを識別するためのサービス検出メカニズムなどです。
どちらのスケーリングでも、リソースを削減し、コストの最適化を実現できます。
自動スケールは、パフォーマンス要件に合わせてリソースを動的に割り当てるプロセスです。 作業量が増加すると、アプリケーションで、サービス レベル アグリーメント (SLA) に準拠し、必要なパフォーマンス レベルを維持するために追加のリソースが必要になる場合があります。 需要が減り、追加のリソースが必要なくなったときに、それらの割り当てを解除してコストを最小限に抑えることができます。
自動スケールは、クラウドでホストされている環境の弾力性を活用しながら、管理オーバーヘッドを削減します。 これにより、オペレーターがシステムのパフォーマンスを常時監視したり、リソースの追加や削除を判断したりする必要がなくなります。
ネットワークのパフォーマンスを最適化する
パフォーマンスを最適化する場合は、ネットワークとストレージのパフォーマンスを調べて、そのレベルが許容範囲内になるようにします。 これらのパフォーマンス レベルは、アプリケーションの応答時間に影響する可能性があります。 実際のアーキテクチャに合った適切なネットワーク テクノロジとストレージ テクノロジを選択することが、最良のエクスペリエンスをコンシューマーに提供することにつながります。
サービスとサービスの間にメッセージング レイヤーを追加することで、パフォーマンスとスケーラビリティが向上する場合があります。 メッセージング レイヤーによりバッファーが形成され、受信側アプリケーションの処理が追い付かなくなった場合でも、エラーが生じることなく要求のフローが維持されるようになります。 アプリケーションによって絶えず要求が処理されるので、受信した順序で応答が返されます。
ストレージのパフォーマンスを最適化する
多くの大規模なソリューションでは、個別に管理およびアクセスすることができる複数の独立したパーティションにデータが分割されています。 パーティション分割戦略は、メリットを最大限に活かし、悪影響を最小限に抑えるために、入念に選択する必要があります。 パーティション分割を行うことで、スケーラビリティが向上し、競合が少なくなり、パフォーマンスが最適化されます。
ご利用のアーキテクチャでキャッシュを使用すると、パフォーマンスの向上につながる可能性があります。 キャッシュは、使用頻繁の高いデータや資産 (Web ページ、画像) を、より高速に取得できるように格納するメカニズムです。 アプリケーションのさまざまな階層で、キャッシュを使用できます。 データ取得時間を短縮するため、アプリケーション サーバーとデータベースの間でキャッシュを使用することができます。
静的なコンテンツをユーザーの近くに配置することで、ユーザーと Web サーバーの間にキャッシュを使うこともできます。 この種類のキャッシュにより、ユーザーに Web ページを返すのにかかる時間が短縮されます。 これには、データベース サーバーや Web サーバーから要求をオフロードし、他の要求に対するパフォーマンスを高めるという二次的な効果もあります。
アプリケーションでのパフォーマンスのボトルネックを特定する
クラウドで実行される分散アプリケーションとサービスは、数多くの稼働部分で構成される複雑なソフトウェアです。 運用環境では、ユーザーがどのようにシステムを利用しているかを追跡できるようにすることが重要です。 また、リソース使用率をトレースし、システムの正常性とパフォーマンスを全般的に監視することも重要です。 この情報を診断に使用して、問題の検出と修正に役立てることができます。 また、この情報を使用して、潜在的な問題を見つけて、その発生を防止するために役立てることもできます。
パフォーマンスの最適化には、アプリケーション自体がどのように実行されているかを理解することが含まれます。 依存システム内でのエラー、パフォーマンスの低いコード、ボトルネックはすべて、アプリケーション パフォーマンス管理ツールを通じて明らかになります。 多くの場合、これらの問題はユーザーや開発者、管理者には表示されなかったり、わかりにくかったりしますが、アプリケーションの全体的なパフォーマンスに悪影響を及ぼすおそれがあります。
アプリケーションのすべての階層を確認して、パフォーマンスのボトルネックを識別して修復します。 このようなボトルネックは、アプリケーションでの不適切なメモリ処理であったり、データベースにインデックスを追加するプロセスであることさえあります。 1 つのボトルネックを解決すると、今まで気が付かなかった別のボトルネックが発覚するため、これは反復的なプロセスとなる可能性があります。
パフォーマンスの監視に対する徹底的なアプローチによって、アーキテクチャにメリットのあるパターンやプラクティスの種類を特定することができます。