パフォーマンスとは何か
原文は Salvatore Sanfilippo により に公開されました。 このブログを購読する
このブログ投稿のタイトルは、一見すると答えるのが簡単そうな問いに見えます。しかし、パフォーマンスが本当に何を意味するのかをもう少し丁寧に考えてみる価値はあります。スケーラビリティとパフォーマンスは混同されがちですし、とりわけデータベースシステムという文脈でパフォーマンスを主要な構成要素に分解することは、決して自明ではありません。この短い投稿では、データベースシステムにおけるパフォーマンスとは何かについての、現時点での私なりの考えを書き留めてみたいと思います。
良い出発点になるのは、最近Redisについて講演する際によく使っている最初のスライドでしょう。そのスライドはまさにパフォーマンスについてのもので、パフォーマンスとは主に次の3つのことだと述べています。
- レイテンシ:クエリに対する応答を得るまでに必要な時間。
- 単位時間・コアあたりの操作数:基準となる計算単位において、システムが1秒あたりに何件のクエリ(操作)を処理できるか。
- 操作の質:それらの操作がどれだけの仕事を成し遂げられるか。
レイテンシ
これはおそらく、パフォーマンスの中でも最もシンプルな要素でしょう。多くのアプリケーションでは、システムから応答が返ってくるまでの時間が短いことが望まれます。ただし、平均的な時間が重要である一方で、もう一つの関心事はレイテンシの予測可能性、すなわち平均的なケースと最悪のケースの間にどれだけの差があるかという点です。適切に使えば、インメモリシステムは非常に優れたレイテンシ特性を発揮し、かつ長期にわたって安定したレイテンシを提供することができます。
コアあたりの秒間操作数
2つ目に挙げる要素は、いわゆる素のパフォーマンスとスケーラビリティの違いを分けるものです。ここで関心があるのは、基準となる計算単位において、システムが単位時間あたりにどれだけの仕事をこなせるかということです。リニアにスケールするシステムは、多数のノードを使うことで1秒あたりの操作数を大きくできますが、それはスケーラブルであることを意味するのであって、必ずしも高性能であることを意味するわけではありません。
コアあたりの秒間操作数は、通常、1ワットあたりに実行できるクエリ数、すなわちシステムのエネルギー効率とも密接に結びついています。
操作の質
最後の点は、スループットやレイテンシほど開発者の間で強調されることはないかもしれませんが、特定の種類のシステム、とりわけインメモリシステムにおいては非常に重要です。
たとえば、1秒あたり100回の操作が可能なシステムでも、その操作の「質」が低い場合(Redisで言えばGETとSETしかできないような場合)、同じレイテンシとOPS特性でINCR操作も実行できるシステムと比べると、パフォーマンスは低くなります。例えば、手元の課題がカウンターのインクリメントである場合、前者のシステムではカウンターを1つ増やすのに2回の操作が必要になります(ここでは競合状態は考慮しません)。一方、INCRを提供するシステムでは1回の操作で済みます。結果として、後者は前者の実質2倍のパフォーマンスを提供できることになります。
お分かりのように、操作の質は絶対的な尺度ではなく、解こうとしている問題の種類に依存します。同じ2つのシステムでも、HTMLフラグメントをキャッシュしたいだけであれば、INCR操作は無用なものとなるため、両者は同等です。
操作の質は、特にインメモリシステムにおいて重要です。というのも、通常、計算そのものにかかる時間は、コマンドの受信やディスパッチ、応答の生成にかかる時間に比べて無視できるほど小さいからです。そのため、Redisのように豊富な操作を備えたシステムでは、1回の操作でユーザーがより多くのことをできるようにするだけで、多くの文脈においてほぼコストをかけずにより良いパフォーマンスを提供できます。この「より多くのこと」には実にさまざまな意味が含まれます。ZRANKコマンドのように、より複雑な問いに対する応答を返すこともあれば、HMGETコマンドのようにHash値を構成するフィールドのうちサブセットだけを選択的に返すことで、サーバーとクライアント間の帯域幅を削減するようなこともあります。
一般に、操作の質は、システムが実行できる秒間操作数に対してより高い、あるいはより低い価値を与えるという意味でパフォーマンスに影響するだけではありません。操作の質はレイテンシにも直接影響します。なぜなら、より複雑な操作は、複数の単純な操作を組み合わせて複雑な計算を実現する際に必要となる、クライアントとサーバー間の往復のデータ転送を回避できるからです。
おわりに
パフォーマンスとは何かについてのこの短い考察が、この特定の観点からデータベースシステムの能力を評価する際に伴う複雑さの一端を明らかにできたのであれば幸いです。語るべきことはまだまだたくさんありますが、システムを評価する際や、既存のシステムをどう進化させてパフォーマンス特性を改善していくかを考える際に、上記の3つの要素は最も興味深く、かつ重要なものだと私は考えています。
このトピックについてフィードバックをくれたYiftach Shoolman氏に感謝します。
記事をランダムに読む
コメント
ログインしてコメントする