Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
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
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
390
The Language of Interfaces
destraynor
162
27k
A Tale of Four Properties
chriscoyier
163
24k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.9k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
510
Large-scale JavaScript Application Architecture
addyosmani
515
110k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
260
Music & Morning Musume
bryan
47
7.4k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
450
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Docker and Python
trallard
47
4.2k
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 パフォーマンスチェックポイント アプリケーションのパフォーマンスを保つためにチェックするポ イントについてまとめました 実際の運用では計測しないとわからない事も多い これらパターンが起きてないかをまず確認すると原因を絞り込 みやすいと思います
ありがとうございました