Erlang 21

lcnt




erlang

lcnt

मॉड्यूल

lcnt

मॉड्यूल सारांश

एक रनटाइम सिस्टम लॉक प्रोफाइलिंग टूल।

विवरण

lcnt रनटाइम सिस्टम में आंतरिक एथ्रेड लॉक को प्रोफाइल करने के लिए lcnt मॉड्यूल का उपयोग किया जाता है। lcnt सक्षम होने के साथ, रनटाइम सिस्टम में आंतरिक काउंटरों को हर बार लॉक होने के बाद अपडेट किया जाता है। काउंटरर्स कोशिशों की संख्या और अधिग्रहण की कोशिशों के दौरान हुई टक्करों की संख्या के बारे में जानकारी संग्रहीत करता है। काउंटरों ने प्रतीक्षा समय को भी रिकॉर्ड किया है कि जब एक टक्कर हुई है तो एक अवरुद्ध धागे के लिए ताला लगा है।

लॉक काउंटरों द्वारा उत्पादित डेटा इस बात का अनुमान लगाएगा कि परीक्षण किए गए परिदृश्यों के लिए रनटाइम सिस्टम एक समानांतर दृश्य बिंदु से कितनी अच्छी तरह व्यवहार करेगा। यह उपकरण मुख्य रूप से Erlang क्रम डेवलपर्स को संभावित और सामान्य बाधाओं से बाहर निकलने में मदद करने के लिए विकसित किया गया था।

एमुलेटर में ताले का नाम किस प्रकार के संसाधन के आधार पर रखा जाता है और एमुलेटर में उन्हें आरंभिक रूप से रखा जाता है, वे लॉक 'क्लास' होते हैं। लॉकिंग ग्रैन्युलैरिटी बढ़ाने के लिए उनमें से अधिकांश तालों को कई बार तात्कालिक रूप से बदल दिया जाता है, और विशिष्ट पहचानकर्ता दिए जाते हैं। आमतौर पर एक तात्कालिक रूप से बंद संसाधन संसाधन के एक अव्यवस्थित सेट की रक्षा करता है, उदाहरण के लिए ईटीएस टेबल, प्रक्रिया या पोर्ट। अन्य मामलों में यह एक संसाधन की एक विशिष्ट श्रेणी की रक्षा करता है, उदाहरण के लिए pix_lock जो अनुक्रमण प्रक्रिया को मैपिंग की सुरक्षा करता है, और वर्ग के भीतर एक विशिष्ट संख्या दी जाती है। lcnt में एक अद्वितीय लॉक को एक नाम (वर्ग) और एक पहचानकर्ता द्वारा संदर्भित किया जाता है: {Name, Id}

सिस्टम में कुछ ताले स्थिर हैं और वैश्विक संसाधनों की रक्षा करते हैं, उदाहरण के लिए bif_timers और run_queue ताले। अन्य ताले गतिशील हैं और जरूरी नहीं कि वे लंबे समय तक जीवित रहें, उदाहरण के लिए ताले और ईट्स-टेबल ताले। अल्पकालिक ताले से आँकड़ों के डेटा को अलग से संग्रहीत किया जा सकता है जब ताले हटा दिए जाते हैं। यह व्यवहार स्मृति को बचाने के लिए डिफ़ॉल्ट रूप से बंद है, लेकिन lcnt:rt_opt({copy_save, true}) माध्यम से चालू किया जा सकता है lcnt:rt_opt({copy_save, true}) lcnt:apply/1,2,3 कार्य रूपरेखा के दौरान इस व्यवहार को सक्षम बनाता है।

निर्यात

start () -> {ठीक है, Pid} | {त्रुटि, {पहले से ही आरंभिक, पिड}}

प्रकार

लॉक प्रोफाइलर सर्वर शुरू करता है। सर्वर केवल उपयोगकर्ता के लिए एक माध्यम के रूप में कार्य करता है और lcnt:collect/1 द्वारा एकत्र किए गए डेटा की फ़िल्टरिंग और प्रिंटिंग करता है lcnt:collect/1

