#はじめに
AWSにはNoSQLも含めて、様々なDBサービスが展開されています。
その中でも運用していく段階で、トラフィックの増大などによって上手くDBが機能しない場合があります。(DBへの受信リクエストの急増により、WEBサイトが表示されないなど)
そのような場合にスループットやIOPSを向上させることにより以上のような問題を解決できますが、具体的にどのような対処によりパフォーマンスが向上するのか、少しまとめてみたいと思います。
#そもそも
そもそもの話として、スループットならびにIOPSの詳細についてから入りたいと思います。
###スループット
スループットとは、「単位時間あたりの処理量」になります。
単位時間というところがポイントで、「○○あたり」という限定された範囲内の話です。
具体的には、一定時間内でどれだけデータ量を転送できたかを表し、単位としては「bps」、「kbps」などで、よくネットワーク機器などの性能表記に書かれていることが多いです。
###IOPS(Input/Output per second)
IOPSは「1秒あたりに処理できるI/O(読込・書込)アクセス数」になります。つまり、IOPSが高いと高速にデータの読み書きが可能という意味になります。
ハードディスクやSSDなどのストレージの性能指標として表されます。ちなみに、ハードディスクは物理的に1分あたりのディスクの回転数(RPM)に限界があるためIOPSが低く、SSDはIOPSが高いです。
読込性能はキャッシュレイヤの追加などにより改善されますが(キャッシュに乗る初回アクセスはIOPSの影響を受ける)、書込み処理(追加・更新・削除)はIOPSの影響を受けやすいです。
DBのパフォーマンスを向上させていくには、このIOPSとスループットを改善していく必要があります。
以下のケーススタディを考えてみました。
#ケーススタディA
アクセスの増加により、データベース(例えばRDS)が受信リクエストへの対処が追いつかなくなってしまい、WEBサイトがきちんと表示されない場合を考えてみます。
この場合、受信リクエスト=つまり読み取り処理が増大したことによる障害のため、データベースの読み取りパフォーマンスを向上させる必要があります。対応としては以下が考えられると思います。
・リードレプリカを作成し、読み取りトラフィックをオフロードさせる。(→スループットの改善)
・キャッシュレイヤーを追加して、アクセスが集中しているクエリをキャッシュ処理することで、高速処理を実現し、データベース側への負荷を減少させる。(→スループットの改善)
・アタッチしているストレージのストレージタイプをIOPSの大きなものに変更することで、DB本体のI/O性能を向上させる。(→IOPSの改善)
#ケーススタディB
反対に、DBに対する書込み処理の増大により、DBの書込みパフォーマンスが低下している場合はどうでしょうか。
こちらは、以下のような対応が考えられると思います。
・EBSボリュームを追加し、RAID 0構成とする。(→IOPSの改善、スループットの改善)
・高パフォーマンスを実現できるストレージボリュームタイプ(プロビジョンドIOPSなど)に変更する。(→IOPSの改善)
・インスタンスタイプを変更する(EC2などにミドルウェアをホストしている場合)。(→IOPSの改善)
#スループットとIOPSによるパフォーマンス最適化
以上のように、スループットやIOPSの改善によりパフォーマンスを向上できます。
ただ、スループットの大きいディスク(スループット最適化HDD)を選んだからといって、アプリのパフォーマンスが向上するとは限りません。例えば、ファイルサイズがあまり大きくない3~4KB程度のデータを頻繁に書込むようなケースの場合、IOPSが高くないと処理が追いつかず、結果としてパフォーマンスが低下してしまうので、スループットよりもIOPSを重視した方がパフォーマンスが上がりやすいです。
反対に、一度の書込みが数GB単位のような大きいサイズファイルのデータの場合、いくらIOPSが高くてもスループットが低いとデータ転送に時間がかかり、結果としてパフォーマンスが低下してしまうので、IOPSよりもスループットを重視した方がパフォーマンスが上がりやすいです。
#まとめ
DBのパフォーマンスを向上させるには、IOPSとスループットの2つの観点から改善を行なっていく必要があることがわかりました。
ケースに合わせて、最適なストレージタイプの選択やRAID構成を組んだり、リードレプリカやキャッシュレイヤを追加したりすることによって、アプリ全体のパフォーマンスを上げていく必要がありますね。
DBRE(Database Reliability Engineering)と言われているように、DBのパフォーマンスがアプリ全体のパフォーマンスに関わってくるんだなと痛感しました。