アバンタイトル
IT分野は範囲がとても広いです。そのため、過去問を解いていると1ページに何個も理解できない単語が出てきます。それを一気に理解しようとするのはとても骨が折れるし、やる気も続きません。
しかし、そんな時は1周まわって1つのことに徹底集中してみるのはどうでしょうか?覚えなきゃいけないことが沢山あると、終わりが見えずモチベーションが続きません。
でも、「今日はこの1つをマスターしよう!」と1つにフォーカスすればゴールが見えて、集中力も続くようになります。また、一点集中型なので理解力も深まり応用も効くようになります。
ということで、当サイトでは1点集中をコンセプトに解説を展開しています。勉強法が定まっていなかったり悩んでいる方は是非、続きをご覧になってみてはいかかでしょうか?
はじめに
今回も中二病心を刺激するワードを取り扱います。それがThunderingHerd問題です。
今回学ぶこのフレーズに対しては、「難しそー」とか「役に立つの?」といった思考は一旦おいといて「ただかっこいいから知りたい!」というシンプルな思考でStudyしていってほしいです。
そのためにこの記事では、初心者にも超分かりやすく解説していきます。ただの試験対策、ただの退屈な勉強、という感覚ではなく、「人前でこのフレーズを言ってる自分を想像したらカッコよかったから」とか、そういう軽い気持ちでStudyしていきましょう!また、この記事はだれでも読み進められる構成になっているので、最後まで楽に進めます。そして、読み終わった頃には、「あれ?知らぬ間に理解が深まっているぞ」ということに気づくでしょう。それでは、一緒に学んでいきましょう!そして、「勉強しなきゃ!」という義務感ではなく「かっこいいから知りたい!」という単純な理由で楽しみながらStudyしていきましょう!
Thundering Herd問題の直訳は「雷鳴の群れ問題」です。中二病にぐっ刺さりますよね。
【ここで扱う疑問】
- ThunderingHerd問題の概要は?
- 結局、超簡単に言うと?
- どんな対策法があるの?
- プレフェッチってなに?
- プレフェッチのメリット・デメリットは?
- プロセスってなに?
- スレッドってなに?
- バックオフってなに?
ThunderingHerd問題の概要は?
Thundering Herd問題は、多くのプロセスやスレッドが同時に1つのリソース(たとえばファイルやネットワーク接続)を待っているときに発生するパフォーマンスの問題です。特に、リソースが利用可能になった瞬間に待機していたプロセスやスレッドが一斉に起動してリソースを奪い合う状況を指します。
結局、超簡単に言うと?
Thundering Herd問題とは、みんなが一斉に1つしかない扉に走り出すことで、全体が進まず結果的に、遅くなってしまう問題のことです。
1.シナリオ:
- あなたがファイルを開こうとするアプリケーションを複数起動していると想像してください。
- このファイルは一度に1つのアプリケーションしかアクセスできないとします。
2.問題の発生:
- ファイルが一度に1つのアプリケーションにしか利用できないため、他のアプリケーションはファイルが利用可能になるまで待機します。
- ファイルが開けるようになった瞬間、待機していた全てのアプリケーションが同時に動き出し、ファイルにアクセスしようとします。
3.結果:
- 一度に多くのアプリケーションが動き出すため、CPUやディスクアクセスに負担がかかり、システム全体のパフォーマンスが低下することがあります。
どんな対策法があるの?
Thundering Herd問題の対策にはいくつかの方法があります。これらの対策を使うことで、リソース競合を減らし、システムのパフォーマンスを向上させることができます。
1. 通知の分散
- 方法:リソースが利用可能になったときに、待機している全てのプロセスやスレッドに通知するのではなく、特定のプロセスやスレッドにだけ通知するようにする。
- 技術:
- epoll(Linux)やkqueue(BSD系OS):これらのシステムコールは、イベントの発生を効率的に監視し、特定のプロセスやスレッドにのみ通知を行います。
2. バックオフアルゴリズム
- 方法:リソースの競合が発生した場合、すぐに再試行せずに一定時間待ってから再試行する。
- 技術:
- 指数バックオフ:最初は短い待ち時間を設定し、再試行のたびに待ち時間を倍増させる。例えば、1秒待ち、次に2秒待ち、その次に4秒待つ、といった具合です。
3. プロセスの優先順位設定
- 方法:プロセスやスレッドの優先順位を設定し、重要度の高いプロセスが優先的にリソースを取得できるようにする。
- 技術:
- niceコマンド(Linux):プロセスの優先度を設定するために使用します。
- スレッド優先度:プログラム内でスレッドの優先度を設定するAPIを使用する。
4. リソースのプレフェッチ
- 方法:事前に必要なリソースを確保しておくことで、リソース競合を減らす。
- 技術:
- プレフェッチアルゴリズム:プログラムの実行前に、必要なデータやリソースをあらかじめ読み込んでおく。
5. イベントドリブンアーキテクチャ
- 方法:イベントが発生するまでスレッドやプロセスをブロックせず、イベントが発生したときにのみ処理を行う。
- 技術:
- Node.js:イベントドリブンのノンブロッキングI/Oを使用しており、多数の同時接続を効率的に処理します。
- async/awaitやコールバック:非同期処理を使用して、リソースが利用可能になるまで他の作業を続ける。
6. キューを使用する
- 方法:リソースを待機するプロセスやスレッドをキューに入れ、順番にリソースを割り当てる。
- 技術:
- メッセージキュー:RabbitMQやApache Kafkaのようなメッセージブローカーを使用して、リソースのリクエストをキューに入れる。
- ジョブキュー:リソースを必要とするジョブをキューに入れ、順番に処理する。
プレフェッチってなに?
プレフェッチ(prefetch)とは、必要となるデータやリソースを実際に使う前にあらかじめ取得しておく技術です。これにより、データやリソースが必要になったときにすぐに利用でき、システムのパフォーマンスを向上させることができます。
- 例え話:あなたが友達と映画を見るとき、ポップコーンを映画が始まる前に買っておくことを想像してください。映画が始まってから買いに行くと、映画の重要なシーンを見逃すかもしれませんが、事前に準備しておくことで、スムーズに映画を楽しむことができます。
- 基本原理:プレフェッチは、システムが将来必要とする可能性が高いデータやリソースを予測し、前もってメモリやキャッシュに読み込んでおく技術です。これにより、実際にデータが必要になったときにディスクから読み込む時間を節約し、アクセス速度を向上させます。
- 使用例:
- Webブラウザ:ユーザーが次にアクセスする可能性が高いページを事前に読み込んでおくことで、ページ遷移をスムーズにします。
- プロセッサ:プロセッサは、次に実行される命令やデータを予測し、キャッシュに読み込むことで、処理速度を向上させます。
- オペレーティングシステム:ファイルシステムで、ユーザーがアクセスする可能性が高いファイルを事前にメモリに読み込むことで、ファイルアクセスを高速化します。
プレフェッチのメリットは?
- 高速化:必要なデータやリソースがすでにメモリやキャッシュに存在するため、ディスクアクセスの遅延を減少させ、システムの応答時間を短縮します。
- 効率向上:特にディスクI/O(入力出力)の待機時間が長い場合、プレフェッチによってCPUの待機時間を減らし、システム全体の効率を向上させます。
プレフェッチのデメリットは?
- メモリの浪費
- 説明:プレフェッチによって事前にデータを読み込むため、メモリを余分に使用します。これにより、メモリの利用効率が低下し、他の重要なデータやプログラムがメモリ不足に陥る可能性があります。
- 例:もし予測が外れて、プレフェッチしたデータが実際には使用されなかった場合、そのメモリが無駄になります。
- I/O帯域幅の浪費
- 説明:プレフェッチによってディスクから大量のデータを読み込むと、I/O帯域幅が消費され、他のI/O操作のパフォーマンスが低下する可能性があります。
- 例:大量のプレフェッチが行われると、重要なディスク操作が遅れることがあります。
- 予測の難しさ
- 説明:正確なプレフェッチを行うためには、将来のデータアクセスパターンを正確に予測する必要があります。しかし、アクセスパターンが変動する場合、予測は難しくなります。
- 例:ユーザーの操作が予測不可能な場合、プレフェッチがうまく機能しないことがあります。
- オーバーヘッド
- 説明:プレフェッチのアルゴリズムを実装し、管理するための追加の計算リソースが必要になります。これにより、システム全体の負荷が増加する可能性があります。
- 例:複雑なプレフェッチアルゴリズムは、実行に時間がかかり、システムの他の部分に影響を与えることがあります。
- キャッシュの汚染
- 説明:プレフェッチされたデータがキャッシュを占有すると、他の重要なデータがキャッシュから追い出されることがあります。これにより、キャッシュの有効性が低下することがあります。
- 例:頻繁に使用されるデータがキャッシュから追い出され、アクセス速度が低下することがあります。
これらのデメリットを理解し、適切に管理することで、プレフェッチの効果を最大限に引き出すことができます。
まとめ
Thundering Herd(サンダリング ハード)問題とは、多数のスレッドやプロセスが同時に同じリソースにアクセスしようとすることで、システムが過負荷になり、効率が低下する問題です。特にリソースの解放や同時通知が原因となる場合が多いです。
しかし、その対策としては優先順位、通知の分散、プレフェッチなどなど、他にも様々な対策法が取られています。これらの対策のもと、適切にリソース管理をしていきましょう!
おまけ:用語解説
プロセスってなに?
プロセスとは、コンピュータ上で実行中のプログラムのことです。
- プログラムとプロセスの違い:
- プログラムは、ディスク上に保存されている実行可能なファイル(たとえば、Wordやブラウザなどのアプリケーション)のことです。
- プロセスは、そのプログラムが実行されている状態のことを指します。つまり、プログラムがメモリに読み込まれて実際に動いている状態です。
スレッドってなに?
スレッドは、プロセス内でさらに分割された実行単位のことです。
- 例え話:プロセスを大きな仕事と考えると、その中でスレッドはその仕事を分担するスタッフのようなものです。たとえば、レストランでのプロセスが「料理を作ること」だとすると、スレッドは「サラダを作るスタッフ」「スープを作るスタッフ」「デザートを作るスタッフ」のように、異なる部分を担当します。
- プロセスとスレッドの違い:
- プロセスは、実行中のプログラム全体です。
- スレッドは、そのプログラム内の一部分であり、プロセスの中で実行される軽量なサブプロセスのようなものです。
バックオフってなに?
バックオフ(backoff)とは、リソースが利用可能になるまでの待機時間を段階的に増やしながら再試行するアルゴリズムや戦略のことです。これにより、同じリソースを待っている多くのプロセスやスレッドが一斉に動き出すのを防ぎ、システム全体の負荷を軽減します。
- 基本原理:リソースが利用できないとき、次の試行をすぐに行うのではなく、一定時間待ってから再試行します。この待機時間を徐々に長くすることで、リソースが利用可能になるまでの試行回数を減らし、システム全体の負荷を軽減します。
- 例:指数バックオフ(Exponential Backoff)
- 最初の試行が失敗したら、短い待機時間(たとえば1秒)を置いて再試行します。
- 次に再試行が失敗したら、待機時間を倍にして(たとえば2秒)再試行します。
- さらに失敗したら、待機時間をさらに倍にして(たとえば4秒)再試行します。
- これを繰り返し、最大待機時間に達するまで続けます。
おわりに
本日はここまでです。今日はThundering Herd問題をStudy&マスターしてきました!ただカッコいいからという理由だけの方が、意外と集中して向き合うことができたのではないでしょうか?
そうなんです!「勉強しなきゃ!知識つけなきゃ!」のように勉強を義務にしてしまうと長く続きません。だからこそ、私たちは楽しんで知識を身に着けていきましょう!そんなことをやってるうちに気づいたらスペシャリストになっているかもしれません!
これからも、今日みたいに「the勉強するぞ!」という意気込みではなく、ヌルっと気づいたら知識が増えてた!みたいな軽い感覚でStudyを一緒にしていきましょう!
本日はここで、終わります。ありがとうございました。またお会いしましょう!では、さらばじゃ!