रोक () -> ठीक है

लॉक प्रोफाइलर सर्वर को बंद कर देता है।

इकट्ठा () -> ठीक है

समान collect(node()) रूप में समान।

इकट्ठा (नोड) -> ठीक है

प्रकार

रनटाइम सिस्टम से लॉक आँकड़े एकत्र करता है। फ़ंक्शन एक सर्वर शुरू करता है अगर यह पहले से ही शुरू नहीं हुआ है। यह तब सर्वर को लॉक आँकड़ों के साथ पॉप्युलेट करता है। यदि सर्वर ने कलेक्शन से पहले कोई भी लॉक स्टैटस डेटा रखा हो तो वह डेटा खो जाता है।

clear () -> ठीक है

समान clear(node())

स्पष्ट (नोड) -> ठीक है

प्रकार

रनटाइम सिस्टम से आंतरिक लॉक आँकड़ों को साफ करता है। यह केवल रनटाइम सिस्टम पर सर्वर पर डेटा को साफ नहीं करता है। स्थिर तालों के लिए सभी काउंटर शून्य हैं, वर्तमान में जीवित सभी गतिशील ताले शून्य हैं और अब नष्ट किए गए सभी सहेजे गए ताले हटा दिए गए हैं। यह अवधि टाइमर को भी रीसेट करता है।

संघर्ष () -> ठीक है

conflicts([]) रूप में भी conflicts([])

संघर्ष ([विकल्प]) -> ठीक है

प्रकार

आंतरिक ताले और उसके आँकड़ों की एक सूची प्रिंट करता है।

विकल्प विवरण के लिए, lcnt:inspect/2

स्थान () -> ठीक है

locations([]) समान।

स्थान ([विकल्प]) -> ठीक है

प्रकार

स्रोत कोड स्थानों द्वारा आंतरिक लॉक काउंटरों की सूची प्रिंट करता है।

विकल्प विवरण के लिए, lcnt:inspect/2

निरीक्षण (ताला) -> ठीक है

inspect(Lock, []) समान inspect(Lock, [])

निरीक्षण (ताला, [विकल्प]) -> ठीक है

प्रकार

एक विशिष्ट लॉक के लिए आंतरिक लॉक काउंटर की सूची प्रिंट करता है।

बंदरगाहों और प्रक्रियाओं के लिए लॉक Name और Id lcnt:swap_pid_keys/0 के उपयोग के साथ विनिमेय हैं lcnt:swap_pid_keys/0 और यही कारण है कि pid() और port() विकल्प का उपयोग Name और Id स्थान दोनों में किया जा सकता है। दोनों pids और पोर्ट छीन निर्माण के साथ विशेष पहचानकर्ता हैं और lcnt:pid/2,3 और lcnt:port/1,2 साथ फिर से बनाया जा सकता है।

विकल्प विवरण:

