あなたの await、OS まで届いてる? strace で覗く JavaScript の非同期
普段当たり前のように async / await を書きますが、「待っている間に OS は何をしているの?」 と聞かれると、曖昧な答えしか言えずモヤモヤしました。そこで本 LT では、Node.js のコードを strace でシステムコールレベルまで覗いて、JavaScript の await の正体を実際に確かめていきます。まず Promise.resolve() と fetch() を比べると、await には「OS まで降りるもの」と「降りないもの」があることが見えてきます。次に複数の fetch を「直列」と「Promise.all」で実行し、syscall のログを並べてみます。すると、並列にしているのは Promise.all そのものではなく、その効果は epoll_wait の往復をまとめている点にある、ということが分かってきます。最後に、この視点を Nuxt の useAsyncData / useFetch が直列になって遅くなるケースに繋げて、「なぜ束ねると速いのか」を OS の言葉で説明できるようになって帰っていただけたらと思います。
Hasuto
あなたの await、OS まで届いてる? strace で覗く JavaScript の非同期
普段当たり前のように async / await を書きますが、「待っている間に OS は何をしているの?」 と聞かれると、曖昧な答えしか言えずモヤモヤしました。そこで本 LT では、Node.js のコードを strace でシステムコールレベルまで覗いて、JavaScript の await の正体を実際に確かめていきます。まず Promise.resolve() と fetch() を比べると、await には「OS まで降りるもの」と「降りないもの」があることが見えてきます。次に複数の fetch を「直列」と「Promise.all」で実行し、syscall のログを並べてみます。すると、並列にしているのは Promise.all そのものではなく、その効果は epoll_wait の往復をまとめている点にある、ということが分かってきます。最後に、この視点を Nuxt の useAsyncData / useFetch が直列になって遅くなるケースに繋げて、「なぜ束ねると速いのか」を OS の言葉で説明できるようになって帰っていただけたらと思います。
