DUICUO

ソフトウェアシステムのスケーラビリティを支える競合、一貫性、数学

[51CTO.com Quick Translation]この記事では、システムを数式を用いて記述する方法を、少なくともある程度まで紹介します。読者は、競合、一貫性、相関遅延といった用語に慣れることができます。さらに、これら3つのメカニズムがアプリケーションに与える影響を計算するのに役立つ法則とその数式を示します。

この記事では、全体的なシステム設計とアーキテクチャに焦点を当て、「システムを無制限に拡張できるか」という質問に答えます。

しかし、このトピックを完全に理解するために、まずは「スケーラビリティとは何でしょうか?」という簡単な質問に答えましょう。

スケーラビリティとは何ですか?

Wikipedia に掲載されているスケーラビリティの最も適切な定義の 1 つは、「リソースを追加することで、増加するワークロードを処理するシステム プロパティ (...)」です。

このような記述から、ソフトウェアシステムがスケーラブルであると見なされる場合、より多くのリソース(スレッド、CPU、ノード)を追加でき、増加するインバウンドトラフィックにも対応できると期待できます。しかし、これは理想的な世界にのみ当てはまります。残念ながら、現実には前述の3つの概念を考慮する必要があります。なぜこのようなアプローチが採用されているのかを説明する前に、線形スケーラビリティに関する詳細を説明しましょう。

線形スケーラビリティ

一般的に、これが理想的なシナリオです。システムへのリソースの追加は、常にパフォーマンスの向上をもたらします。さらに重要なのは、これは悪影響を与えることなく、無期限に実行できることです。線形スケーラビリティの影響を計算するために使用される数式は非常に小さく、単純です。

線形スケーラビリティ方程式

S→全体的なタスク実行時間の改善

N → リソースの改善(スレッド、CPU、ノード)

ご覧のとおり、実行時間の全体的な改善は改善されたリソースのみに依存するため、リソースを追加すればするほどパフォーマンスの向上は大きくなります。残念ながら、前述のように、より複雑なシステムではこれを実現することはほぼ不可能です。

線形スケーラビリティについて簡単に紹介した後、競合から始めて他のトピックに移ることができます。

競合とは何ですか?

簡単に言えば、これは共有リソースへのアクセスをめぐる競争です。CPUサイクルのような低レベルのリソースから、データベースアクセススレッドのような高レベルのリソース、さらにはシステムソケットのような高レベルの抽象化リソースまで、ほぼあらゆるものが共有リソースになり得ます。

どのゲームにも勝者は 1 人しかいないのと同様ですが、さらに重要なのは、「勝者」が勝利した後も、残りの「参加者」はリソースを活用したりブロックしたりしながら、「勝者」がタスクを完了するまで待機し、ゲームが最初から再び開始されることです。

同様に、あらゆる競争と同様に、競争相手の数が増えれば増えるほど、最終的な勝者になるまでの時間は長くなります。ソフトウェアの世界では、システムに十分な負荷がかかると、許容される時間制限をすべて破ることが予想されます。一方で、システムは他の場所で必要とされる可能性のあるリソースを使い続け、結果として障害がますます増加する可能性があります。

スレッドプールの種類を問わず、状況はより複雑になります。スレッドプールには多数のスレッドが存在し、敗者も複数存在するため、最終的に複数の勝者が存在する状況が見られます。さらに、この場合の次の勝者を選択するプロセスは、特定のスレッドプールの実装に大きく依存します。

競合とは何か、そしてそれがアプリケーションにどのような影響を与えるかがわかったので、最初の法則に進みましょう。

アムダールの法則とは何ですか?

1967 年にジーン・アムダールが提唱したアムダールの法則は、リソースが改善されたシステムで、固定負荷の下でタスク実行の待ち時間が理論的に改善されることを説明しています。たとえば、マルチスレッドの場合は、スレッドを追加することを意味します。

つまり、システムにリソースを追加することで得られる最大の改善効果を計算するために使用できます。重要なのは、特定のリソースを使用するコードのみがこのリソース改善の恩恵を受けることができるということです。これは完全に論理的な結論であり、したがって、恩恵を受けない部分の実行時間によって制限されます。