{combine, bool()}
एक लॉक क्लास के विभिन्न उदाहरणों से आंकड़ों को मिलाएं।
डिफ़ॉल्ट: true
{locations, bool()}
स्रोत फ़ाइल और लाइन संख्या द्वारा आंकड़े प्रिंट करें।
डिफ़ॉल्ट: false
{max_locks, MaxLocks}
अधिकतम मुद्रित तालों की संख्या या कोई भी सीमा none
डिफ़ॉल्ट: 20
{print, PrintOptions}
मुद्रण विकल्प:
name
ताले (कक्षाओं) का नामांकित ताला या नामित सेट। VM में लॉक को इनिशियलाइज़ करने के लिए इसी नाम का उपयोग किया जाता है।
id
ताले के सेट के लिए आंतरिक आईडी, हमेशा अद्वितीय नहीं। यह ets टेबल (db_tab) के लिए टेबल का नाम, पोर्ट के लिए पोर्ट आईडी, आवंटनकर्ताओं के लिए पूर्णांक पहचानकर्ता आदि हो सकता है।
type
लॉक का प्रकार: rw_mutex , mutex , spinlock , rw_spinlock या proclock
entry
{locations, true} संयोजन में {locations, true} यह विकल्प लॉक ऑपरेशंस सोर्स फ़ाइल और प्रत्येक प्रविष्टि के लिए आंकड़ों के साथ लाइन नंबर एंट्री-पॉइंट प्रिंट करता है।
tries
इस लॉक के अधिग्रहण की संख्या।
colls
टकराव की संख्या जब एक थ्रेड ने इस लॉक को हासिल करने की कोशिश की। यह तब होता है जब एक trylock EBUSY होता है, लिखने की कोशिश rw_lock पर पढ़ी जाती है, rw_lock पर आयोजित लेखन पर पढ़ी जाने वाली एक कोशिश, एक थ्रेड पहले से ही बंद लॉक को लॉक करने की कोशिश करता है। (आंतरिक राज्य इसकी देखरेख करते हैं)।
ratio
प्रतिशत में टकराव की संख्या और कोशिशों (अधिग्रहण) की संख्या के बीच का अनुपात।
time
इस लॉक के लिए प्रतीक्षित प्रतीक्षित समय। यह वास्तविक दीवार घड़ी के समय से अधिक हो सकता है, यह सभी थ्रेड्स के लिए जमा होता है। ट्राईलॉक संघर्ष समय को जमा नहीं करता है।
duration
दीवार घड़ी के समय के संचित प्रतीक्षा समय का प्रतिशत। सभी थ्रेड्स से संचित समय के बाद यह प्रतिशत 100% से अधिक हो सकता है।

डिफ़ॉल्ट: [name,id,tries,colls,ratio,time,duration]
{reverse, bool()}
छँटाई के क्रम को उलट देता है।
डिफ़ॉल्ट: false
{sort, Sort}
कॉलम छँटाई के आदेश।
डिफ़ॉल्ट: time
{thresholds, Thresholds}
थ्रेशोल्ड छानना। थ्रेशोल्ड मान के ऊपर कुछ भी मानों को पार किया जाता है।
डिफ़ॉल्ट: [{tries, 0}, {colls, 0}, {time, 0}]
जानकारी () -> ठीक है

प्रिंटेड सर्वर और प्रिंटेड लॉक आँकड़ों के बारे में सामान्य जानकारी प्रिंट करता है।

swap_pid_keys () -> ठीक है

बंदरगाहों और प्रक्रियाओं के लिए Name और Id जगह पर स्वैप।

लोड (फ़ाइल नाम) -> ठीक है

प्रकार

सर्वर पर पहले से सहेजे गए डेटा को पुनर्स्थापित करता है।

सहेजें (फ़ाइल नाम) -> ठीक है

प्रकार

फ़ाइल करने के लिए एकत्रित डेटा बचाता है।

सुविधा कार्य

निम्नलिखित कार्यों का उपयोग सुविधा के लिए किया जाता है।

निर्यात

लागू करें (मज़ा) -> शब्द ()

प्रकार

समान रूप से apply(Fun, [])

लागू करें (मज़ा, आर्ग्स) -> शब्द ()

प्रकार

apply(Module, Function, Args)

लागू करें (मॉड्यूल, फ़ंक्शन, आर्ग) -> शब्द ()

प्रकार

लॉक काउंटरों को साफ करता है और फिर सभी नष्ट हुए ताले को बचाने के लिए इंस्ट्रूमेंटेशन सेटअप करता है। सेटअप के बाद फ़ंक्शन को कहा जाता है, Args में तत्वों को तर्क के रूप में पारित करना। जब फ़ंक्शन वापस आता है तो आंकड़े तुरंत सर्वर में एकत्र हो जाते हैं। संग्रह के बाद इंस्ट्रूमेंटेशन अपने पिछले व्यवहार में वापस आ जाता है। लागू फ़ंक्शन का परिणाम वापस आ गया है।

