web-dev-qa-db-ja.com

nodejs内部プロファイラーティックプロセッサ出力の読み方

Node.jsアプリケーションのプロファイリングに興味があります。 --profフラグで開始し、v8.logファイルを取得しました。私はwindows-tick-processorを使用して、人間が読めると思われるプロファイリングログを取得しました。質問の下部には、ログファイルからのいくつかの小さな抜粋がありますが、私は完全に理解できていません。

ティック統計的アプローチを取得します。 totalnonlibの意味がわかりません。また、一部のものの前にLazyCompileFunctionStubなどの用語が付いている理由もわかりません。

私が望むことができる最善の答えは、すべての用語、構造などを完全に説明する、ティックプロセッサ出力形式の完全なドキュメント/ガイドです...

それを除けば、私はレイジーコンパイルが何であるかを理解していません。コンパイルですか?すべての関数が1回だけコンパイルされるのではありませんか?では、コンパイルはどのようにしてアプリケーション実行の重要な部分になるのでしょうか。アプリケーションはこのログを生成するために何時間も実行され、内部JavaScriptコンパイルにはミリ秒かかると想定しています。これは、レイジーコンパイルが関数ごとに1回は発生しないが、ある種のコード評価中に発生することを示唆していますか?これは、関数定義(ネストされた関数など)があるところならどこでも、内部関数が毎回「レイジーコンパイル」されることを意味しますか?

私はこれに関する情報をどこにも見つけることができませんでした、そして私は何日もグーグルしてきました...

また、プロファイラーフラグがたくさんあることもわかりました。それらに関する追加の参照も歓迎します。

 [JavaScript]:
