systemtap की नवीनतम संस्करण example scripts के बहुत सारे के साथ आता है। विशेष रूप से एक लगता है यह मदद करने के लिए एक अच्छा प्रारंभिक बिंदु के रूप में सर्वर होगा जैसे आप अपने कार्य को पूरा:
#! /usr/bin/env stap
global thread_thislock
global thread_blocktime
global FUTEX_WAIT = 0
global lock_waits
global process_names
probe syscall.futex {
if (op != FUTEX_WAIT) next
t = tid()
process_names[pid()] = execname()
thread_thislock[t] = $uaddr
thread_blocktime[t] = gettimeofday_us()
}
probe syscall.futex.return {
t = tid()
ts = thread_blocktime[t]
if (ts) {
elapsed = gettimeofday_us() - ts
lock_waits[pid(), thread_thislock[t]] <<< elapsed
delete thread_blocktime[t]
delete thread_thislock[t]
}
}
probe end {
foreach ([pid+, lock] in lock_waits)
printf ("%s[%d] lock %p contended %d times, %d avg us\n",
process_names[pid], pid, lock, @count(lock_waits[pid,lock]),
@avg(lock_waits[pid,lock]))
}
मैं कुछ एक MySQL प्रक्रिया पहले से साथ इसी तरह के और मनाया उत्पादन ऊपर स्क्रिप्ट का उपयोग निम्न के समान निदान करने का प्रयास किया गया था :
mysqld[3991] lock 0x000000000a1589e0 contended 45 times, 3 avg us
mysqld[3991] lock 0x000000004ad289d0 contended 1 times, 3 avg us
ऊपर स्क्रिप्ट सिस्टम पर चलने वाले सभी प्रक्रियाओं के बारे में जानकारी एकत्र करता है, यह एक निश्चित प्रक्रिया या निष्पादन पर ही काम करने के लिए इसे संशोधित करने के लिए काफी आसान होगा। उदाहरण के लिए, हम एक प्रक्रिया आईडी तर्क लेते हैं और तरह देखने के लिए futex कॉल में प्रवेश पर जांच को संशोधित करने के लिए स्क्रिप्ट को बदल सकता है:
probe begin {
process_id = strtol(@1, 10)
}
probe syscall.futex {
if (pid() == process_id && op == FUTEX_WAIT) {
t = tid()
process_names[process_id] = execname()
thread_thislock[t] = $uaddr
thread_blocktime[t] = gettimeofday_us()
}
}
जाहिर है, तुम क्या आप चाहते हैं के अनुरूप करने के तरीकों में से स्क्रिप्ट बहुत संशोधित कर सकते कर। मैं आपको सिस्टमटैप के लिए विभिन्न उदाहरण स्क्रिप्ट्स पर नज़र रखने के लिए प्रोत्साहित करता हूं। वे शायद सबसे अच्छा प्रारंभिक बिंदु हैं।
मुझे डर है कि ब्लॉग पोस्ट स्पष्ट रूप से उल्लेख करता है कि यह लॉक विवाद को मापने के लिए बहुत उपयोगी नहीं था। –
टिप्पणियों में उन्होंने कहा कि उन्होंने प्रतीकों को हल करने का प्रयास नहीं किया था। – Eugene
अच्छा बिंदु, मैं इसे आज़मा दूंगा। –