चेतावनी

इस फ़ंक्शन का उपयोग केवल माइक्रो-बेंचमार्क के लिए किया जाना चाहिए; यह कॉल की अवधि के लिए copy_save को true सेट करता है, जिससे मेमोरी जल्दी से चल सकती है।

पिड (आईडी, सीरियल) -> पिड ()

pid(node(), Id, Serial)

पिड (नोड, आईडी, सीरियल) -> पिड ()

प्रकार

निर्माण के साथ एक प्रक्रिया आईडी बनाता है 0।

port (Id) -> port ()

port(node(), Id)

पोर्ट (नोड, आईडी) -> पोर्ट ()

प्रकार

निर्माण के साथ एक पोर्ट आईडी बनाता है 0।

आंतरिक रनटाइम लॉक काउंटर कंट्रोलर

निम्नलिखित कार्य आंतरिक काउंटर के व्यवहार को नियंत्रित करते हैं।

निर्यात

rt_collect () -> [lock_counter_data ()]

rt_collect(node())

rt_collect (नोड) -> [lock_counter_data ()]

प्रकार

कच्चे लॉक काउंटर डेटा की सूची लौटाता है।

rt_clear () -> ठीक है

rt_clear(node())

rt_clear (नोड) -> ठीक है

प्रकार

आंतरिक काउंटर साफ़ करें। lcnt:clear(Node) समान lcnt:clear(Node)

rt_mask () -> [category_atom ()]

rt_mask(node())

rt_mask (Node) -> [category_atom ()]

प्रकार

मान्य श्रेणियों की सूची के लिए rt_mask/2 देखें। सभी श्रेणियां डिफ़ॉल्ट रूप से सक्षम हैं।

rt_mask (श्रेणियाँ) -> ठीक है | {त्रुटि, copy_save_enabled}

प्रकार

rt_mask(node(), Categories)

rt_mask (नोड, श्रेणियां) -> ठीक | {त्रुटि, copy_save_enabled}

प्रकार

लॉक श्रेणी मास्क को दिए गए श्रेणियों में सेट करता है।

यदि copy_save विकल्प सक्षम है तो यह विफल हो जाएगा; lcnt:rt_opt/2 देखें lcnt:rt_opt/2

मान्य श्रेणियां हैं:

  • allocator
  • db (ETS टेबल)
  • debug
  • distribution
  • generic
  • io
  • process
  • scheduler

यह सूची किसी भी समय परिवर्तन के अधीन है, क्योंकि श्रेणी किसी भी दिए गए लॉक की हो सकती है।

rt_opt ({प्रकार, बूल ()}) -> बूल ()

rt_opt(node(), {Type, Opt})

rt_opt (नोड, {प्रकार, बूल ()}) -> बूल ()

प्रकार

विकल्प विवरण:

{copy_save, bool()}
नष्ट किए गए तालों के आंकड़ों को बनाए रखता है।
डिफ़ॉल्ट: false
चेतावनी

सक्षम होने पर यह विकल्प बहुत सारी मेमोरी का उपयोग करेगा, जिसे lcnt:rt_clear साथ पुनः प्राप्त किया जाना चाहिए। ध्यान दें कि यह उन तालों के बीच कोई अंतर नहीं करता है जो नष्ट हो गए थे और ताले जिनके लिए गिनती को अक्षम किया गया था, इसलिए इस विकल्प को सक्षम करने से लॉक श्रेणी के मुखौटे में परिवर्तन निष्क्रिय हो जाएंगे।

{process_locks, bool()}
प्रोफ़ाइल प्रक्रिया ताले, लॉक श्रेणी मुखौटा में process जोड़ने के बराबर; lcnt:rt_mask/2 देखें lcnt:rt_mask/2
डिफ़ॉल्ट: true

यह भी देखें

LCNT User's Guide