封筒の裏の計算 – システム設計 04

システムデザイン-システムデザイン04-裏表紙計算-封筒の裏-ホーガンテック-ホーガンブラブ

序文

バック・オブ・ザ・エンベロープは、バック・オブ・ザ・エンベロープ計算とも呼ばれ、単純な推定値を使用して複雑な問題の近似値を計算する方法です。ここでも分散システムを復習しましょう。ネットワークを介して接続されたコンピューティング ノードで構成されます。これらのノードには、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. 負荷の推定: システムが 1 秒あたりに予想できるリクエスト、データ量、またはユーザー トラフィックの数を予測します。
  2. ストレージの見積もり: システムによって生成されたデータを処理するために必要なストレージ容量を見積もります。
  3. 帯域幅の推定: データ転送に必要な予想されるトラフィックとネットワーク帯域幅。
  4. レイテンシーの推定: 応答時間と遅延を予測するためのシステム アーキテクチャとコンポーネント。
  5. リソースの見積もり: 負荷を処理するために必要なサーバー、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 を使用したシステム設計に関する考慮事項をいくつか示します。

  • システム設計の実際の状況では、詳細な分析が必要になります。
  • バック・オブ・ザ・エンベロープを実行するときは、ハードウェア、ソフトウェア、ネットワークなど、システムのすべての主要な要素を考慮する必要があります。

引用

10 年かけてプログラミングを独学する

関連記事

ソフトウェア設計の非機能的特徴 – システム設計 03

システム設計における抽象化の適用 – システム設計 02

最新システム設計入門 - システム設計 01

2023 Yahoo! ソフトウェア・エンジニア・インタビュー

ja日本語