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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
The agentic SEO stack - context over prompts
schlessera
0
860
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
Are puppies a ranking factor?
jonoalderson
1
3.8k
Writing Fast Ruby
sferik
630
63k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
380
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
490
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
210
Odyssey Design
rkendrick25
PRO
2
750
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
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 パフォーマンスチェックポイント アプリケーションのパフォーマンスを保つためにチェックするポ イントについてまとめました 実際の運用では計測しないとわからない事も多い これらパターンが起きてないかをまず確認すると原因を絞り込 みやすいと思います
ありがとうございました