これまでは常に誤解がありました。高性能サーバーはマルチスレッドで実装する必要があると考えられていました。
理由は非常に単純で、誤解によるものです。 2: マルチスレッドはシングルスレッドよりも優れている必要があります スレッドは非常に効率的です。実際には違います。
redis coreすべてのデータがメモリ内にある場合、シングルスレッド操作が最も効率的になる理由は何ですか? マルチスレッドの本質は、CPU が複数のスレッドをシミュレートすることだからです。このシミュレートされた状況にはコンテキスト スイッチングという代償が伴いますが、メモリ システムの場合、コンテキスト スイッチングを使用しない場合が最も効率的です。
Redis は単一の CPU を使用してメモリ データをバインドし、このメモリ内のデータに対する複数回の読み取りと書き込みはすべて 1 つの CPU で行われるため、単一の CPU で実行されます。 -スレッドプロセス、この問題。 メモリの場合、このソリューションが最適なソリューションです。 (推奨:「redis ビデオ チュートリアル 」)
CPU コンテキストの切り替えには約 1500ns かかるためです。
メモリから 1MB の連続データを読み取るには約 250us かかります。1MB のデータが複数のスレッドによって 1000 回読み取られると仮定すると、コンテキスト スイッチが 1000 回発生します。
その場合、1500ns * 1000 になります。 = 1500us。単一スレッドで 1MB のデータを読み取るのに 250us しかかかりません。時間コンテキストを切り替えるだけでも 1500us かかります。毎回少しのデータを読み取るのに費やす時間は含まれていません。
マルチスレッド ソリューションを使用する必要があるのはどのような場合ですか?
答えは、下部のストレージは遅いということです。たとえば、ディスク
メモリは、非常に高い IOPS を持つシステムです。メモリの一部を申請したい場合は、メモリの一部を申請します。メモリの一部を破壊する場合は、メモリを破壊します。記憶の一部です。記憶を申請したり破壊したりするのは非常に簡単です。さらに、メモリのサイズを動的に適用できます。
ディスクの特性は次のとおりです。IPOS は非常に低いですが、スループットは非常に高いです。これは、最高のパフォーマンスを実現するには、多数の読み取りおよび書き込み操作をまとめてディスクに送信する必要があることを意味します。なぜ?
IOPS が非常に高いため、メモリ内にトランザクション グループ操作 (つまり、書き込み、読み取り、書き込み、読み取り、書き込みなどの複数の分離されたトランザクション リクエスト、つまり 5 つの操作が一緒になったもの) があるとします。 1 つずつ完了することもできますが、ディスク上にこのリクエスト メソッドも存在する場合、
私の最初の書き込み操作は次のように完了します。まず、ハードディスク内のアドレスをシークします。これには約時間がかかります。 10 ミリ秒後、「データの一部には 1 ミリ秒かかる場合がある」を読み取り、それを再度計算して (無視して)、ハードディスクに書き戻すと、さらに 10 ミリ秒かかり、合計 21 ミリ秒かかります。
2 番目操作の読み取りには 10 ミリ秒かかり、3 番目の操作の書き込みには 21 ミリ秒かかります。その後、読み取りが 10 ミリ秒、書き込みが 21 ミリ秒かかりました。5 つのリクエストには合計 83 ミリ秒かかりました。これは依然として最も理想的な状況です。メモリ内にあれば、 1ms未満であること。
したがって、このような大きなスループットを持つディスクの場合、最善の解決策は間違いなく N 個のリクエストを 1 つのバフにまとめてから、それらをまとめて送信することです。
メソッドは非同期を使用します。リクエストを処理スレッドにバインドしません。リクエスト元のスレッドはリクエストをバッファに入れ、バッファがほぼいっぱいになるまで待機してから、処理スレッドがリクエストを処理します。バフ。次に、このバフを使用してディスクへの書き込みまたはディスクの読み取りを均一に行うため、効率が最も高くなります。これが Java の IO の仕組みではないでしょうか ~
この処理方法は、遅いデバイスに最適です。遅いデバイスには、ディスク、ネットワーク、SSD などが含まれます。
スレッドと非同期これらの問題に対処する方法は非常に一般的で、有名な netty が行っているものです。
ようやく、redis がシングルスレッドである理由と、シングルスレッドとマルチスレッドをいつ使用するかが明確になりました。実際、これも非常に単純なことですが、基礎が整っていないと非常に恥ずかしいことです。良い。 。 。 。 。
Biyifa マスターの名言: シングルコア CPU がメモリにバインドされているときに最も効率的である理由について話しましょう
「オペレーティング システムの負荷分散をさせることはできません。なぜなら、私たちは自分自身の負荷を知っているからです。」デフォルトでは、単一のスレッドはシステム コールを行うときに CPU コアをランダムに使用します。Redis を最適化するために、ツールを使用して単一のスレッドを実行できます。スレッド 固定 CPU コアをバインドして、不必要なパフォーマンスの損失を軽減します。
Redis はシングルプロセスモデルのプログラムであり、マルチコア CPU を最大限に活用するために、1 台のサーバー上で複数のインスタンスを起動することがよくあります。 切り替えコストを削減するには、各インスタンスが実行されている CPU を指定する必要があります。
Linux では、タスクセットはプロセスを特定の CPU にバインドできます。スケジューラがプログラムを愚かにスケジュールすることを避けるため、またはマルチスレッド プログラムでのキャッシュ無効化のオーバーヘッドを避けるために、オペレーティング システムよりもプログラムのことをよく知っています。
以上がRedis がシングルスレッドなのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。