パフォーマンスとは何か?
このブログ記事のタイトルは、一見すると簡単に答えられそうな問いです。しかし、パフォーマンスが本当は何を意味するのかを、もう少し丁寧に考えてみる価値はあります。スケーラビリティとパフォーマンスを混同するのは容易ですし、データベースシステムにおけるパフォーマンスを、主な構成要素に分解して考えるのも、決して簡単ではありません。この短いブログ記事では、データベースシステムという文脈におけるパフォーマンスについて、現時点での私の考えを書き留めてみます。
おそらく、よい出発点になるのは、最近Redisについて講演するときに使っている最初のスライドです。この最初のスライドはまさにパフォーマンスについてのもので、パフォーマンスとは主に次の3つだと説明しています。
- レイテンシ:クエリに対する応答を受け取るまでに必要な時間。
- コアあたりの単位時間当たりのオペレーション数:基準となる計算単位1つにつき、システムは1秒当たり何個のクエリ(オペレーション)に応答できるのか。
- オペレーションの質:そのオペレーションによって、どれだけの仕事を達成できるのか。
レイテンシ
これはおそらく、パフォーマンスを構成する要素の中で最も単純なものです。多くのアプリケーションでは、システムから応答を受け取るまでの時間は短いほうが望ましいでしょう。ただし、平均時間が重要なのはもちろん、レイテンシの予測可能性や、平均的なケースと最悪のケースにどれほど差があるかも問題になります。適切に使えば、インメモリシステムは非常に優れたレイテンシ特性を実現でき、時間が経っても一貫したレイテンシを保つこともできます。
コアあたり毎秒のオペレーション数
次に挙げる2つ目の要素が、純粋なパフォーマンスとスケーラビリティの違いを生みます。特定の基準となる計算単位について、決められた時間内にシステムがどれだけの仕事をこなせるかに注目します。線形にスケールするシステムは、複数のノードを使うことで毎秒のオペレーション数を大きくできます。しかし、それはスケーラブルだということであって、必ずしも高性能だということではありません。
コアあたり毎秒のオペレーション数は通常、1ワット当たりに実行できるクエリ数とも結びついています。つまり、システムのエネルギー効率にも関係します。
オペレーションの質
最後の点は、スループットやレイテンシほど開発者の間で強調されていないかもしれません。しかし、特定の種類のシステム、特にインメモリシステムでは非常に重要です。
毎秒100個のオペレーションを実行できても、そのオペレーションの「質が低い」システム(Redisの用語で言えば、たとえばGETとSETだけ)と、同じレイテンシおよびOPS特性でINCRオペレーションも実行できるシステムを比べると、前者のパフォーマンスは低いと言えます。たとえば、解決したい問題がカウンターのインクリメントなら、前者のシステムではカウンターを増やすのに2つのオペレーションが必要になります(ここでは競合状態は考慮しません)。一方、INCRを提供するシステムなら、1つのオペレーションで済みます。その結果、実際には前者のシステムの2倍のパフォーマンスを発揮できることになります。
このように、オペレーションの質は絶対的な指標ではなく、解決したい問題の種類によって変わります。たとえばHTMLフラグメントをキャッシュしたい場合、同じ2つのシステムは同等です。INCRオペレーションは役に立たないからです。
オペレーションの質は、インメモリシステムでは特に重要です。通常、計算そのものにかかる時間は、コマンドを受信して振り分け、応答を生成するのに必要な時間に比べれば無視できるほど小さいからです。そのため、Redisのように豊富なオペレーションを備えたシステムは、1回のオペレーションでユーザーがより多くのことをできるようにするだけで、多くの状況においてほとんどコストを増やさずに、より優れたパフォーマンスを提供できます。「より多くのことをする」とは、実際にはさまざまな意味を持ちます。たとえばRedisのZRANKコマンドのように、より複雑な問いへの応答を返すこともそうですし、Hash値を構成するフィールドの一部だけについて情報を返すHMGETコマンドのように、より選択的な応答を返すこともそうです。後者の場合、サーバーとクライアントの間で必要となる帯域幅を減らせます。
一般に、オペレーションの質がパフォーマンスに影響するのは、システムが実行できる毎秒のオペレーション数に与える価値が増減するからだけではありません。オペレーションの質はレイテンシにも直接影響します。より複雑なオペレーションを使えば、複数の単純なオペレーションを組み合わせて複雑な計算を行うために必要となる、クライアントとサーバー間のデータ転送の往復を避けられるからです。
まとめ
パフォーマンスとは何かについてのこの短い考察が、今回の観点からデータベースシステムの能力を評価する際に関わる複雑さの一端を明らかにできていればと思います。まだ語るべきことはたくさんあります。しかし、システムを評価するとき、また既存システムをどのように発展させればパフォーマンス特性を改善できるかを理解するとき、上で挙げたパフォーマンスの3つの構成要素は、特に興味深く重要なものだと感じています。
このテーマについてフィードバックをくれたYiftach Shoolmanに感謝します。
記事をランダムに読む