【サンダリングハードもんだい】

サンダリングハード問題 とは?

最終更新:
💡 全員が起きたのに、ごちそうは1人前だけだった

1つのイベントを待つ多数の処理が一斉に起こされ、必要以上の競合や無駄な起床が生じる現象。キャッシュが使えなくなって同じデータへアクセスが集中する場合にも使う呼び名。

📌 このページのポイント
サンダリングハード:無駄な起床 新しい接続 1件 待ち手1 起床 受付成功 接続を得る 待ち手2 起床 空振り 仕事なし 待ち手3 起床 空振り 仕事なし 待ち手4 起床 空振り 仕事なし 大勢が起き、接続を得たのは1つ 不要な起床・競合が増える
1件の接続で複数の待ち手が起こされる例。矢印は起床の通知と結果を示します。すべてのepollの使い方で起こるわけではなく、EPOLLEXCLUSIVEも必ず1つだけを起こす保証ではありません。
ひよこ ひよこ
サンダリングハード問題って何? なんだか強そうな名前だね!
ペンギン先生 ペンギン先生
直訳すると「雷のように押し寄せる群れ」だよ。1つのイベントを待っていた大勢のプロセスやスレッドが一斉に起こされるのに、実際に仕事ができるのは1つだけで、残りは無駄に起きてまた眠る現象のことだね。
ひよこ ひよこ
どんな場面で起きるの?
ペンギン先生 ペンギン先生
代表例は、複数のワーカーが同じ待ち受けソケットで新しい接続を待つ場面だよ。たとえば別々に作ったepollで同じソケットを、起床を絞る指定なしで監視すると、接続1件で複数の待ち手が起こされる場合がある。競合の結果acceptできた側以外は空振りになるよ。残りはCPU時間とコンテキストスイッチを無駄にするんだ。
ひよこ ひよこ
起きるだけなら大したことないんじゃないの?
ペンギン先生 ペンギン先生
少数なら影響が小さい場合もあるよ。でも、不要な起床が増えると、競合やコンテキストスイッチの処理が負担になり得る。実際のCPU負荷や待ち時間を見て、どこで余分な処理が起きているかを調べるんだ。
ひよこ ひよこ
どんな対策があるの?
ペンギン先生 ペンギン先生
LinuxのEPOLLEXCLUSIVEは、同じ対象を、別々に作った複数のepollで待つときに、通知する待ち手を絞る指定だよ。1つ以上が通知されるので、必ず1つだけ起こす保証ではない。nginxのaccept_mutexは接続の受付をワーカーで順番に行う。SO_REUSEPORTで待ち受けソケットを分ける方法もあり、使い方や環境に合わせて選ぶんだ。
ひよこ ひよこ
ほかにも同じ名前で呼ばれる現象はあるの?
ペンギン先生 ペンギン先生
あるよ。同じキャッシュが使えなくなり、大勢が同時に元のデータを取りに行くと、取得先へ負荷が集中する。これはキャッシュスタンピードとも呼ばれるんだ。同じデータを同時に取りに行く処理を1回にまとめる方法がある。失敗後の再試行は、指数バックオフだけではタイミングがそろうことがあるので、ジッターも組み合わせるよ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「サンダリングハード問題」って出てきたら「1つの合図で大勢が一斉に起きて無駄が出る現象」と思えればだいたいOK!
📖 おまけ:英語の意味
「Thundering herd problem」 = 雷鳴のように押し寄せる群れの問題
💬 thunderingは雷のようにとどろく、herdは動物の群れを表す言葉。一斉に起きたり押し寄せたりする処理を、大群にたとえた表現だよ。

参考資料

← 用語集にもどる