目次
トグル序文
バック・オブ・ザ・エンベロープは、バック・オブ・ザ・エンベロープ計算とも呼ばれ、単純な推定値を使用して複雑な問題の近似値を計算する方法です。ここでも分散システムを復習しましょう。ネットワークを介して接続されたコンピューティング ノードで構成されます。これらのノードには、Web サーバー、アプリケーション サーバー、ストレージ サーバーなど、さまざまなタイプのサーバーを使用できます。
分散システムを設計するときは、各ノードが処理できるリクエストの数を理解することが重要です。同時に、必要なノード数やトラフィック数も把握できるので、Back-of-the-envelope を使用して概算を計算し、最終的に必要なシステムを設計します。
封筒の裏
実際には、分散システムはネットワークを介して接続された計算ノードで構成されており、市場のソフトウェア システムにもさまざまな計算ノードがあり、それらはさまざまな方法で接続されています。封筒の裏側は、システムの詳細を無視して、前の記事で述べた抽象的な概念など、より重要な側面に焦点を当てるのに役立ちます。
以下は封筒の裏側の例です。
- サーバーが受け入れることができる同時 TCP 接続の数。
- Web ページ、データベース、またはキャッシュ サーバーが処理できる 1 秒あたりのリクエスト (RPS) の数。
- サービスのストレージのニーズ。
このような場合、不当な数値が計算されると、ソフトウェア設計上の欠陥が生じる可能性があります。したがって、システムを設計する際には、封筒の裏を使って大まかな見積もりを作成し、システムの最適化と拡張を行う必要があります。
データセンターサーバーの種類
データ センターには 1 種類のサーバーしか存在しません。エンタープライズ ソリューションでは、コストを削減し、スケーラブルなシステムを開発するためのソリューションを見つけるために、さまざまなワークロード (ワークロード) サーバー タイプを処理するために、次のものが一般的に使用されます。
ウェブサーバー
スケーラビリティを確保するために、Web サーバーはアプリケーション サーバーから分離されています。 Web サーバーは、ロード バランサー (ワーク バランサー) の後の最初のノードです。 Web サーバーは、クライアント側からの API 呼び出しを処理するサーバーでもあります。通常、メモリとストレージのリソースはニーズに応じて異なります。もちろん、通常はメモリとストレージの容量が大きいほど、サーバーが処理に使用できるリソースが向上します。例: Meta は、大量の計算に対応するために、32 GB RAM と 500 GB の容量を備えたサーバーを使用しています。
アプリケーション・サーバー
アプリケーション サーバーは、アプリケーションおよびビジネス ロジックを処理するために使用されます。ただし、通常、Web サーバーとアプリケーション サーバーを区別するのは困難です。次のような違いがあります。アプリケーション サーバーは動的コンテンツを提供しますが、Web サーバーは主に静的コンテンツをクライアント ブラウザーに提供します。
ストレージサーバー
インターネットがますます発展するにつれて、ネットワーク サービスで保存する必要があるデータの量も、トラフィックと規模により爆発的に増加します。そのため、処理するストレージ サーバー (専用のデータベース サーバーとして理解できます) が必要になります。膨大な量のデータ。さまざまなデータ型に基づいて適切なデータベースを選択する必要もあります。例: Youtube は次のデータベースを使用します。
- Blob Storage を使用して、コンパイルされたビデオ データを保存します。
- Bigtable は、大量のビデオ サムネイルを保存する場合に特に使用します。
- RDBMS を使用して、コメントやいいねのデータなどのユーザー データとビデオ データを保存します。
- SQL と NoSQL を使用して、データ分析用にさまざまな種類のデータを保存します。
共通規格
システムサービスの設計、計画、実装には、多額の資金、時間、人的資源が必要です。マシンが処理できるワークロードの種類が分からない場合、それ以上の設計を行うことは困難です。レイテンシーは、どのマシンがどのワークロードに適しているかを判断できる非常に重要なものです。以下はその内容です。 Github で見つかったリソース、読者の参考のために表にしました。
遅れ
プロジェクト | 時間 (ナノ秒) |
---|---|
命令を実行する | 1/1,000,000,000 秒 = 1 ナノ秒 |
L1キャッシュからフェッチする | 0.5ナノ秒 |
分岐予測エラー | 5ナノ秒 |
L2キャッシュから取得する | 7ナノ秒 |
ミューテックスのロック/ロック解除 | 25ナノ秒 |
メインメモリから取得 | 100ナノ秒 |
1Gbpsネットワーク経由で2Kバイトを送信 | 20,000ナノ秒 |
メモリから 1MB を順次読み取ります | 250,000ナノ秒 |
新しいディスクの場所から抽出する (シーク) | 8,000,000ナノ秒 |
ディスクから 1MB を順次読み取ります | 20,000,000ナノ秒 |
データパケットを米国に送り返します | 150 ミリ秒 = 150,000,000 ナノ秒 |
QPS
上記のレイテンシーに加えて、データベース クエリの量を測定する 1 秒あたりのクエリ (QPS) もあります。
重要なレート | 1 秒あたりのクエリ数 (QPS) |
---|---|
MySQL によって処理される QPS | 1000 |
Key-Value データベース処理 QPS | 10,000 |
キャッシュによって処理された QPS | 10万~100万 |
単位数量
索引 | 近似 | フルネーム | 略語 |
---|---|---|---|
10 | 千 | キロバイト | KB |
20 | 百万 | メガバイト | MB |
30 | 十億 | ギガバイト | GB |
40 | 兆 | テラバイト | 結核 |
リクエスト量の計算
次に、サーバーが 1 秒あたりに処理できるリクエストの数 (1 秒あたりのリクエスト数 (RPS)) について説明します。
サーバー内のリソースは限られており、クライアント要求の種類によってはシステムのボトルネックが発生する可能性があります。
主に次の 2 種類のリクエストに分類できます。
- CPU バウンドのリクエスト: このようなリクエストの制限要因は CPU です。
- メモリバウンドのリクエスト: このようなリクエストはメモリ制限の影響を受けます。
CPU バウンドのリクエスト
CPU 集中型リクエストの RPS を計算する一般的な式は次のとおりです。
RPS-CPU = CPU 数 x 1 / タスク時間
このうち、各変数の意味は以下のとおりです。
- RPS-CPU: CPU 負荷の高い RPS
- Num-CPU: CPU スレッドの数
- タスク時間: 各タスクを完了するのに必要な時間
メモリバウンドのリクエスト
メモリを大量に使用するリクエストの場合は、次の式を使用します。
RPS メモリ = ワーカー メモリ / RAM サイズ x 1 / タスク時間
このうち、各変数の意味は以下のとおりです。
- RPS-Memory: メモリを大量に使用する RPS
- RAM-size: RAM サイズ
- Worker-Memory: メモリを管理するためにメモリによって使用されるワーカー
サービスは、CPU を大量に消費するリクエストとメモリを大量に消費するリクエストの両方を受け取ります。リクエストの半分が CPU 集中型で、残りの半分がメモリ集中型であると仮定すると、処理できる合計 RPS は次のようになります。
RPS = (RPS-CPU + RPS-メモリ) / 2
上記の計算は、RPS の推定の近似を理解するためのものです。実際には、RPS に影響を与える他の多くの要因が存在する可能性があります。例: データが RAM にない場合、またはデータベース サーバーに対してリクエストが行われた場合、ディスク シーク (Seek) が必要となり、遅延が発生します。その他の要因には、障害、プログラム コードのエラー、ノードの障害、停電、ネットワークの中断などが含まれますが、これらはすべて避けられない要因です。
システム設計面接におけるコンピューティングの種類
システム設計のインタビューでは、次の種類の見積もりを実行する必要がある場合があります。
- 負荷の推定: システムが 1 秒あたりに予想できるリクエスト、データ量、またはユーザー トラフィックの数を予測します。
- ストレージの見積もり: システムによって生成されたデータを処理するために必要なストレージ容量を見積もります。
- 帯域幅の推定: データ転送に必要な予想されるトラフィックとネットワーク帯域幅。
- レイテンシーの推定: 応答時間と遅延を予測するためのシステム アーキテクチャとコンポーネント。
- リソースの見積もり: 負荷を処理するために必要なサーバー、CPU、またはメモリの数を見積もります。
裏表紙計算の具体例
負荷推定
1 億人のデイリー アクティブ ユーザー (DAU) がおり、各ユーザーが 1 日あたり平均 10 件の投稿を公開するソーシャル メディア プラットフォームを設計するとします。負荷を計算するには、1 日に生成される投稿の合計数をカウントする必要があります。
1 億 DAU * 10 投稿/ユーザー = 10 億投稿/日
次に、1 秒あたりのリクエスト数を推定します。
10 億投稿/日 / 86,400 秒/日 = 11,574 リクエスト/秒
ストレージの見積もり
5 億人のユーザーがおり、各ユーザーが 1 日あたり平均 2 枚の写真をアップロードする写真共有アプリを考えてみましょう。各写真の平均サイズは 2 MB です。 1 日分の写真に必要なストレージ容量を見積もるには、次のように計算します。
5 億ユーザー* 2 写真/ユーザー* 2 MB/写真 = 2,000,000,000 MB/日
帯域幅の推定
1,000 万人のユーザーが 1080p ビデオを 4 Mbps でストリーミングするビデオ ストリーミング サービスの場合、必要な帯域幅は次のように計算できます。
1,000 万ユーザー * 4 Mbps = 40,000,000 Mbps
レイテンシーの推定
複数のソースからデータをフェッチする API を設計し、各ソースの平均レイテンシが 50 ミリ秒、100 ミリ秒、200 ミリ秒であることがわかっているとします。レイテンシは次のように計算します。
50 ミリ秒 + 100 ミリ秒 + 200 ミリ秒 = 350 ミリ秒
プロセスが並列 (Parallel) である場合、合計遅延は最大遅延になります。
最大(50ミリ秒、100ミリ秒、200ミリ秒) = 200ミリ秒
リソースの見積もり
1 秒あたり 10,000 のリクエストを受信するシステムを設計すると、各リクエストには 10 ミリ秒の CPU 時間が必要になります。必要な CPU コアの数を計算するには、1 秒あたりの合計 CPU 時間を計算するだけです。
10,000 リクエスト/秒 * 10 ミリ秒/リクエスト = 100,000 ミリ秒/秒
現時点では、各 CPU がコアあたり 1,000 ミリ秒を処理できると仮定することもできます。その場合、必要なコアの数は次のようになります。
100,000 ミリ秒/秒 / 1,000 ミリ秒/コア = 100 コア
結語
バック・オブ・ザ・エンベロープは、システム要件を迅速に見積もるための方法であり、システム設計の初期段階で使用できます。このアプローチにより、効果的な設計上の決定が可能になり、後続の段階での問題を回避できます。
Back-of-the-envelope を使用したシステム設計に関する考慮事項をいくつか示します。
- システム設計の実際の状況では、詳細な分析が必要になります。
- バック・オブ・ザ・エンベロープを実行するときは、ハードウェア、ソフトウェア、ネットワークなど、システムのすべての主要な要素を考慮する必要があります。