Skip to content
Naoya Tech
Go back

Why Node.js Is Fast on a Single Thread: Understanding Non-Blocking I/O

20:21 Backend

Overview

Node.js runs your code on a single thread, yet it can handle thousands of requests at once. This video untangles that apparent contradiction with a restaurant analogy: the restaurant is the server, the waiter is a thread, and each group of customers is a request.

One waiter can look after several tables because customers do not need the waiter the whole time.

Key Points

Chapters

概要

Node.jsは1本のスレッドでコードを動かしているのに、何千ものリクエストを同時にさばけます。この動画では、その一見矛盾した仕組みをレストランの例えで分解します。お店がサーバー、ウェイターがスレッド、お客さんの組がリクエストです。

ウェイター1人で複数のテーブルを見られるのは、お客さんがずっと店員を必要としているわけではないからです。

ポイント

  • リクエストは、CPUの仕事(考えている時間)とI/Oの仕事(ファイルや外部サービス、時間の経過を待っている時間)に分けられます。Apacheのような伝統的なサーバーはリクエストごとにスレッドを作りますが、スレッドごとのメモリとコンテキストスイッチのため、アクセスが増えると重くなります。
  • ノンブロッキングI/Oでは、あるリクエストが待っている間にスレッドが別のリクエストへ移ります。イベントループは時間のかかる処理を預けて、終わったものから拾い上げます。epoll、kqueue、IOCPを使うイベントデマルチプレクサが、たくさんのI/Oをまとめて見張ります。
  • 実際にI/Oを実行しているのは、C言語で書かれたライブラリーのlibuvです。ネットワークのI/OはOSが非同期で面倒を見て、ファイルの読み書きや暗号の計算は初期設定で4本のスレッドプールで処理されます。
  • Node.jsはWebサーバーやチャット、APIのようにI/Oの多い仕事に向いていて、動画の変換や機械学習のような計算の重い仕事には向きません。重い計算はワーカースレッドに逃がせます。
  • よくある3つの疑問にも答えます。awaitはブロッキングではないこと、ブロッキングが遅いのは切り替えの費用のせいであること、マルチスレッドは並行であって並列を保証しないことです。

チャプター

Watch on YouTube

Share this post on:

Previous Video
The Brian Kernighan Story: Creator of AWK and 50 Years with Unix and C
Next Video
Ken Thompson: The Man Who Created Unix, grep, UTF-8 and Go