Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
tfcon2022.pdf
Search
kohta ito
May 14, 2022
1.7k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
tfcon2022.pdf
kohta ito
May 14, 2022
More Decks by kohta ito
See All by kohta ito
nodejs-commit
koh110
0
1k
Angular and me
koh110
0
2.1k
bonfire frontend#1
koh110
3
1.8k
Node学園祭2017.pdf
koh110
3
2.4k
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
260
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
420
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Navigating Team Friction
lara
192
16k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
260
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Ethics towards AI in product and experience design
skipperchong
2
420
Being A Developer After 40
akosma
92
590k
Transcript
伊藤康太(@koh110) Node.js パフォーマンスチェックポイント 1
Node.js パフォーマンスチェックポイント Node.jsはフロントエンドと同じJavaScriptでバックエンドを記述 できるメリットがあります。 ですが、フロントエンドとバックエンドではパフォーマンス向上に 必要な観点が異なります。 本LTではパフォーマンスの観点でチェックするポイントを紹介し ます。
Node.jsの特徴 Node.jsを特徴づけるポイント • 非同期のイベント駆動形ランタイム • Non Blocking I/Oとシングルスレッド V8(JavaScriptエンジン)+ libuv(非同期I/O)
JavaScriptの世界とI/Oをつなぐためにイベントループがある パフォーマンスを低下させないために、イベントループを極力止め ない事が重要なポイント
Node.js パフォーマンスチェックポイント 1. 同期関数の利用がないか 2. 巨大なJSONを扱っていないか(JSON.parse/JSON.stringify) 3. 長いループがないか 4. 最新のLTSを利用しているか
5. 追加デプロイ先が自前サーバーの時 • cluster化しているか • ファイルディスクリプタの上限数が適切か
同期関数の利用がないか ~Syncなどの同期処理がリクエストのたびに 実行されないかをチェック 同期処理がリクエストのたびに実行されてい ないかを確認する 抜き出せるものはサーバーの起動時にだけ 通るように集約する 非同期関数がある場合はそちらを利用する const fs
= require('fs'); app.get('/', (req, res) => { // ここで他の処理もストップしてしまう const html = fs.readFileSync('./index.html'); res.status(200).send(html); });
巨大なJSONを扱っていないか JSON.parse/JSON.stringifyは同期処理 できるだけ数を少なくなるようにする 特にライブラリ内部で利用されていると気づきにくい JSONのサイズによってかかる時間も増加するため、サイズ を小さく保つことも重要 APIレスポンスなどが運用の時間経過で大きくなりやすいの で注意する 最大1MB以内程度を目安としている >
JSON.parse('{"foo":"bar"}') { foo: 'bar' } > JSON.stringify({ foo: 'bar'}) '{"foo":"bar"}'
長いループがないか ループ処理も基本的には同期処理 1つのループが長くならないよう気を付ける 運用の時間経過とともに長くなってしまう事がある ループが分割できないかを検討する またはStreamとして扱えないかを検討する (最近はAsyncIteratorが使えるのでStreamを最初に考える事が多い)
追加デプロイ先が自前サーバーの時 サーバーを用意する時は次の設定を最初に確認する • cluster化しているか • ファイルディスクリプタの上限数が適切か CaaSやPaaSが増えて考慮しないことも増えた CaaSやPaaSはサーバーリソースを使い切るより、横に並べたほうがいい場合が多い
cluster化しているか clusterを利用するとマルチコアを利用してシンプルにパ フォーマンスを向上できる 簡単に言えばfork数分パフォーマンスがあがる CPUの張り付きを避けるために 「CPU数/2」や「CPU数-1」までforkすることが多い const cluster = reuqire('cluster');
if (cluster.isPrimary) { // ワーカープロセスを3つまでforkする for (let i = 0; i < 3; i++) { cluster.fork(); } // ワーカープロセスが終了したら再度forkする cluster.on('exit', (worker, code, signal) => { cluster.fork(); }); } else { server.listen(3000, () => { console.log('Listening on', server.address()); }); }
ファイルディスクリプタの上限数が適切か Node.jsはひとつのプロセスで多くのリクエストを受けるた め、1プロセスが大量のファイルを扱います。 ファイルディスクリプタの上限値がデフォルト値だと足りなく なりがち 十分大きな値となるよう設定する(`65535`など) $ ulimit -n #
全然足りない 1024
最新のLTSを利用しているか Node.jsはV8というエンジンでJavaScriptを解釈し実行します V8のパフォーマンスはアプリのパフォーマンスに直結する V8はバージョンアップで大きく高速化されることも珍しくない (V8 blogを眺めるのがおすすめ) Node.jsのバージョンをあげないとV8の恩恵を受けられない なるべく最新のLTSに追従できるようにしておく
Node.js パフォーマンスチェックポイント アプリケーションのパフォーマンスを保つためにチェックするポ イントについてまとめました 実際の運用では計測しないとわからない事も多い これらパターンが起きてないかをまず確認すると原因を絞り込 みやすいと思います
ありがとうございました