なぜredisは単一スレッドなのか?

2409 ワード

転載リンク:https://cloud.tencent.com/developer/article/1120615
高性能サーバはマルチスレッドで実現されるに違いないという誤りが以前からあった.
原因は簡単です.誤区2による:マルチスレッドは単一スレッドよりも効率が高いに違いありません.実はそうではありません.
その前に、CPU、メモリ、ハードディスクの速度について皆さんに知ってもらいたいと思います.そうすれば、もっと深く理解できるかもしれません.知らない友达は、CPUがメモリとハードディスクよりどれだけ速いかということです.
redisコアはもし私のデータがすべてメモリの中にあるならば、私の単一のスレッドの操作は効率が最も高くて、どうして、マルチスレッドの本質はCPUが複数のスレッドをシミュレートした情況なので、このようなシミュレートした情況は1つの代価があって、コンテキストの切替で、1つのメモリのシステムにとって、それはコンテキストの切替がなくて効率が最も高いです.redisは,1つのCPUで1つのメモリのデータをバインドし,そのメモリのデータに対して複数回読み書きを行う場合,いずれも1つのCPUで完了するので,単一スレッドで処理する.メモリの場合、このシナリオが最適なシナリオです.アリ沈問
一度のCPUコンテキストの切り替えは1500 ns程度なので.
メモリから1 MBの連続データを読み出すのにかかる時間は約250 usで、1 MBのデータが複数のスレッドから1000回読み取られたとすると、1000回の時間コンテキストの切り替えがあり、
それでは1500 ns*1000=1500 usがあって、私の単スレッドの1 MBのデータを読み終わってやっと250 usで、あなたは時間のコンテキストの切り替えだけで1500 usを使って、私はまだあなたが毎回少しのデータを読む時間を計算しません.
では、いつマルチスレッドのスキームを使用しますか?
答えは、下層のストレージなどが遅い場合です.例えばディスク
メモリは1つのIOPSのとても高いシステムで、私が1枚のメモリを申請したいため1枚のメモリを申請して、1枚のメモリを破壊して私は1枚のメモリを破壊して、メモリの申請と破壊は簡単です.メモリは動的に申請できるサイズです.
ディスクの特性は、IPOSは低く、スループットは高いです.これは、大量の読み書き操作が蓄積され、ディスクにコミットされると、パフォーマンスが最も高くなることを意味します.どうしてですか.
もし私が1つのトランザクショングループの操作(すでに分離されたトランザクション要求、例えば書き込み読み書き読み書き、このような5つの操作が一緒にある)を持っていたら、メモリの中で、IOPSが非常に高いので、私は1つ1つ完成することができますが、ディスクの中でもこのような要求方式があれば、
私の最初の書き込み操作はこのように完成しました.私はまずハードディスクにアドレスして、10 msぐらいかかります.それから、データを読むのに1 msかかるかもしれません.それから演算して(無視して)、ハードディスクに書き返して10 msで、全部で21 msです.
2つ目の操作は10 ms、3つ目は書くのに21 msかかりました.それから私は10 ms、書くのに21 ms、5つの要求は全部で83 msかかりました.これは最も理想的な場合です.これはメモリの中では1 ms未満です.
だからディスクにとって、スループットがこんなに大きいので、N個のリクエストを一緒に1つのbuffに入れて、一緒に提出するのが一番いいです.
方法は非同期:要求と処理のスレッドをバインドしないで、要求のスレッドは要求を1つのbuffの中に置いて、それからbuffがもうすぐいっぱいになって、処理のスレッドは更にこのbuffを処理します.その後、このbuffによってディスクに統一的に書き込み、またはディスクを読み取ることで、効率が最も高くなります.JAvaのIOってこんなことやったんじゃないの~
スローデバイスには、ディスク、ネットワーク、SSDなど、スローデバイスが最適です.
マルチスレッド、非同期の方法でこれらの問題を処理するのはよくありますが、有名なnettyはそうしています.
やっとredisがどうして単线程なのかをはっきり言って、いつ単スレッドでマルチスレッドにもはっきり言って、実は简単なもので、ただ基础が悪い时、本当に気まずいです.... 
補足マスターの語録:なぜシングルコアcpuがメモリをバインドするのが最も効率的なのか
「我々はオペレーティングシステムの負荷分散を任せることができない.我々自身が自分のプログラムをよく知っているので、CPUコアを手動で割り当てることができ、CPUを過度に占有することはない」.デフォルトでは、単一スレッドはシステム呼び出しを行う際にランダムにCPUコアを使用するが、Redisを最適化するために、ツールを使用して単一スレッドに固定されたCPUコアをバインドし、不要な性能損失を減らすことができる.
redis          ,        CPU,     server        。          ,               CPU。
Linux    taskset                CPU。              ,