例えば:

システムにさらにスレッドを追加する場合、これらの操作の恩恵を受けることができるのはマルチスレッド部分のみであり、シングルスレッド部分の実行時間によって制限されます。

アムダールの法則の式

S→全体的なタスク実行時間の改善

σ → 改善されたリソースの恩恵を受けなかった部分が当初占めていた実行時間の割合

N → リソースの改善(スレッド、CPU、ノード)

パラメータ (σ) を 0 に設定すると、アムダールの法則は線形スケーラブルな方程式に簡略化されます。

σを(1-p)に置き換えて変換すると、上記と同様の別の方程式が得られます。

p → 改善されたリソースによって元々占有されていた実行時間の割合。

p=1のときにσ=0の場合と同様に、アムダールの法則は線形スケーラビリティ方程式に簡略化されます。どちらの場合も、アプリケーション全体がリソースの改善によって恩恵を受ける場合の潜在的なメリットが最大化されます。

これら2つの式は等しく、それぞれのデータに対して同じ結果を返すことを覚えておくことが重要です。計算は例に含まれています。

例:

例えば、あるタスクの実行に9時間かかるとします。この5時間の部分を並列化して高速化できれば、速度は従来の3倍になります。

今、私たちは知っています:

N=3

p = 5/9 = 0.56

σ = 4/9 = 0.44

それで

上記のように、このシナリオでは、タスクは以前よりも 0.59 倍速く完了します (約 6 時間 3 分)。

ここで注目すべき点が 2 つあります。

(1)プログラム全体がシステムリソースの改善から利益を得る場合、Sは最大3、σ=0|p=1になります。

(2)利益が大きいほど、改善も大きくなります。

上の図では、アムダールの法則に当てはまる、N が 0 から 10、σ=0.44 までのプロットが示されています。

アムダールの法則と競争

競合により各リクエスタの利用可能なリソースが減少し、システムの並列化が制限されるため、コードベースの競合が激しくなるほど、改善による全体的な影響は小さくなることがわかります。

競合、そのソフトウェアへの影響、競合の計算方法について説明したので、次に議論する必要がある 2 番目の概念に進みます。

一貫性とは何でしょうか?

一貫性とは、読み取りと書き込みの処理順序を指し、これら2つの操作が論理的な順序で処理されることを保証します。これはシステム設計全体において最も重要なトピックの一つです。CAP定理では文字Cで表現されるのもそのためです。最も重要な2つの一貫性モデルは、結果的一貫性と強い一貫性です。他にも一貫性モデルはありますが、それほど重要ではありません。

相関関係とは何ですか?

一貫性と密接に関連する用語である相関は、関係するすべての関係者が、特定の時点で同じデータセグメントを同じ状態で参照できるようにすることを意味します。これは、2つ以上のノード間で部分的な状態を共有するすべてのシステムにとって重要な概念です。

相関遅延とは何ですか?

相関関係によって、状態の特定の部分に対するすべての要求が同じ値を返すことが保証される場合、相関関係の待ち時間は、システム全体の一貫性を実現するために必要な時間として考えることができます。

システムにノードを追加すると相関の遅延が増加することに注意してください。

相関遅延とギュンターの法則

ガンサーの法則、またはユニバーサル スケーラビリティ法則 (USL) は、1993 年に Neil Gunther によって策定されました。これはアムダールの法則に基づいていますが、さらにプロセス間通信によって発生するオーバーヘッドも考慮に入れています。

簡単に言えば、同時実行性、競合(アムダールの法則)、そして依存遅延を考慮しながら計算システムのスケーラビリティを実現し、最終結果をより現実的なものにします。実際、依存遅延を方程式に導入することで、システムをスケールさせようとする試みがもたらす悪影響が明らかになります。

ギュンターの法則方程式

S→全体的なタスク実行時間が改善されました。

σ → 改善されたリソースの恩恵を受けなかった部分によって最初に占められた実行時間の割合。

