Phiên bản mới nhất của systemtap đi kèm với rất nhiều example scripts. Một đặc biệt có vẻ như nó sẽ máy chủ như là một điểm khởi đầu tốt cho việc giúp bạn hoàn thành nhiệm vụ của bạn:
#! /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]))
}
Tôi đã cố gắng để chẩn đoán một cái gì đó tương tự với một quá trình MySQL trước và đầu ra quan sát tương tự như sau bằng cách sử dụng kịch bản ở trên :
mysqld[3991] lock 0x000000000a1589e0 contended 45 times, 3 avg us
mysqld[3991] lock 0x000000004ad289d0 contended 1 times, 3 avg us
Trong khi tập lệnh trên thu thập thông tin về tất cả các quá trình đang chạy trên hệ thống, sẽ dễ dàng sửa đổi để chỉ hoạt động trên một quy trình nhất định hoặc có thể thực thi. Ví dụ, chúng ta có thể thay đổi kịch bản để có một cuộc tranh luận quá trình ID và sửa đổi các thăm dò trên vào cuộc gọi futex để trông giống như:
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()
}
}
Rõ ràng, bạn có thể thay đổi rất nhiều kịch bản cách để phù hợp với những gì bạn muốn làm. Tôi khuyến khích bạn xem xét các kịch bản mẫu khác nhau cho SystemTap. Họ có lẽ là điểm khởi đầu tốt nhất.
Tôi e rằng bài đăng trên blog đề cập rõ ràng rằng nó không hữu ích khi đo lường tranh chấp khóa. –
Trong bình luận, anh nói anh không cố giải quyết các ký hiệu. – Eugene
Điểm tốt, tôi sẽ thử. –