マルチスレッドがスケーラビリティの問題を正確にどのように解決するかを知りたい.私の基本的な理解は、リクエストが新しいスレッドに入ると、リクエストを処理するために割り当てられる.しかし、舞台裏で正確に何が起こるか.
私は現在、何千もの GET、PUT、DELETE 操作を処理するストレージ クラウドを構築する必要があるプロジェクトを開始しています。
マルチスレッドがスケーラビリティの問題を正確にどのように解決するかを知りたい.私の基本的な理解は、リクエストが新しいスレッドに入ると、リクエストを処理するために割り当てられる.しかし、舞台裏で正確に何が起こるか.
私は現在、何千もの GET、PUT、DELETE 操作を処理するストレージ クラウドを構築する必要があるプロジェクトを開始しています。
マルチスレッドでは、一度に複数のスレッドを実行できます。マルチコア マシンでは、これは 2 つのスレッドが実際に並行して実行できることを意味し、一度に 1 つずつ実行する場合の 2 倍の作業を行います。理想的には、4 コアのマシンで 4 つのスレッドを使用すると、シングル スレッドの場合のほぼ 4 倍の作業を実行できます。
これを機能させるには、複数のスレッドを独立して実行することで解決できる問題が必要です。プログラムをスレッドに分割する方法を理解するには、かなり賢い必要があります。そして、ほとんどの場合、これらのスレッドが互いのデータを破壊しないようにする (さらに悪いことに、それを巧妙に妨害する) ようにするには、非常に巧妙である必要があります。同じプログラムの異なるセッションのように、スレッドをほぼ独立して実行できる場合もありますが、それができる場合は便利です。
マルチスレッドは、すべてのコアを機能させるという点でスケーリングします。4 コアのマシンでは、4 倍の作業を実行できます。16 コアのマシンにアップグレードすると、さらに 4 倍の増加が得られます (非常に巧妙なプログラミングを行った場合)。競合他社よりも 50% 高速であると自慢している場合は、競合他社よりも先にマルチスレッドを使用することをお勧めします。
それ以外の場合は、シングル スレッド ソリューションを使用してください。それはずっと簡単です。(私には、数千というのは大量のデータのようには思えません。数百万に達する可能性がある場合は、マルチスレッド化する価値があるかもしれません。)
通常、通常の HTTP 実行には多くの I/O が含まれるため、マルチスレッドが役立ちます。ご存知のように、IO 操作は重く、時間がかかります。したがって、実際には、クラス A のインスタンスとクラス B のインスタンスを取得する必要がある 1 つの要求がある場合、2 つのスレッドを作成して 1 つを A インスタンスにアクセスし、もう 1 つをデータベースからクラス B のインスタンスにアクセスする場合、次のことができます。各インスタンスを個別のスレッドにロードします。このようにして、スレッド B が IO でブロックされている間にスレッド A がそのコードを実行する可能性が高くなります。したがって、マルチスレッドを使用すると、IO 処理時間を獲得できます。
これが最初の利点です。マルチスレッドを使用すると、着信接続用にホール スレッドを予約する必要がなく、非同期イベント処理モデルを使用できるというもう 1 つの利点があります。毎秒 50 000 以上のリクエストを処理できるnettyと呼ばれるこの手法を使用する優れた実装があります。
マルチスレッドが優れているのは、マルチコア計算だけです。
一般に、イベントモデルは、コードの実行を完全に制御できるため、より軽量です。たとえば、現在HTTPヘッダーを取得して処理していて、他のスレッドがウェイクアップする必要がある場合、これは次のことを意味します。
イベントモデルでは、サイクル全体を終了し、データを保存して、別のイベントに進む完全な権利があります。2番目のイベントはあなたが仕事を終えるまで待ちます。ただし、作業コードを乗っ取って吐き出す時間は、一般的にはるかに長くなります。
メモリ管理も重要です。スレッドモデルでは、重要なデータへのアクセスを同期するためにロックが必要ですが、イベントモデルでは、スレッド固有のデータごとにロックや追加のメモリは必要ありません。
これは、Webサーバーの背後にあるポイントでもあります。このようにして、nginxは、マシンをスラッシングすることなく、何千もの接続を処理できます。