龍昌餃子で理解するWebサーバーの並行処理モデル - 東葛.dev #9
by
Koji NAKAMURA
×
Copy
Open
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
龍昌餃子で理解する Webサーバーの並行処理モデル 2025.11.07 東葛.dev #9 Koji NAKAMURA (@kozy4324)
Slide 2
Slide 2 text
Koji NAKAMURA ● 𝕏: @kozy4324 ● GitHub:@kozy4324 ● Classi株式会社所属 ● Kashiwa.rb 自己紹介
Slide 3
Slide 3 text
龍昌餃子とは???
Slide 4
Slide 4 text
No content
Slide 5
Slide 5 text
龍昌餃子🍜🥟🍺 ● kozy4324が大好きな柏駅前すぐの中華屋さん ○ 南口から東側に出て徒歩1分! ● JR常磐線ホーム(南柏側)から見えている ● 早い、安い、美味い!を体現している ○ ???「家賃を払っていない味がする」
Slide 6
Slide 6 text
龍昌餃子のココが好き!(1) ● お疲れセットが好き! ● オーダーできるの1人1回だと思うじゃん? ● なんと無限にできる ○ バグでは? ○ 脆弱性では?
Slide 7
Slide 7 text
● お疲れセットで生ビールと麻婆豆腐を注文します ● 麻婆豆腐が30秒ぐらいで提供されます ○ ビールを追い抜いてきた! ○ そんなことある?! ○ ???「キャッシュでは?!?!」 ● 料理の提供時間が早すぎてバグっている 龍昌餃子のココが好き!(2)
Slide 8
Slide 8 text
提供時間が早すぎるので ある「説」が浮かびました
Slide 9
Slide 9 text
龍昌餃子 お客さんが C10K 来ても捌ける説
Slide 10
Slide 10 text
C10K問題とは C10K問題(英語: C10K problem)とは、Apache HTTP ServerなどのWebサーバソフトウェアとクライアントの通信に おいて、クライアントが約1万台に達すると、Webサーバーの ハードウェア性能に余裕があるにもかかわらず、レスポンス性 能が大きく下がる問題である。 引用元: https://ja.wikipedia.org/wiki/C10K問題
Slide 11
Slide 11 text
表題に戻ります
Slide 12
Slide 12 text
龍昌餃子で理解する Webサーバーの並行処理モデル 2025.11.07 東葛.dev #9 Koji NAKAMURA (@kozy4324)
Slide 13
Slide 13 text
● 中華料理屋(龍昌餃子)をメタファーにすると、Webサーバー の並行処理モデルがうまく説明できるのでは? 本発表のモチベーション
Slide 14
Slide 14 text
● クライアント → お客さん ● Webサーバー → お店&従業員 Webサーバーの中華屋メタファー リクエスト レスポンス
Slide 15
Slide 15 text
お客さんは同時にたくさんやって来る リクエスト レスポンス リクエスト レスポンス リクエスト レスポンス リクエスト レスポンス リクエスト レスポンス
Slide 16
Slide 16 text
● プロセスベース ● スレッドベース ● ノンブロッキングI/O + イベント駆動 大量リクエストを捌くための並行処理モデル
Slide 17
Slide 17 text
プロセスベースのイメージ リクエスト レスポンス リクエスト レスポンス リクエスト レスポンス リクエスト レスポンス リクエスト レスポンス
Slide 18
Slide 18 text
● プロセスとは実行中のプログラムの単位 ○ OSが独立したメモリ空間とリソースを割り当てる ● 各プロセスは独立して動作し、直接メモリを共有しない ● 1リクエストごとに1プロセスを割り当てる ○ メリット: 1つのプロセスが落ちても他に影響しない ○ デメリット: メモリ消費、プロセス生成コストが高い プロセスベース
Slide 19
Slide 19 text
● OSは fork() システムコールでプロセスを複製できる ○ 親プロセスの状態を引き継いだ子プロセスを生成する ● Webサーバーでは、リクエストを捌くための複数の子プロセス (ワーカープロセス)を立ち上げて待機させる方式が多い forkによるプロセス生成
Slide 20
Slide 20 text
● 独立性や生成コストを考えると「従業員ごとお店を丸々複製し ている」みたいなもの ● 当然お店の数だけ固定費もかかる ○ アプリケーションならプロセス数だけメモリを消費 ● 言うなればチェーン店やフランチャイズでは? ○ なお龍昌餃子は独立店である 中華料理屋で例えると...
Slide 21
Slide 21 text
スレッドベースのイメージ リクエスト レスポンス リクエスト レスポンス リクエスト レスポンス リクエスト レスポンス リクエスト レスポンス
Slide 22
Slide 22 text
● スレッドはプロセス内で動作する軽量な実行単位 ● プロセス内スレッドはメモリ空間やリソースを共有する ● 1リクエストごとに1スレッドを割り当てる ○ メリット: メモリ効率が良く、生成コストが低い ○ デメリット: スレッド間の干渉やバグが発生しうる スレッドベース
Slide 23
Slide 23 text
● 「従業員がたくさん働いている」みたいなイメージ ● 店舗内の資源は共有されるため、同時に△人以上で扱っては ダメ!という資源があると色々と大変 ○ アプリケーションならスレッドセーフが要求される ● 従業員の数だけ人件費はかかる ○ 複数店舗ほどではないが従業員の数だけコスト発生 ● なお龍昌餃子の厨房はいつみても1〜2人で回している ○ なんでそんなに提供スピード早いん??? 中華料理屋で例えると...
Slide 24
Slide 24 text
C10K問題
Slide 25
Slide 25 text
● 1万同時接続を扱おうとするとスケールできない ● なぜか? ○ メモリの枯渇 ○ コンテキストスイッチ切り替えによるCPU飽和 ○ I/O待ちによるブロック ○ etc… C10K問題 vs プロセスベース, スレッドベース
Slide 26
Slide 26 text
● C10K問題への解決策として発生した設計 ● これまではブロッキングI/Oが前提だった ○ 各I/O操作でブロックされる ○ そもそもWebサーバーはI/Oが多い ○ プロセスやスレッドによる多重化が必須だった ● ノンブロッキングI/O + 準備完了でイベント通知されるOSの機 構が実用的になったのが2000年代以降(らしい) ○ 代表的なアプリケーション: nginx, Node.js ノンブロッキングI/O + イベント駆動
Slide 27
Slide 27 text
イベント駆動・ノンブロッキングI/O → ワンオペ!? リクエスト レスポンス リクエスト レスポンス リクエスト レスポンス リクエスト レスポンス リクエスト レスポンス
Slide 28
Slide 28 text
● ブロッキングI/O + プロセスベース or スレッドベース ○ I/O完了待ちまでCPUが待ち状態で無駄が多い ○ メモリ消費やコンテキストスイッチ切り替えもある ● ノンブロッキングI/O + イベント駆動 ○ I/O完了待ちによるCPUの待ち状態が無くなる ○ 1プロセス(1スレッド)で多くのリクエストが捌ける つまりどういうことだってばよ
Slide 29
Slide 29 text
● 従業員が常に無駄なく休みなく働いている ○ 少数精鋭 ○ 休みがないのはブラック企業では... ● 龍昌餃子の厨房はいつみても1〜2人で回している ○ ノンブロッキングI/O + イベント駆動じゃん ○ お客さんが C10K 来てもイケる 中華料理屋で例えると...
Slide 30
Slide 30 text
● プロセスベース + スレッドベース ○ 安全性と分離性を保ちつつ並列性を高める ● スレッドベース + ノンブロッキングI/O + イベント駆動 ○ nginx, Node.js がそう ○ マルチプロセッサ(複数CPUコア)を活用するには、プロセ スかスレッドを多重化する必要がある 補足: 処理モデルは組み合わせて利用可能
Slide 31
Slide 31 text
まとめ
Slide 32
Slide 32 text
龍昌餃子 お客さんが C10K 来ても捌ける説
Slide 33
Slide 33 text
説の検証 ● 龍昌餃子はノンブロッキングI/O + イベント駆動 ● つまりお客さんが C10K 来ても捌ける ● ホンマか...!?
Slide 34
Slide 34 text
「推測するな、計測せよ」
Slide 35
Slide 35 text
● つまり龍昌餃子に飲みに行こう! ● 龍昌餃子に少しでも興味を持ってもらえたらヨシ 計測 is …
Slide 36
Slide 36 text
🥟EOF🍺