Node.js App debug, perf up 戦略
参考
方針
memory leak 検出
DevTools + debugger アタッチによりアプリケーションのデバッグが可能 node --inspect=0.0.0.0:9229 app Docker コンテナ内で利用するには 0.0.0.0 が味噌
ホスト側で動作させる際に確認していないが --inspect のみでも良さそう
実行時ステップは --inspect-brk で確認可能
ホスト側の Chrom{e, ium} なら
https://gyazo.com/6b987cf8a5467d6758803013f8dc474b
こんな表示が出てくるので押下
CPU Usage ほか総合的診断
nearForm という Node.js コミッタが集まった組織で開発されている
cpu, memory, event loop, handle 4点をダンプを取ってグラフ化する HTML を提供する
問題のある箇所は警告 ⚠️ を表示しヒントを提供
使い方
基本的にはアプリケーション起動時のコマンドをラップする CLI を利用
(npx) clinic doctor -- node app
実行時プロセスの cwd に .clinic というディレクトリを作成しトレースを格納、最終的に html に仕上げる
clinic upload --private .clinic/xxxxxxxx のようにアップロードも可能
コンテナ内の場合は CLINIC_JWT 環境変数に特定のトークンを仕込んで upload する必要がありそう
アプリが起動し続ける限りトレーシングするので kill -SIGINT {pid} でプロセスを落とす
コンテナ内に入らないとダメなので docker exec しシェルログイン
https://gyazo.com/33eba9b69060b0d6347afe44b4ce09fc
上記スクショだと clinic を起動したプロセス、50 を落とす kill -SIGINT 50
https://gyazo.com/91721e48f46cd663c848f68a8121ea04
このような表示が出れば HTML も作成されている
https://gyazo.com/fef5e49ff931d44ce51850d31e03c89b
課題
ローカル以外で実現する場合、コンテナの中に入れる状況の確立が必要そう
負荷テスト
gatling っぽい autocannon を利用する
CLI も提供しているがリクエストバリエーションやヘッダ追加などを鑑みて programmable に実装
code:js
const result = async autocannon({
url: ENDPOINT,
method: "POST",
connections: 100, // 同時接続数 defalut: 10
duration: 10, // 実施時間 default: 10
// amout: 100, // 実施リクエスト数、指定すれば duration は無視される
pipelining: 2, // HTTP パイプラインの数 defalut: 1
headers: {
origin: HOST,
referer: ENDPOINT,
cookie: "sess=xxxxxyyyyyzzzzz",
"content-type": "application/json"
},
body: "GraphQL Queryなど",
});
console.log(result);
オプションが多いのできっともっと出来ることがあるはず
gatling のように n 秒毎に m 数リクエスト増やすことができるかまで未確認
CLI と違って result は JSON オブジェクト、表示の加工は必要そう
https://gyazo.com/2cb552d27c0c11377ec4610fc6388577
viewer くらいなら簡単に作れそう