κ → システムが一貫性を実現するために使用する実行時間の割合、つまり相関レイテンシ。これを計算する方法はなく、測定するか、式に異なる値を入れて単純に実験し、システムがどの程度拡張できるかを確認する必要があります。

N → リソースの改善(スレッド、CPU、ノード)

相関遅延を記述するパラメータ (κ) を 0 に設定すると、ギュンターの法則はアムダールの法則の式の形に簡略化されます。

例:

データはアムダールの法則のものと同じですが、さらに、システムは稼働時間の 7% を使用して状態の一貫性を維持します。

N=3

σ = 4/9 = 0.44

κ=0.07

では、上記の計算に基づいて何ができるでしょうか?

(1)パフォーマンスの向上が減少し、0.59の向上ではなく、0.30の向上しかありません。

(2) システムにリソースを追加し続けると、パフォーマンスは向上するのではなく低下することがわかります。ここでは、Nを10にスケールすると、パフォーマンスが0.11低下することがわかります。

(3)計算によれば、相関遅延(κ)が全体的な改善に与える影響は競合の影響よりもはるかに大きいことが分かる。

以下に、グンターの法則のグラフを示します。Nは0から10、σ = 0、44κ = 0.07です。Nが9になると、パフォーマンスの低下が顕著になり始めることがわかります。

最適な N を選択するにはどうすればよいでしょうか?

答えは簡単ですが、この記事の大部分と同様に、いくつかの数学的な計算が必要です。まず、ギュンターの法則を関数S(N)として考えることができます。任意の関数(実際には関数の一部)について、S(N)が最大値をとる点(N)を計算できます。この値が分かれば、2つの非常に重要な情報が得られます。

(1)リソースを使用する前に、必要なリソースの数を把握する。

(2)現状のシステムの拡張範囲を計算できる。

これらすべては、コンピューターを使わずに、通常の電卓またはペンと紙で行うことができます(コンピューターの高度さによって異なります)。

最適N方程式:

例:

ギュンターの法則の例では、データの改善を最大化するために必要なノード数が計算されています。

σ = 4/9 = 0.44

κ=0.07

上図からわかるように、最適なノード数は 2.83 ですが、追加できないノードもあるため、3 つのノードが追加され、p = 3 になります。

これを検証するために、S(4)を計算し、3つのノードではなく4つのノードを使用することでどれだけの改善が達成されるかを確認します。S(3) = 1.3であることを覚えておくことが重要です。

S(4)=1.26

上でわかるように、S(4)はS(3)よりも小さい(わずかに小さい)。

最後の質問に答える

システムを無制限に拡張できるでしょうか? もちろんできません。

システムが完全にステートレスでない限り(これは稀ですが)、拡張できるのはギュンターの法則で説明される範囲に限られます。この限界を超えてリソースを追加すると、システムのパフォーマンスは向上するどころか、最終的には低下します。

相関レイテンシがほぼゼロとなる最良のシナリオであっても、最終的にはアムダールの法則によって制限され、線形スケーラビリティの達成には程遠いものとなります。このようなスケーラビリティを実現するには、本質的に状態を持たず、シリアルボトルネックのない完全に並列化されたソフトウェアが必要です。

上のグラフは、線形スケーラビリティ(青線)、アムダールの法則(緑線)、そして一般的なスケーラビリティ法則(赤線)の値を0から5までプロットしたものです。これらの違い、特に期待されるスケーラビリティ(線形)からの距離が明確に示されています。当然のことながら、Nが大きくなるほど、これらの違いは顕著になります。研究によると、κパラメータの値に普遍的なルールは存在しません。その真の値は、システムの複雑さによってのみ決まります。

結論は

この記事が、システム設計全体に関する新たな洞察を提供し、将来役立つことを願っています。スケーラビリティは計算可能ですが、線形スケーラビリティは計算できないことを覚えておくことが重要です。

原題: Contention, Coherency, and Math Behind Software; 著者: Bartłomiej Żyliński

[この記事は51CTOによって翻訳されました。提携サイトへの転載の際は、元の翻訳者と出典を51CTO.comとして明記してください。]