यह कमांड परफ-स्क्रिप्ट-पायथन है जिसे हमारे कई मुफ्त ऑनलाइन वर्कस्टेशन जैसे कि उबंटू ऑनलाइन, फेडोरा ऑनलाइन, विंडोज ऑनलाइन एमुलेटर या मैक ओएस ऑनलाइन एमुलेटर का उपयोग करके ऑनवर्क्स फ्री होस्टिंग प्रदाता में चलाया जा सकता है।
कार्यक्रम:
नाम
पर्फ़-स्क्रिप्ट-पायथन - पायथन स्क्रिप्ट के साथ ट्रेस डेटा को प्रोसेस करें
SYNOPSIS
पर्फ़ लिपि [-s [पायथन]:स्क्रिप्ट[.py] ]
वर्णन
इस पर्फ़ स्क्रिप्ट विकल्प का उपयोग पर्फ़ के अंतर्निहित पायथन का उपयोग करके पर्फ़ स्क्रिप्ट डेटा को संसाधित करने के लिए किया जाता है
दुभाषिया। यह इनपुट फ़ाइल को पढ़ता है और संसाधित करता है और ट्रेस के परिणाम प्रदर्शित करता है
दिए गए पायथन लिपि में विश्लेषण लागू किया गया है, यदि कोई हो।
A शीघ्र उदाहरण
यह अनुभाग एक कार्यशील पायथन स्क्रिप्ट बनाने की प्रक्रिया, शुरू से अंत तक दिखाता है
एक कच्ची पूर्ण स्क्रिप्ट स्ट्रीम से उपयोगी जानकारी एकत्रित और निकालता है। आप बच सकते हैं
यदि एक उदाहरण आपके लिए पर्याप्त है तो इस दस्तावेज़ के शेष भाग को पढ़ें; बाकी की
दस्तावेज़ प्रत्येक चरण पर अधिक विवरण प्रदान करता है और उपलब्ध लाइब्रेरी कार्यों को सूचीबद्ध करता है
पटकथा लेखक.
यह उदाहरण वास्तव में उन चरणों का विवरण देता है जिनका उपयोग इसे बनाने के लिए किया गया था syscall-गिनती लिपि
जब आप उपलब्ध पूर्ण स्क्रिप्ट स्क्रिप्ट को सूचीबद्ध करते हैं तो आप देखते हैं पर्फ़ लिपि -l. इस प्रकार, यह
स्क्रिप्ट यह भी दिखाती है कि अपनी स्क्रिप्ट को सामान्य-उद्देश्य की सूची में कैसे एकीकृत किया जाए पर्फ़
लिपि उस आदेश द्वारा सूचीबद्ध स्क्रिप्ट।
सिस्कल-काउंट्स स्क्रिप्ट एक सरल स्क्रिप्ट है, लेकिन सभी बुनियादी विचारों को प्रदर्शित करती है
एक उपयोगी स्क्रिप्ट बनाने के लिए आवश्यक है. यहां इसके आउटपुट का एक उदाहरण दिया गया है (syscall नाम हैं
अभी तक समर्थित नहीं है, वे संख्याओं के रूप में दिखाई देंगे):
.फीट सी
सिस्कल घटनाएँ:
घटना गिनती
------------------------------------------------ -------- -
sys_write 455067
sys_getdents 4072
sys_बंद करें 3037
sys_swapoff 1769
sys_read 923
sys_sched_setparam 826
sys_open 331
sys_newfstat 326
sys_mmap 217
sys_munmap 216
sys_futex 141
sys_select 102
sys_poll 84
sys_settimer 12
sys_writev 8
15 8
sys_lseek 7
sys_rt_sigprocmask 6
sys_wait4 3
sys_ioctl 3
sys_set_robust_list 1
sys_exit 1
56 1
sys_access 1
.एफटी
मूल रूप से हमारा काम प्रति-सिसकॉल टैली रखना है जो हर बार सिस्टम में अपडेट होता रहता है
सिस्टम में कॉल होती है. हमारी स्क्रिप्ट ऐसा करेगी, लेकिन पहले हमें डेटा रिकॉर्ड करना होगा
वह उस स्क्रिप्ट द्वारा संसाधित किया जाएगा। सैद्धांतिक रूप से, हम कुछ तरीके अपना सकते हैं
वो करें:
· हम प्रत्येक ईवेंट को ट्रेसिंग/ईवेंट/सिसकॉल्स निर्देशिका के अंतर्गत सक्षम कर सकते हैं, लेकिन यह है
600 से अधिक syscalls, जो कि perf द्वारा स्वीकार्य संख्या से काफी अधिक है। ये व्यक्तिगत syscall
हालाँकि, यदि हम बाद में इनसे प्राप्त मार्गदर्शन का उपयोग करना चाहें तो घटनाएँ उपयोगी होंगी
सामान्य-उद्देश्यीय स्क्रिप्ट को गहराई से जानने और व्यक्तिगत सिस्कल्स के बारे में अधिक विवरण प्राप्त करने के लिए
ब्याज.
· हम नीचे पाए गए sys_enter और/या sys_exit syscalls को सक्षम कर सकते हैं
ट्रेसिंग/घटनाएँ/raw_syscalls। इन्हें सभी syscalls के लिए बुलाया जाता है; id फ़ील्ड हो सकता है
व्यक्तिगत सिस्कल नंबरों के बीच अंतर करने के लिए उपयोग किया जाता है।
इस स्क्रिप्ट के लिए, हमें केवल यह जानना होगा कि एक सिस्कल दर्ज किया गया था; हमें इसकी परवाह नहीं है कि यह कैसा है
बाहर निकल गया, इसलिए हम उपयोग करेंगे पर्फ़ रिकॉर्ड केवल sys_enter ईवेंट रिकॉर्ड करने के लिए:
.फीट सी
# पूर्ण रिकॉर्ड -ए -ई रॉ_सिसकॉल्स:sys_enter
^सी[पूर्ण रिकॉर्ड: डेटा लिखने के लिए 1 बार जागा]
[पूर्ण रिकॉर्ड: 56.545 एमबी पूर्ण डेटा कैप्चर किया और लिखा (~2470503 नमूने)]
.एफटी
विकल्प मूल रूप से सिस्टम-व्यापी प्रत्येक सिस्कल इवेंट के लिए डेटा एकत्र करने के लिए कहते हैं
प्रति-सीपीयू आउटपुट को एक ही स्ट्रीम में मल्टीप्लेक्स करें। वह एकल स्ट्रीम रिकॉर्ड की जाएगी
वर्तमान निर्देशिका में एक फ़ाइल जिसे perf.data कहा जाता है।
एक बार जब हमारे पास अपना डेटा युक्त एक perf.data फ़ाइल हो, तो हम -g का उपयोग कर सकते हैं पर्फ़ लिपि विकल्प
एक पायथन स्क्रिप्ट तैयार करें जिसमें पाए जाने वाले प्रत्येक ईवेंट प्रकार के लिए कॉलबैक हैंडलर होगा
पर्फ़.डेटा ट्रेस स्ट्रीम (अधिक विवरण के लिए, स्टार्टर स्क्रिप्ट अनुभाग देखें)।
.फीट सी
# पूर्ण स्क्रिप्ट -जी पायथन
उत्पन्न पायथन स्क्रिप्ट: perf-script.py
वर्तमान निर्देशिका में बनाई गई आउटपुट फ़ाइल को भी नाम दिया गया है
perf-script.py. यहां संपूर्ण फ़ाइल है:
# पर्फ़ स्क्रिप्ट ईवेंट हैंडलर, पर्फ़ स्क्रिप्ट -जी पायथन द्वारा उत्पन्न
# जीएनयू जीपीएल लाइसेंस संस्करण 2 की शर्तों के तहत लाइसेंस प्राप्त
# सामान्य_* ईवेंट हैंडलर फ़ील्ड सामान्य रूप से सबसे उपयोगी फ़ील्ड हैं
# सभी कार्यक्रम। वे आवश्यक रूप से 'सामान्य_*' फ़ील्ड के अनुरूप नहीं हैं
# प्रारूप फ़ाइलों में. वे फ़ील्ड हैंडलर पैरामीटर के रूप में उपलब्ध नहीं हैं
# सामान्य_*(संदर्भ) फॉर्म के पायथन फ़ंक्शंस का उपयोग करके पुनर्प्राप्त किया जा सकता है।
# उपलब्ध कार्यों की सूची के लिए परफ-स्क्रिप्ट-पायथन दस्तावेज़ीकरण देखें।
आयात os
आयात sys
sys.path.append(os.environ['PERF_EXEC_PATH'] + \
'/स्क्रिप्ट/पायथन/परफ-ट्रेस-यूटिल/लिब/परफ/ट्रेस')
perf_trace_context आयात से *
कोर आयात से *
डीईएफ़ ट्रेस_बेगिन():
"ट्रेस_बेगिन में" प्रिंट करें
डीईएफ़ ट्रेस_एंड():
"ट्रेस_एंड में" प्रिंट करें
def raw_syscalls__sys_enter(event_name, context, Common_cpu,
सामान्य_सेक, सामान्य_एनएसईसी, सामान्य_पिड, सामान्य_कॉम,
आईडी, तर्क):
प्रिंट_हेडर(इवेंट_नाम, कॉमन_सीपीयू, कॉमन_सेक, कॉमन_एनएसईसी,
कॉमन_पिड, कॉमन_कॉम)
प्रिंट करें "id=%d, args=%s\n" % \
(आईडी, तर्क),
डीईएफ़ ट्रेस_अनहैंडल्ड(इवेंट_नाम, संदर्भ, कॉमन_सीपीयू, कॉमन_सेक, कॉमन_एनएसईसी,
सामान्य_पिड, सामान्य_कॉम):
प्रिंट_हेडर(इवेंट_नाम, कॉमन_सीपीयू, कॉमन_सेक, कॉमन_एनएसईसी,
कॉमन_पिड, कॉमन_कॉम)
def print_header(event_name, cpu, secs, nsecs, pid, comm):
प्रिंट करें "%-20s %5u %05u.%09u %8u %-20s " % \
(इवेंट_नाम, सीपीयू, सेकंड, एनएसईसीएस, पीआईडी, कॉम),
.एफटी
शीर्ष पर एक टिप्पणी ब्लॉक है जिसके बाद कुछ आयात विवरण और एक पथ संलग्न है
प्रत्येक पूर्ण स्क्रिप्ट स्क्रिप्ट में शामिल होना चाहिए।
इसके बाद कुछ जनरेट किए गए फ़ंक्शन हैं, ट्रेस_बेगिन() और ट्रेस_एंड(), जो हैं
स्क्रिप्ट के आरंभ और अंत में क्रमशः कॉल किया जाता है (अधिक जानकारी के लिए, देखें)।
नीचे SCRIPT_LAYOUT अनुभाग)।
वे निम्नलिखित हैं घटना हैंडलर प्रत्येक ईवेंट के लिए एक फ़ंक्शंस उत्पन्न होता है पर्फ़
रिकॉर्ड आउटपुट. हैंडलर फ़ंक्शन सबसिस्टम का रूप लेते हैंघटना नाम, और शामिल नामित
पैरामीटर, एक एसटी से प्रत्येक खेत in la आयोजन; in इसका मामला, वहाँ है केवल एक घटना,
raw_syscallssys_enter(). (इवेंट के बारे में अधिक जानकारी के लिए नीचे इवेंट हैंडलर अनुभाग देखें
हैंडलर)।
अंतिम कुछ फ़ंक्शन, आरंभ और अंत फ़ंक्शन की तरह, प्रत्येक के लिए उत्पन्न होते हैं
लिखी हुई कहानी। जब भी स्क्रिप्ट में कोई ईवेंट मिलता है, तो पहला, ट्रेस_अनहैंडल्ड () कहा जाता है
perf.data फ़ाइल जो स्क्रिप्ट में किसी भी ईवेंट हैंडलर से मेल नहीं खाती है। यह कर सकता है
या तो इसका मतलब यह है कि रिकॉर्ड चरण में ऐसे इवेंट प्रकार रिकॉर्ड किए गए जिनमें उसे वास्तव में कोई दिलचस्पी नहीं थी,
या स्क्रिप्ट एक ट्रेस फ़ाइल के विरुद्ध चलाई गई थी जो स्क्रिप्ट से मेल नहीं खाती।
-जी विकल्प द्वारा उत्पन्न स्क्रिप्ट ट्रेस में पाए जाने वाले प्रत्येक ईवेंट के लिए बस एक पंक्ति प्रिंट करती है
स्ट्रीम यानी यह मूल रूप से इवेंट और उसके पैरामीटर मानों को stdout पर डंप कर देता है।
print_header() फ़ंक्शन बस उस उद्देश्य के लिए उपयोग किया जाने वाला एक उपयोगिता फ़ंक्शन है। आइए नाम बदलें
स्क्रिप्ट खोलें और डिफ़ॉल्ट आउटपुट देखने के लिए इसे चलाएँ:
.फीट सी
# mv perf-script.py syscall-counts.py
# पूर्ण स्क्रिप्ट -s syscall-counts.py
raw_syscalls__sys_enter 1 00840.847582083 7506 पर्फ़ आईडी = 1, तर्क =
raw_syscalls__sys_enter 1 00840.847595764 7506 पर्फ़ आईडी = 1, तर्क =
raw_syscalls__sys_enter 1 00840.847620860 7506 पर्फ़ आईडी = 1, तर्क =
raw_syscalls__sys_enter 1 00840.847710478 6533 npviewer.bin आईडी=78, args=
raw_syscalls__sys_enter 1 00840.847719204 6533 npviewer.bin आईडी=142, args=
raw_syscalls__sys_enter 1 00840.847755445 6533 npviewer.bin आईडी=3, args=
raw_syscalls__sys_enter 1 00840.847775601 6533 npviewer.bin आईडी=3, args=
raw_syscalls__sys_enter 1 00840.847781820 6533 npviewer.bin आईडी=3, args=
.
.
.
.एफटी
बेशक, इस स्क्रिप्ट के लिए, हम हर ट्रेस इवेंट को प्रिंट करने में रुचि नहीं रखते हैं, बल्कि इसे प्रिंट करने में रुचि रखते हैं
इसे उपयोगी तरीके से एकत्रित करना। तो हम मुद्रण से जुड़ी हर चीज़ से भी छुटकारा पा लेंगे
ट्रेस_बेगिन() और ट्रेस_अनहैंडल्ड() फ़ंक्शंस के रूप में, जिनका हम उपयोग नहीं करेंगे। वह चला जाता है
हमें इस न्यूनतम ढांचे के साथ:
.फीट सी
आयात os
आयात sys
sys.path.append(os.environ['PERF_EXEC_PATH'] + \
'/स्क्रिप्ट/पायथन/परफ-ट्रेस-यूटिल/लिब/परफ/ट्रेस')
perf_trace_context आयात से *
कोर आयात से *
डीईएफ़ ट्रेस_एंड():
"ट्रेस_एंड में" प्रिंट करें
def raw_syscalls__sys_enter(event_name, context, Common_cpu,
सामान्य_सेक, सामान्य_एनएसईसी, सामान्य_पिड, सामान्य_कॉम,
आईडी, तर्क):
.एफटी
ट्रेस_एंड() में, हम केवल परिणाम प्रिंट करेंगे, लेकिन पहले हमें कुछ परिणाम उत्पन्न करने होंगे
प्रिंट। ऐसा करने के लिए हमें अपने sys_enter() हैंडलर से आवश्यक मिलान कराना होगा
जब तक सभी घटनाओं की गिनती नहीं हो जाती। सिस्कल आईडी द्वारा अनुक्रमित एक हैश तालिका एक अच्छा तरीका है
उस जानकारी को संग्रहीत करें; हर बार जब sys_enter() हैंडलर को कॉल किया जाता है, तो हम बस वृद्धि करते हैं
उस सिस्कल आईडी द्वारा अनुक्रमित उस हैश प्रविष्टि से जुड़ी एक गिनती:
.फीट सी
syscalls = autodict()
प्रयास करें:
syscalls [आईडी] + = 1
टाइप एरर को छोड़कर:
सिस्कल्स [आईडी] = 1
.एफटी
सिस्कल्स autodict ऑब्जेक्ट एक विशेष प्रकार का पायथन डिक्शनरी है (में कार्यान्वित)।
Core.py) जो पर्ल को लागू करता है स्वत: जीवंत पाइथॉन में हैश यानी ऑटोविविफाइंग के साथ
हैश, आप निर्माण की परेशानी के बिना नेस्टेड हैश मान निर्दिष्ट कर सकते हैं
मध्यवर्ती स्तर यदि वे मौजूद नहीं हैं उदाहरण के लिए syscalls[comm][pid][id] = 1 बनाएगा
मध्यवर्ती हैश स्तर और अंत में हैश प्रविष्टि के लिए मान 1 निर्दिष्ट करें id (इसलिये
असाइन किया जा रहा मान कोई हैश ऑब्जेक्ट नहीं है, प्रारंभिक मान इसमें असाइन किया गया है
लेखन त्रुटि अपवाद. खैर, पायथन में ऐसा करने का एक बेहतर तरीका हो सकता है लेकिन यही है
अभी के लिए काम करता है)।
उस कोड को raw_syscalls__sys_enter() हैंडलर में डालने पर, हम प्रभावी रूप से एक के साथ समाप्त होते हैं
एकल-स्तरीय शब्दकोश को सिस्कल आईडी पर कुंजीबद्ध किया गया है और हमारे द्वारा गिनती को मानों के रूप में गिना गया है।
Print_syscall_totals() फ़ंक्शन शब्दकोश में प्रविष्टियों पर पुनरावृत्त होता है
सिस्कल नाम वाली प्रत्येक प्रविष्टि के लिए एक पंक्ति प्रदर्शित करता है (शब्दकोश कुंजियाँ शामिल हैं
सिस्कल आईडी, जो यूटिल फ़ंक्शन syscall_name() को पास की जाती है, जो अनुवाद करती है
संबंधित syscall नाम स्ट्रिंग्स के लिए कच्चे syscall नंबर)। आउटपुट है
ट्रेस में सभी घटनाओं को संसाधित करने के बाद, कॉल करके प्रदर्शित किया जाता है
स्क्रिप्ट के अंत में कॉल किए गए ट्रेस_एंड() हैंडलर से print_syscall_totals() फ़ंक्शन
प्रसंस्करण।
ऊपर दिखाए गए आउटपुट का उत्पादन करने वाली अंतिम स्क्रिप्ट नीचे संपूर्ण रूप से दिखाई गई है
(syscall_name() सहायक अभी तक उपलब्ध नहीं है, आप अभी केवल आईडी से निपट सकते हैं):
.फीट सी
आयात os
आयात sys
sys.path.append(os.environ['PERF_EXEC_PATH'] + \
'/स्क्रिप्ट/पायथन/परफ-ट्रेस-यूटिल/लिब/परफ/ट्रेस')
perf_trace_context आयात से *
कोर आयात से *
यूटिल आयात से*
syscalls = autodict()
डीईएफ़ ट्रेस_एंड():
print_syscall_totals()
def raw_syscalls__sys_enter(event_name, context, Common_cpu,
सामान्य_सेक, सामान्य_एनएसईसी, सामान्य_पिड, सामान्य_कॉम,
आईडी, तर्क):
प्रयास करें:
syscalls [आईडी] + = 1
टाइप एरर को छोड़कर:
सिस्कल्स [आईडी] = 1
डीईएफ़ print_syscall_totals():
यदि for_comm कोई नहीं है:
प्रिंट करें "\nsyscall इवेंट्स फॉर %s:\n\n" % (for_comm),
अन्य:
प्रिंट करें "\nsyscall इवेंट:\n\n",
प्रिंट करें "%-40s %10s\n" % ("इवेंट", "गिनती"),
प्रिंट करें "%-40s %10s\n" % ("-------------------------------------- ---", \
"-------"),
आईडी के लिए, क्रमबद्ध (syscalls.iteritems() में वैल, कुंजी = लैम्ब्डा (k, v): (v, k), \
उलटा = सत्य):
प्रिंट करें "%-40s %10d\n" % (syscall_name(id), वैल),
.एफटी
स्क्रिप्ट को पहले की तरह ही चलाया जा सकता है:
# पूर्ण स्क्रिप्ट -s syscall-counts.py
तो स्क्रिप्ट लिखने और चलाने के लिए ये आवश्यक चरण हैं। प्रक्रिया हो सकती है
किसी भी ट्रेसप्वाइंट या ट्रेसप्वाइंट के सेट के लिए सामान्यीकृत, जिसमें आप रुचि रखते हैं - मूल रूप से ढूंढें
दिखाए गए उपलब्ध ईवेंट की सूची को देखकर आप जिस ट्रेसपॉइंट में रुचि रखते हैं
पर्फ़ सूची और/या विस्तृत घटना और क्षेत्र के लिए /sys/kernel/debug/tracing इवेंट देखें
जानकारी, उपयोग करके संबंधित ट्रेस डेटा रिकॉर्ड करें पर्फ़ रिकॉर्ड, इसकी सूची पास कर रहा हूं
दिलचस्प घटनाओं का उपयोग करके एक कंकाल स्क्रिप्ट तैयार करें पर्फ़ लिपि -g अजगर और संशोधित करें
आपकी विशेष आवश्यकताओं के लिए इसे एकत्रित करने और प्रदर्शित करने के लिए कोड।
ऐसा करने के बाद आपके पास एक सामान्य-उद्देश्य वाली स्क्रिप्ट हो सकती है जिसे आप रखना चाहते हैं
आसपास और भविष्य में उपयोग के लिए उपलब्ध है। कुछ बहुत ही सरल शेल स्क्रिप्ट लिखकर
और उन्हें सही जगह पर रखकर, आप अपनी स्क्रिप्ट को अन्य के साथ सूचीबद्ध कर सकते हैं
द्वारा सूचीबद्ध स्क्रिप्ट पर्फ़ लिपि -l आदेश जैसे:
.फीट सी
रूट@ट्रोपिकाना:~# पूर्ण स्क्रिप्ट -एल
उपलब्ध ट्रेस स्क्रिप्ट की सूची:
वेकअप-विलंबता प्रणाली-व्यापी न्यूनतम/अधिकतम/औसत वेकअप विलंबता
rw-दर-फ़ाइल किसी प्रोग्राम के लिए r/w गतिविधि, फ़ाइल द्वारा
आरडब्ल्यू-बाय-पिड सिस्टम-वाइड आर/डब्ल्यू गतिविधि
.एफटी
ऐसा करने का एक अच्छा दुष्परिणाम यह है कि आप संभवतः लंबे समय तक भी कब्जा कर लेते हैं पर्फ़
रिकॉर्ड स्क्रिप्ट के लिए घटनाओं को रिकॉर्ड करने के लिए कमांड की आवश्यकता है।
स्क्रिप्ट को एक के रूप में प्रदर्शित करने के लिए में निर्मित स्क्रिप्ट, आप दो सरल स्क्रिप्ट लिखते हैं, एक के लिए
रिकॉर्डिंग और एक के लिए रिपोर्टिंग.
RSI रिकॉर्ड स्क्रिप्ट एक शेल स्क्रिप्ट है जिसका आधार नाम आपकी स्क्रिप्ट के समान है, लेकिन
-रिकॉर्ड संलग्न। शेल स्क्रिप्ट को perf/scripts/python/bin में डाला जाना चाहिए
कर्नेल स्रोत ट्री में निर्देशिका। उस स्क्रिप्ट में, आप लिखते हैं पर्फ़ रिकॉर्ड
आपकी स्क्रिप्ट के लिए आवश्यक कमांड-लाइन:
.फीट सी
# कैट कर्नेल-सोर्स/टूल्स/परफ/स्क्रिप्ट्स/पायथन/बिन/सिसकॉल-काउंट्स-रिकॉर्ड
#!/ बिन / बैश
पूर्ण रिकॉर्ड -a -e raw_syscalls:sys_enter
.एफटी
RSI रिपोर्ट स्क्रिप्ट भी एक शेल स्क्रिप्ट है जिसका मूल नाम आपकी स्क्रिप्ट के समान है, लेकिन
-रिपोर्ट संलग्न। इसे perf/scripts/python/bin निर्देशिका में भी स्थित होना चाहिए। में
वह स्क्रिप्ट, आप लिखें पर्फ़ लिपि -s आपकी स्क्रिप्ट चलाने के लिए आवश्यक कमांड-लाइन:
.फीट सी
# कैट कर्नेल-सोर्स/टूल्स/परफ/स्क्रिप्ट्स/पायथन/बिन/सिसकॉल-काउंट्स-रिपोर्ट
#!/ बिन / बैश
# विवरण: सिस्टम-व्यापी सिस्कॉल गणना
पूर्ण स्क्रिप्ट -s ~/libexec/perf-core/scripts/python/syscall-counts.py
.एफटी
ध्यान दें कि शेल स्क्रिप्ट में दी गई पायथन स्क्रिप्ट का स्थान है
libexec/perf-core/scripts/python निर्देशिका - यह वह जगह है जहां स्क्रिप्ट की प्रतिलिपि बनाई जाएगी
बनाना स्थापित जब आप पर्फ़ इंस्टॉल करते हैं. अपनी स्क्रिप्ट को वहां स्थापित करने के लिए,
आपकी स्क्रिप्ट को कर्नेल स्रोत में perf/scripts/python निर्देशिका में स्थित होना चाहिए
पेड़:
.फीट सी
# ls -al कर्नेल-सोर्स/टूल्स/परफ/स्क्रिप्ट्स/पायथन
root@tropicana:/home/trz/src/tip# ls -al टूल्स/perf/स्क्रिप्ट/पायथन
कुल 32
drwxr-xr-x 4 trz trz 4096 2010-01-26 22:30।
drwxr-xr-x 4 trz trz 4096 2010-01-26 22:29 ..
drwxr-xr-x 2 trz trz 4096 2010-01-26 22:29 बिन
-आरडब्ल्यू-आर--आर-- 1 ट्रज़ ट्रज़ 2548 2010-01-26 22:29 check-perf-script.py
drwxr-xr-x 3 trz trz 4096 2010-01-26 22:49 पर्फ-ट्रेस-यूटिल
-आरडब्ल्यू-आर--आर-- 1 ट्रज़ ट्रज़ 1462 2010-01-26 22:30 syscall-counts.py
.एफटी
एक बार ऐसा करने के बाद (नया करना न भूलें)। बनाना स्थापित, अन्यथा आपकी स्क्रिप्ट नहीं चलेगी
रन-टाइम पर दिखाएँ), पर्फ़ लिपि -l आपकी स्क्रिप्ट के लिए एक नई प्रविष्टि दिखानी चाहिए:
.फीट सी
रूट@ट्रोपिकाना:~# पूर्ण स्क्रिप्ट -एल
उपलब्ध ट्रेस स्क्रिप्ट की सूची:
वेकअप-विलंबता प्रणाली-व्यापी न्यूनतम/अधिकतम/औसत वेकअप विलंबता
rw-दर-फ़ाइल किसी प्रोग्राम के लिए r/w गतिविधि, फ़ाइल द्वारा
आरडब्ल्यू-बाय-पिड सिस्टम-वाइड आर/डब्ल्यू गतिविधि
syscall-गिनती सिस्टम-व्यापी syscall गिनती
.एफटी
अब आप इसके माध्यम से रिकॉर्ड चरण निष्पादित कर सकते हैं पर्फ़ लिपि रिकॉर्ड:
# पूर्ण स्क्रिप्ट रिकॉर्ड syscall-गिनती
और आउटपुट का उपयोग करके प्रदर्शित करें पर्फ़ लिपि रिपोर्ट:
# पूर्ण स्क्रिप्ट रिपोर्ट syscall-गिनती
स्टार्टर लिपियों
आप ट्रेस डेटा के किसी विशेष सेट के लिए तुरंत एक स्क्रिप्ट लिखना शुरू कर सकते हैं
का उपयोग करके एक कंकाल स्क्रिप्ट तैयार करना पर्फ़ लिपि -g अजगर एक ही निर्देशिका में
मौजूदा perf.डेटा ट्रेस फ़ाइल। यह एक स्टार्टर स्क्रिप्ट उत्पन्न करेगा जिसमें एक हैंडलर होगा
ट्रेस फ़ाइल में प्रत्येक ईवेंट प्रकार के लिए; यह बस प्रत्येक उपलब्ध फ़ील्ड को प्रिंट करता है
ट्रेस फ़ाइल में प्रत्येक घटना।
आप इसमें मौजूदा स्क्रिप्ट भी देख सकते हैं ~/libexec/perf-core/scripts/python एसटी
विशिष्ट उदाहरण दिखाते हैं कि समग्र ईवेंट डेटा, प्रिंट परिणाम जैसी बुनियादी चीजें कैसे करें
आदि। इसके अलावा, check-perf-script.py स्क्रिप्ट, हालांकि इसके परिणामों के लिए दिलचस्प नहीं है,
सभी मुख्य स्क्रिप्टिंग सुविधाओं का उपयोग करने का प्रयास करता है।
घटना संचालकों
जब उपयोगकर्ता द्वारा परिभाषित ट्रेस स्क्रिप्ट का उपयोग करके पूर्ण स्क्रिप्ट लागू की जाती है हैंडलर समारोह is
ट्रेस में प्रत्येक घटना के लिए बुलाया गया। यदि किसी दिए गए के लिए कोई हैंडलर फ़ंक्शन परिभाषित नहीं है
ईवेंट प्रकार, ईवेंट को अनदेखा कर दिया जाता है (या पास कर दिया जाता है)। ट्रेस_हैंडल्ड फ़ंक्शन, नीचे देखें) और
अगला ईवेंट संसाधित हो गया है.
इवेंट के अधिकांश फ़ील्ड मान हैंडलर फ़ंक्शन के तर्क के रूप में पारित किए जाते हैं; कुछ
कम आम नहीं हैं - वे पूर्ण निष्पादन योग्य में कॉल के रूप में उपलब्ध हैं
(निचे देखो)।
उदाहरण के तौर पर, निम्नलिखित पूर्ण रिकॉर्ड कमांड का उपयोग सभी शेड्यूल_वेकअप को रिकॉर्ड करने के लिए किया जा सकता है
सिस्टम में घटनाएँ:
# पूर्ण रिकॉर्ड -ए -ई शेड्यूल: शेड्यूल_वेकअप
स्क्रिप्ट का उपयोग करके संसाधित किए जाने वाले निशानों को उपरोक्त विकल्प के साथ रिकॉर्ड किया जाना चाहिए: -ए
सिस्टम-व्यापी संग्रह को सक्षम करने के लिए।
शेड्यूल_वेकप इवेंट के लिए प्रारूप फ़ाइल निम्नलिखित फ़ील्ड को परिभाषित करती है (देखें)।
/sys/kernel/debug/tracing/events/sched/sched_wakeup/format):
.फीट सी
प्रारूप:
फ़ील्ड: अहस्ताक्षरित लघु सामान्य_प्रकार;
फ़ील्ड: अहस्ताक्षरित चार सामान्य_फ़्लैग;
फ़ील्ड: अहस्ताक्षरित चार सामान्य_प्रीमेप्ट_काउंट;
फ़ील्ड: पूर्णांक सामान्य_पिड;
फ़ील्ड:चार कॉम[TASK_COMM_LEN];
फ़ील्ड:pid_t pid;
फ़ील्ड: पूर्णांक प्रियो;
फ़ील्ड: पूर्णांक सफलता;
फ़ील्ड:int target_cpu;
.एफटी
इस ईवेंट के लिए हैंडलर फ़ंक्शन को इस प्रकार परिभाषित किया जाएगा:
.फीट सी
डीईएफ़ शेड्यूल__शेड_वेकअप(इवेंट_नाम, संदर्भ, कॉमन_सीपीयू, कॉमन_सेकंड,
सामान्य_एनएसईसी, सामान्य_पिड, सामान्य_कॉम,
कॉम, पीआईडी, प्रियो, सफलता, लक्ष्य_सीपीयू):
पास
.एफटी
हैंडलर फ़ंक्शन सबसिस्टम__इवेंट_नाम का रूप लेता है।
हैंडलर की तर्क सूची में सामान्य_* तर्क पारित किए गए तर्कों का समूह हैं
सभी ईवेंट संचालक; कुछ फ़ील्ड प्रारूप में सामान्य_* फ़ील्ड के अनुरूप हैं
फ़ाइल, लेकिन कुछ संश्लेषित हैं, और कुछ सामान्य_* फ़ील्ड पर्याप्त रूप से सामान्य नहीं हैं
प्रत्येक घटना को तर्क के रूप में पारित किया जा सकता है लेकिन लाइब्रेरी फ़ंक्शंस के रूप में उपलब्ध हैं।
यहां प्रत्येक अपरिवर्तनीय घटना तर्क का संक्षिप्त विवरण दिया गया है:
इवेंट_इवेंट का नाम टेक्स्ट के रूप में रखें
संदर्भ में एक अपारदर्शी 'कुकी' का उपयोग कॉल बैक में किया जाता है
आम_सीपीयू वह सीपीयू जिस पर घटना घटी
आम_सेक इवेंट टाइमस्टैम्प का सेकंड भाग
आम_nsecs ईवेंट टाइमस्टैम्प का nsecs भाग
सामान्य_पिड वर्तमान कार्य की पिड
सामान्य_कॉम वर्तमान प्रक्रिया का नाम है
इवेंट के प्रारूप फ़ाइल में शेष सभी फ़ील्ड में हैंडलर के रूप में समकक्ष हैं
एक ही नाम के फ़ंक्शन तर्क, जैसा कि ऊपर के उदाहरण में देखा जा सकता है।
उपरोक्त प्रत्येक घटना के प्रत्येक क्षेत्र तक सीधे पहुंचने के लिए आवश्यक बुनियादी बातें प्रदान करता है
ट्रेस, जो एक उपयोगी ट्रेस स्क्रिप्ट लिखने के लिए आपको जो जानने की आवश्यकता है उसका 90% कवर करता है।
नीचे दिए गए अनुभाग शेष को कवर करते हैं।
स्क्रिप्ट लेआउट
प्रत्येक पूर्ण स्क्रिप्ट पायथन स्क्रिप्ट को पायथन मॉड्यूल खोज पथ सेट करके शुरू करना चाहिए
कुछ समर्थन मॉड्यूल आयात करना (नीचे मॉड्यूल विवरण देखें):
.फीट सी
आयात os
आयात sys
sys.path.append(os.environ['PERF_EXEC_PATH'] + \
'/स्क्रिप्ट/पायथन/परफ-ट्रेस-यूटिल/लिब/परफ/ट्रेस')
perf_trace_context आयात से *
कोर आयात से *
.एफटी
बाकी स्क्रिप्ट में किसी भी क्रम में हैंडलर फ़ंक्शंस और सपोर्ट फ़ंक्शंस शामिल हो सकते हैं।
ऊपर चर्चा किए गए इवेंट हैंडलर फ़ंक्शंस के अलावा, प्रत्येक स्क्रिप्ट एक सेट लागू कर सकती है
वैकल्पिक कार्यों की:
ट्रेस_शुरू, यदि परिभाषित किया गया है, तो किसी भी घटना को संसाधित करने से पहले कॉल किया जाता है और स्क्रिप्ट देता है
सेटअप कार्य करने का मौका:
.फीट सी
डीईएफ़ ट्रेस_शुरू:
पास
.एफटी
ट्रेस_एंड, यदि परिभाषित किया गया है, तो सभी घटनाओं के संसाधित होने के बाद कॉल किया जाता है और स्क्रिप्ट देता है
स्क्रिप्ट के अंतिम कार्य करने का मौका, जैसे परिणाम प्रदर्शित करना:
.फीट सी
डीईएफ़ ट्रेस_एंड:
पास
.एफटी
ट्रेस_अनहैंडल्ड, यदि परिभाषित किया गया है, तो किसी भी ऐसे ईवेंट के लिए बाद में कॉल किया जाता है जिसमें कोई हैंडलर नहीं है
इसके लिए स्पष्ट रूप से परिभाषित किया गया है। सामान्य तर्कों का मानक सेट इसमें पारित किया गया है:
.फीट सी
डीईएफ़ ट्रेस_अनहैंडल्ड(इवेंट_नाम, संदर्भ, कॉमन_सीपीयू, कॉमन_सेकंड,
सामान्य_एनएसईसी, सामान्य_पिड, सामान्य_कॉम):
पास
.एफटी
शेष अनुभाग प्रत्येक उपलब्ध अंतर्निहित पूर्ण स्क्रिप्ट का विवरण प्रदान करते हैं
पायथन मॉड्यूल और उनके संबंधित कार्य।
उपलब्ध मॉड्यूल और कार्य
निम्नलिखित अनुभाग विभिन्न पर्फेक्ट के माध्यम से उपलब्ध कार्यों और चर का वर्णन करते हैं
स्क्रिप्ट पायथन मॉड्यूल। दिए गए मॉड्यूल से फ़ंक्शंस और वेरिएबल्स का उपयोग करने के लिए, जोड़ें
अनुरूप से XXXX आयात आपकी पूर्ण स्क्रिप्ट स्क्रिप्ट के लिए लाइन।
Core.py मॉड्यूल
ये फ़ंक्शन उपयोगकर्ता स्क्रिप्ट को कुछ आवश्यक फ़ंक्शन प्रदान करते हैं।
RSI फ़्लैग_स्ट्र और प्रतीक_स्ट्र फ़ंक्शंस ध्वज और प्रतीकात्मक के लिए मानव-पठनीय स्ट्रिंग प्रदान करते हैं
खेत। ये पार्स किए गए स्ट्रिंग्स और मानों से मेल खाते हैं छाप fmt के क्षेत्र
इवेंट प्रारूप फ़ाइलें:
फ़्लैग_स्ट्र (इवेंट_नाम, फ़ील्ड_नाम, फ़ील्ड_वैल्यू) - इवेंट इवेंट_नाम के फ़्लैग फ़ील्ड फ़ील्ड_नाम के लिए फ़ील्ड_वैल्यू के अनुरूप स्ट्रिंग प्रतिनिधित्व लौटाता है
Symbol_str(event_name, field_name, field_value) - इवेंट इवेंट_नाम के प्रतीकात्मक फ़ील्ड field_name के लिए field_value के अनुरूप स्ट्रिंग प्रतिनिधित्व लौटाता है
RSI autodict फ़ंक्शन एक विशेष प्रकार का पायथन शब्दकोश लौटाता है जो पर्ल को लागू करता है
स्वत: जीवंत पायथन में हैश यानी ऑटोविविफाइंग हैश के साथ, आप नेस्टेड हैश असाइन कर सकते हैं
यदि वे ऐसा नहीं करते हैं तो मध्यवर्ती स्तर बनाने की परेशानी के बिना मूल्यों का उपयोग करें
मौजूद।
ऑटोडिक्ट() - एक ऑटोविविफाइंग डिक्शनरी उदाहरण लौटाता है
perf_trace_context मॉड्यूल
के कुछ सामान्य ईवेंट प्रारूप फ़ाइल में फ़ील्ड बिल्कुल सामान्य नहीं हैं, लेकिन होने की आवश्यकता है
फिर भी इसे उपयोगकर्ता स्क्रिप्ट के लिए सुलभ बनाया गया।
perf_trace_context फ़ंक्शंस के एक सेट को परिभाषित करता है जिसका उपयोग इस डेटा तक पहुंचने के लिए किया जा सकता है
वर्तमान घटना का संदर्भ. इनमें से प्रत्येक फ़ंक्शन एक संदर्भ चर की अपेक्षा करता है, जो है
प्रत्येक ईवेंट हैंडलर में दूसरे तर्क के रूप में पारित संदर्भ चर के समान।
कॉमन_पीसी(संदर्भ) - वर्तमान घटना के लिए कॉमन_प्रीमेप्ट गिनती लौटाता है
कॉमन_फ्लैग्स(संदर्भ) - वर्तमान घटना के लिए कॉमन_फ्लैग्स लौटाता है
कॉमन_लॉक_डेप्थ(संदर्भ) - वर्तमान घटना के लिए कॉमन_लॉक_डेप्थ लौटाता है
Util.py मॉड्यूल
पूर्ण स्क्रिप्ट के साथ उपयोग के लिए विभिन्न उपयोगिता कार्य:
nsecs(secs, nsecs) - दिए गए secs/nsecs जोड़ी का कुल nsecs लौटाता है
nsecs_secs(nsecs) - दिए गए nsecs का संपूर्ण secs भाग लौटाता है
nsecs_nsecs(nsecs) - दिए गए nsecs शेष को nsecs लौटाता है
nsecs_str(nsecs) - secs.nsecs के रूप में मुद्रण योग्य स्ट्रिंग लौटाता है
औसत (कुल, एन) - एक योग और मूल्यों की कुल संख्या दिए जाने पर औसत लौटाता है
onworks.net सेवाओं का उपयोग करके ऑनलाइन perf-script-python का उपयोग करें