1. ホーム
  2. multithreading

[解決済み】Redisはシングルスレッドですが、同時I/Oはどのように行うのですか?

2022-04-17 21:08:15

質問

Redis の基本を理解しようとしたところ、興味深いものに出会いました。 ブログ記事 .

著者はこう語る。

Redisはepoll/kqueueでシングルスレッド化され、I/Oの並行性という点では無限にスケールします。

私はきっとスレッドというものを誤解しているのでしょう、この発言には不可解さを感じます。もしプログラムがシングルスレッドなら、どうやって同時並行的に何かを行うのでしょうか?サーバーがシングルスレッドなら、Redisのオペレーションがアトミックであることがなぜそんなに素晴らしいのでしょうか?

どなたか、この問題に光を当てていただけませんか?

解決方法を教えてください。

それは、並行処理をどのように定義するかによります。

サーバーサイドのソフトウェアでは、並行処理と並列処理は異なる概念として扱われることが多い。サーバにおいて同時入出力をサポートするということは、1台の計算ユニットで複数のクライアントに対応する複数のフローを実行し、複数のクライアントにサービスを提供できることを意味します。ここでいう並列性とは、サーバーが(複数の計算ユニットで)同時に複数のことを実行できることを意味し、これは異なるものである。

例えば、バーテンダーは一度に1つの飲み物しか用意できないのに、何人ものお客さんの面倒を見ることができます。つまり、バーテンダーは並列処理を行わずに同時並行処理を行うことができるのです。

この問題は、ここでも議論されています。 並行処理と並列処理の違いは何ですか?

こちらもご覧ください 本プレゼンテーション ロブ・パイク

シングルスレッド・プログラムは、I/O(デ)マルチプレクシング・メカニズムとイベント・ループ(これはRedisが行うものです)を使用することによって、I/Oレベルで確実に並行性を提供することができます。

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

Redisの操作がアトミックであることは、単にシングルスレッドのイベントループの帰結です。興味深い点は、アトミック性が余分なコストなしに提供されることです(同期を必要としない)。ユーザはこれを利用して、同期のオーバーヘッドを支払うことなく楽観的ロックや他のパターンを実装することができます。