बेज़ल ने कितना खर्च किया, यह तुरंत समझने में JSON ट्रेस प्रोफ़ाइल बहुत मददगार हो सकती है समय पर.
डिफ़ॉल्ट रूप से, सभी बिल्ड-जैसे आदेशों और क्वेरी के लिए बेज़ेल ऐसी प्रोफ़ाइल लिखता है
command.profile.gz
. आप यह कॉन्फ़िगर कर सकते हैं कि कोई प्रोफ़ाइल
--generate_json_trace_profile
फ़्लैग और वह स्थान जिसे
--profile
फ़्लैग करें. .gz
से खत्म होने वाले स्थान ये हैं
GZIP के साथ कंप्रेस किया गया है. फ़्लैग का इस्तेमाल करना
--experimental_announce_profile_path
लॉग पर इस फ़ाइल का पाथ प्रिंट करें.
टूल
इस प्रोफ़ाइल को chrome://tracing
में लोड किया जा सकता है. इसके अलावा,
अन्य टूल की मदद से प्रोसेस करने के बाद उसे प्रोसेस करें.
chrome://tracing
प्रोफ़ाइल को विज़ुअलाइज़ करने के लिए, chrome://tracing
को Chrome ब्राउज़र टैब में खोलें.
"लोड करें" पर क्लिक करें और (संभावित रूप से कंप्रेस की गई) प्रोफ़ाइल फ़ाइल चुनें. ज़्यादा के लिए
ज़्यादा जानकारी के लिए, नीचे बाएं कोने में मौजूद बॉक्स पर क्लिक करें.
प्रोफ़ाइल का उदाहरण:
पहला डायग्राम. प्रोफ़ाइल का उदाहरण.
नेविगेट करने के लिए, कीबोर्ड के इन कंट्रोल का इस्तेमाल किया जा सकता है:
- "चुनें" के लिए
1
दबाएं मोड. इस मोड में, आपके पास ये चुनने का विकल्प होता है: विशेष बॉक्स पर क्लिक करें (नीचे बायां कोना देखें). खास जानकारी और एग्रीगेट किए गए आंकड़े पाने के लिए, एक से ज़्यादा इवेंट चुनें. - "पैन" करने के लिए
2
दबाएं मोड. इसके बाद, व्यू को एक से दूसरी जगह ले जाने के लिए, माउस को खींचें और छोड़ें. आपने लोगों तक पहुंचाया मुफ़्त में बाईं/दाईं ओर जाने के लिए,a
/d
का भी इस्तेमाल किया जा सकता है. - "ज़ूम करने के लिए"
3
दबाएं मोड. इसके बाद, ज़ूम करने के लिए माउस को खींचें और छोड़ें. आप ज़ूम इन/आउट करने के लिएw
/s
का भी इस्तेमाल करें. - "समय" के लिए
4
दबाएं दूरी मापने वाला मोड दो घटनाओं के बीच में. - सभी कंट्रोल के बारे में जानने के लिए
?
दबाएं.
bazel analyze-profile
बेज़ल सबकमांड analyze-profile
प्रोफ़ाइल प्रारूप का उपयोग करता है और के लिए संचयी आंकड़े प्रिंट करता है
बिल्ड के हर चरण के लिए अलग-अलग तरह के टास्क असाइन किए जाते हैं. साथ ही, ज़रूरी पाथ का विश्लेषण भी किया जा सकता है.
उदाहरण के लिए,
$ bazel build --profile=/tmp/profile.gz //path/to:target
...
$ bazel analyze-profile /tmp/profile.gz
इस फ़ॉर्म का आउटपुट मिल सकता है:
INFO: Profile created on Tue Jun 16 08:59:40 CEST 2020, build ID: 0589419c-738b-4676-a374-18f7bbc7ac23, output base: /home/johndoe/.cache/bazel/_bazel_johndoe/d8eb7a85967b22409442664d380222c0
=== PHASE SUMMARY INFORMATION ===
Total launch phase time 1.070 s 12.95%
Total init phase time 0.299 s 3.62%
Total loading phase time 0.878 s 10.64%
Total analysis phase time 1.319 s 15.98%
Total preparation phase time 0.047 s 0.57%
Total execution phase time 4.629 s 56.05%
Total finish phase time 0.014 s 0.18%
------------------------------------------------
Total run time 8.260 s 100.00%
Critical path (4.245 s):
Time Percentage Description
8.85 ms 0.21% _Ccompiler_Udeps for @local_config_cc// compiler_deps
3.839 s 90.44% action 'Compiling external/com_google_protobuf/src/google/protobuf/compiler/php/php_generator.cc [for host]'
270 ms 6.36% action 'Linking external/com_google_protobuf/protoc [for host]'
0.25 ms 0.01% runfiles for @com_google_protobuf// protoc
126 ms 2.97% action 'ProtoCompile external/com_google_protobuf/python/google/protobuf/compiler/plugin_pb2.py'
0.96 ms 0.02% runfiles for //tools/aquery_differ aquery_differ
बेज़ल इनवोकेशन ऐनालाइज़र
ओपन सोर्स Bazz इनवोकेशन ऐनालाइज़र प्रोफ़ाइल फ़ॉर्मैट का इस्तेमाल करता है और फ़ोटो को बेहतर बनाने के सुझावों को प्रिंट करता है उसकी परफ़ॉर्मेंस कैसी है. यह विश्लेषण, सीएलआई का इस्तेमाल करके या चालू करने के बाद किया जा सकता है https://analyzer.engflow.com.
jq
JSON डेटा के लिए jq
, sed
की तरह है. सभी को एक्सट्रैक्ट करने के लिए, jq
के इस्तेमाल का उदाहरण
लोकल ऐक्शन लागू करने में सैंडबॉक्स बनाने के चरण की अवधि:
$ zcat $(../bazel-6.0.0rc1-linux-x86_64 info output_base)/command.profile.gz | jq '.traceEvents | .[] | select(.name == "sandbox.createFileSystem") | .dur'
6378
7247
11850
13756
6555
7445
8487
15520
[...]
प्रोफ़ाइल की जानकारी
प्रोफ़ाइल में कई पंक्तियां हैं. आम तौर पर, ज़्यादातर पंक्तियां बेज़ल को दिखाती हैं थ्रेड और उनसे जुड़े इवेंट होते हैं. हालांकि, कुछ खास लाइनें भी शामिल होती हैं.
शामिल की जाने वाली विशेष पंक्तियां, बेज़ल के वर्शन पर निर्भर करती हैं, जब प्रोफ़ाइल बना दी गई थी और उसे अलग-अलग झंडों के अनुसार कस्टमाइज़ किया जा सकता है.
पहली इमेज में, Basel v5.3.1 की मदद से बनाई गई प्रोफ़ाइल दिखाई गई है. इसमें ये लाइनें शामिल हैं:
action count
: दिखाता है कि फ़्लाइट में एक साथ कितनी कार्रवाइयां हुई थीं. क्लिक करें असल वैल्यू देखने के लिए उस पर क्लिक करें. के मान तक जाना चाहिए--jobs
क्लीन बिल्ड.CPU usage (Bazel)
: बिल्ड के हर सेकंड के लिए, यह Basel का इस्तेमाल किया गया सीपीयू (एक कोर की वैल्यू 1 होने का मतलब है कि 1 कोर की वैल्यू 100% व्यस्त है).Critical Path
: क्रिटिकल पाथ पर हर कार्रवाई के लिए एक ब्लॉक दिखाता है.Main Thread
: बेज़ल का मुख्य थ्रेड. इसकी मदद से, सवाल के हर हिस्से की सटीक जानकारी पाई जा सकती है बेज़ल क्या कर रहा है, उदाहरण के लिए "Launch Blaze", "evaluateTargetPatterns", और "runalysisPhase" शामिल है.Garbage Collector
: छोटे और बड़े कचरे के कलेक्शन (जीसी) को दिखाता है रुकने.
परफ़ॉर्मेंस से जुड़ी सामान्य समस्याएं
परफ़ॉर्मेंस प्रोफ़ाइलों का विश्लेषण करते समय, इन चीज़ों को देखें:
- विश्लेषण का यह चरण, उम्मीद से धीमा है (
runAnalysisPhase
), खास तौर पर इन दिनों इंक्रीमेंटल बिल्ड यह नियम के खराब होने का संकेत हो सकता है, उदाहरण के लिए, जो डेपसेट को फ़्लैट करता है. पैकेज लोडिंग की रफ़्तार इतनी धीमी हो सकती है: ज़रूरत से ज़्यादा टारगेट, जटिल मैक्रो या बार-बार होने वाले ग्लॉब्स का इस्तेमाल करना. - धीमी रफ़्तार से की जाने वाली कार्रवाइयां, खास तौर पर वे कार्रवाइयां जो अहम पाथ पर हैं. यह हो सकता है
बड़ी कार्रवाइयों को कई छोटी कार्रवाइयों में बांटा जा सकता है या
(ट्रांज़िव) डिपेंडेंसी का एक सेट. किसी असामान्य गतिविधि के लिए भी जांच करें
उच्च गैर-
PROCESS_TIME
(जैसे किREMOTE_SETUP
याFETCH
). - बॉटलनेक, जो कि कुछ थ्रेड हैं, व्यस्त हैं और बाकी सभी व्यस्त हैं आइडलिंग / नतीजे का इंतज़ार करना (इमेज 1 में करीब 22 और 29 सेकंड देखें). इसे ऑप्टिमाइज़ करने के लिए लागू करने से जुड़े नियम को छूना होगा का इस्तेमाल किया. ऐसा तब भी हो सकता है, जब ग़ैर-ज़रूरी जीसी मौजूद हैं.
प्रोफ़ाइल फ़ाइल का फ़ॉर्मैट
टॉप-लेवल ऑब्जेक्ट में मेटाडेटा (otherData
) और ट्रेस किया जा रहा असल डेटा होता है
(traceEvents
). मेटाडेटा में ज़्यादा जानकारी मौजूद होती है, जैसे कि न्योता देने वाला आईडी
और बेज़ल के शुरू होने की तारीख़ भी सेट की गई है.
उदाहरण:
{
"otherData": {
"build_id": "101bff9a-7243-4c1a-8503-9dc6ae4c3b05",
"date": "Wed Oct 26 08:22:35 CEST 2022",
"profile_finish_ts": "1677666095162000",
"output_base": "/usr/local/google/_bazel_johndoe/573d4be77eaa72b91a3dfaa497bf8cd0"
},
"traceEvents": [
{"name":"thread_name","ph":"M","pid":1,"tid":0,"args":{"name":"Critical Path"}},
...
{"cat":"build phase marker","name":"Launch Blaze","ph":"X","ts":-1306000,"dur":1306000,"pid":1,"tid":21},
...
{"cat":"package creation","name":"foo","ph":"X","ts":2685358,"dur":784,"pid":1,"tid":246},
...
{"name":"thread_name","ph":"M","pid":1,"tid":11,"args":{"name":"Garbage Collector"}},
{"cat":"gc notification","name":"minor GC","ph":"X","ts":825986,"dur":11000,"pid":1,"tid":11},
...
{"cat":"action processing","name":"Compiling foo/bar.c","ph":"X","ts":54413389,"dur":357594,"pid":1,"args":{"mnemonic":"CppCompile"},"tid":341},
]
}
ट्रेस इवेंट के टाइमस्टैंप (ts
) और अवधि (dur
) इसमें दी गई हैं
माइक्रोसेकंड. कैटगरी (cat
), ProfilerTask
की ईनम वैल्यू में से एक है.
ध्यान दें कि कुछ इवेंट बहुत छोटे होने पर और उनके आस-पास होने पर, उन्हें एक साथ मर्ज कर दिया जाता है
एक-दूसरे को; पास
--noslim_json_profile
का विकल्प भी है.
यह भी देखें Chrome ट्रेस इवेंट फ़ॉर्मैट की खास बातें.