非ライブラリ名の合計をチェック
 88414 7.9%20.1%LazyCompile:* getUniqueId C:\ n\dev\SCNA\infra\lib\node-js\utils\general-utils.js:16 
 22797 2.0%5.2%LazyCompile:* keys native v8natives.js:333 
 14524 1.3%3.3%LazyCompile:Socket._flush C:\ n\dev\SCNA\runtime-environment\load-generator\node_modules\zmq\lib\index.js:365 
 12896 1.2%2.9%LazyCompile:BasicSerializeObject native json.js:244 
 12346 1.1%2.8% LazyCompile:BasicJSONSerializeネイティブjson.js:274 
 9327 0.8%2.1%LazyCompile:* C:\ n\dev\SCNA\runtime-environment\load-generator\node_modules\zmq\lib\index.js:194 
 7606 0.7%1.7%LazyCompile:* parse native json.js:55 
 5937 0.5%1.4%LazyCompile:* split native string.js:554 
 5138 0.5%1.2% LazyCompile:* Socket.send C:\ n\dev\SCNA\runtime-environment\load-generator\node_modules\zmq\lib\index.js:346 
 4862 0.4% 1.1%LazyCompile:*ソートネイティブarray.js:741 
 4806 0.4%1.1%LazyCompile:_。each ._。forEachC:\ n\dev\SCNA\infra\node_modules\underscore\underscore.js: 76 
 4481 0.4%1.0%LazyCompile:〜_.each ._。forEachC:\ n\dev\SCNA\infra\node_modules\underscore\underscore.js:76 
 4296 0.4%1.0 %LazyCompile:stringify native json.js:308 
 3796 0.3%0.9%LazyCompile:〜b native v8natives.js:1582 
 3694 0.3%0.8%Function:〜recursivePropertiesCollector C:\ n\dev\SCNA\infra\lib\node-js\utils\object-utils.js:90 
 3599 0.3%0.8%LazyCompile:* BasicSerializeArray native json.js:181 
 3578 0.3%0.8% LazyCompile:* Buffer.write buffer.js:315 
 3157 0.3%0.7%スタブ:CEntryStub 
 2958 0.3%0.7%LazyCompile:promise.promiseDispatch C:\ n\dev\SCNA\runtime- environment\load-generator\node_modules\q\q.js:516 
 
 88414 7.9%LazyCompile:* getUniqueId C:\ n\dev\SCNA\infra\lib\node-js\utils\general-utils.js:16 
 88404 100.0 %LazyCompile:* generateId C:\ n\dev\SCNA\infra\lib\node-js\utils\general-utils.js:51 
 88404 100.0%LazyCompile:* register C:\ n\dev\SCNA\fra\lib\node-js\events\pattern-dispatcher.js:72 
 52703 59.6%LazyCompile:* C:\ n\dev\SCNA\runtime-environment\load-generator\lib\vuser -driver\mdrv-driver.js:216 
 52625 99.9%LazyCompile:* _。each ._。forEachC:\ n\dev\SCNA\runtime-environment\load-generator\node_modules\underscore\underscore .js:76 
 52625 100.0%LazyCompile:〜usingEventHandlerMapping C:\ n\dev\SCNA\runtime-environment\load-generator\lib\vuser-driver\mdrv-driver.js:214 
 35555 40.2%LazyCompile:*一度C:\ n\dev\SCNA\infra\lib\node-js\events\pattern-dispatcher.js:88 
 29335 82.5%LazyCompile:〜startAction C:\ n\dev\SCNA\runtime-environment\load-generator\lib\vuser-driver\mdrv-driver.js:201 
 25687 87.6%LazyCompile:〜onActionComplete C:\ n\dev\SCNA\runtime-environment\load-generator\lib\vuser-driver\mdrv- logic.js:130 
 1908 6.5%LazyCompile:〜b native v8natives.js:1582 
 1667 5.7%LazyCompile:_fulfilled C:\ n\dev\SCNA\runtime-environment\load-generator\node_modules\q\q.js:795 
 4645 13.1%LazyCompile:〜terminate C:\ n\dev\SCNA\runtime-environment\load-generator\lib\vuser-driver\mdrv-driver.js :160 
 4645 100.0%LazyCompile:〜terminate C:\ n\dev\SCNA\runtime-environment\load-generator\lib\vuser-driver\mdrv-logic.js:171 
 1047 2.9%LazyCompile:* startAction C:\ n\dev\SCNA\runtime-environment\load-generator\lib\vuser-driver\mdrv-driver.js:201 
 1042 99.5%LazyCompile:〜onActionComplete C:\n\dev\SCNA\runtime-environment\load-generator\lib\vuser-driver\mdrv-logic.js:130 
36
nathan g

確かに、コードのコンパイルに実際に費やされた時間についてのあなたの仮定は正しいです:それはミリ秒かかります(これは--trace-optフラグで見ることができます)。

今そのLazyCompileについて話します。これはVyacheslavEgorov(以前のv8 dev)からの引用です blog

V8のティックプロセッサを使用している場合は、LazyCompile:プレフィックスがnotであるということは、この時間がコンパイラで費やされたことを意味するのではなく、関数自体を意味することに注意してください。怠惰にコンパイルされました。

関数名の前のアスタリスクは、最適化されていない関数tildaに時間が費やされていることを意味します。

関数がコンパイルされる回数についての質問について。実際、JIT(いわゆるフルコードゲン)は、初めて実行されるときに、各関数の最適化されていないバージョンを作成します。しかし、後で任意の(まあ、ある程度)数または再コンパイルが発生する可能性があります(最適化と救済のため)。ただし、この種のプロファイリングログには表示されません。

私の理解の限りでは、Stubプレフィックスは、実行がランタイムの一部であり、エンジンの他の部分と一緒にコンパイルされるC-Stub内で行われたことを意味します(つまり、JITでコンパイルされたJSコードではありません) 。

total vs. nonlib

これらの列は、合計/非lib時間のx%がそこで費やされたことを意味します。 (私はあなたに議論を紹介することができます ここ )。

また、 https://github.com/v8/v8/wiki/Using%20V8%E2%80%99s%20internal%20profiler 便利です。

36