Redisはシングルスレッドですが、同時I / Oはどのように行われますか?


170

Redisの基本を理解しようとして、興味深いブログ投稿を見つけました。

著者は述べています:

Redisはepoll / kqueueを使用してシングルスレッド化されており、I / O同時実行性の観点から無期限に拡張されます。

この文は不可解だと思うので、私は確かにスレッド全体を誤解しています。プログラムがシングルスレッドである場合、それはどのように同時に何かをしますか?とにかくサーバーがシングルスレッドの場合、Redisの操作がアトミックになるほど優れているのはなぜですか?

誰かが問題についていくつかの光を当てることができますか?

回答:


361

まあそれはあなたが並行性をどのように定義するかに依存します。

サーバー側のソフトウェアでは、同時実行性と並列処理は異なる概念と見なされることがよくあります。サーバーで同時I / Oをサポートするということは、サーバーが複数のクライアントに対応するために、1つの計算ユニットだけでそれらのクライアントに対応する複数のフローを実行できることを意味します。このコンテキストでは、並列処理とは、サーバーが(複数の計算ユニットを使用して)同時に複数のことを実行できることを意味しますが、これは異なります。

たとえば、バーテンダーは一度に1つの飲料しか準備できない一方で、複数の顧客の世話をすることができます。そのため、並列処理なしで並行性を提供できます。

この質問はここで議論されています: 同時実行と並列処理の違いは何ですか?

Rob Pikeによるこのプレゼンテーションも参照してください。

シングルスレッドプログラムは、I / O(逆)多重化メカニズムとイベントループ(Redisが行うこと)を使用することにより、I / Oレベルでの同時実行性を確実に提供できます。

並列処理にはコストがかかります。最新のハードウェアにある複数のソケット/複数のコアを使用すると、スレッド間の同期に非常にコストがかかります。一方、Redisのような効率的なストレージエンジンのボトルネックは、多くの場合、CPUのすぐ前のネットワークです。したがって、分離されたイベントループ(同期を必要としない)は、効率的でスケーラブルなサーバーを構築するための優れた設計と見なされます。

Redisの操作がアトミックであるという事実は、単にシングルスレッドのイベントループの結果です。興味深い点は、原子性が追加コストなしで提供されることです(同期は必要ありません)。同期のオーバーヘッドを犠牲にすることなく、楽観的ロックやその他のパタ​​ーンを実装するためにユーザーが利用できます。


135
素敵なバーテンダーのアナロジー:)
セルジオトゥレンツェフ2012年

3
v4のは、この点でゲームチェンジャーである-で私の答えを参照してくださいstackoverflow.com/a/45374864/3160475 :)
Itamarハーバー

1
答えと比較について私が本当に嫌いな唯一のことは、並行性が並行して動作しないように見えることであり、タスクを非同期で実行してこれをテストし、最終的に並列であると見なされます。その記事の文脈における並列処理とは、複数のスレッドで実行できるマルチコアの性質を指します。つまり、それがスレッドセーフであることを参照する理由です。
クリスチャンマシュー

2020年もまだ有効ですか?
Roberto Manfreda

21

はい、RedisはユーザーレベルのOTOHでシングルスレッドであり、すべての非同期I / Oはカーネルスレッドプールおよび/またはスプリットレベルのドライバーでサポートされています。

' 同時 'には、ネットワークイベントをソケットステートマシンに配布することが含まれます。これはシングルスレッドで、1つのコアで(ユーザーレベルで)実行されるため、これを同時実行とは呼びません。その他は異なります。

I / O同時実行性観点から無期限に拡張する」は、真実をもって経済的になるだけです。彼らは、「クライアントごとに1スレッドよりも優れたスケーリングが可能で、クライアントがあまり要求しないことを条件に」と言った場合、より多くの信念を抱くかもしれませんが、「他の非同期ソリューションによる重い負荷で吹き飛ばされた」と感じるかもしれませんユーザーレベルですべてのコアを使用します。


コンテキスト外の可能性がありますが、(INCRコマンドなどによる)各更新操作にはロックが含まれていますか?1000の同時リクエストがあり、キーに対して1つのインクリメント操作(リクエストごと)がある場合、変数は1000回しかインクリメントされません。
アマンダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.