想定していた性能が出ない場合
運用を開始した後に、AWSで想定していた性能が出ずに問題になるケースでは、私の経験からすると「想定がそもそも誤っていた」という場合が多い。解決には、性能を上げる以外にないので、AWSにおける一般的な性能向上の方法を説明しよう。
性能監視ツールの導入
AWSにはCloudWatchという素晴らしいモニタリングツールがあるが、OS内部の性能や、ミドルウェアに特化した情報については知ることができない。また、2週間分のデータしかモニタリングできないので、1カ月前のデータを見たいという場合に困ることがある。このため、性能監視のための別のツールを導入することが多い。
有償/無償のさまざまなツールがあるので悩ましい。個人的なお勧めツールは「Datadog」だ。EC2インスタンスの追加にも簡単に対応し、エージェントを入れることでメジャーなミドルウェアの細かなメトリクスを取得できる。グラフィカルな表示のカスタマイズもできる。モニタリングツールを使いこなすことで、性能のボトルネックがどこにあるのかを見つけることができる。
問題が発生してからチェックしても原因がわからないということもあるので、問題発生の有無に関わらず、定期的にメトリックを確認し、正常値について把握しておくことも重要だ。
スケールアウト/スケールアップ
アプリケーション、ミドルウェアがチューニングされていないのであれば、それらをチューニングすることをお勧めしたい。チューニング効果は、費用対効果が高いことが多いからだ。 ただ、ソフトウェアチューニングが困難なケースもあり、それでも性能を上げたいニーズもあるだろう。
EC2の場合、大きく2つの方法が存在する。
- インスタンスの台数を増やして対応(スケールアウト)
- インスタンスタイプを上げて対応(スケールアップ)
ソフトウェア的にEC2インスタンスを増やすことに問題ないのであれば、スケールアウトによる対応がもっとも手っ取り早い。ピーク時間のみインスタンス数を増やし、それ以外の時間帯はインスタンスを停止(もしくはターミネート)する。
ソフトウェアの仕組み上、台数を増やすことが難しい場合、例えばRDSなどではインスタンスタイプをあげて(スケールアップ)対応することが多い。また、大きいインスタンスタイプの場合、高速なネットワークにつながっているため、ネットワーク速度がボトルネックになっているならスケールアップを検討する。
EC2/RDSのスケールアップには、インスタンスの停止があるため、単一サーバの場合はサービス停止が発生する可能性に注意したい。
AWS上でシステムを構築する場合、あらかじめEC2を追加するだけで性能が拡張できるようにシステムを構築しておくと、運用時の対応が非常に楽になる。リソースは固定ではなく、追加/削減できるものとしてシステムを構築することが肝要だ。
EC2以外のSaaSサービスを利用する
例えば、ウェブサーバなら、アクセス性能を向上させるためにコンテンツ配信網(CDN)サービスであるCloudFrontを利用するという方法が可能である。最近デフォルトの性能上限が緩和されたことで、以前よりも使い易くなっている。他にもデータベースサービスであるDynamoDBや、ストレージサービスのS3、費用対効果に優れるAWSのサーバレスのサービスは是非検討したいところだ。
AWSサポートの活用
性能問題に限らないが、AWSサポートは非常に頼りになる。システムに固有の問題についてAWS内の情報で確認をしてくれる。ただし、漠然とした質問を投げると、回答までに時間がかかる上に、当たり前だが正しい回答が得られない。できるだけ具体的に解決したい問題、現状について説明することが必要だ。