la última versión del systemtap viene con un montón de example scripts. Uno en particular, parece que sería servidor como un buen punto de partida para ayudar a lograr su tarea:
#! /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]))
}
yo estaba tratando de diagnosticar algo similar con un proceso de MySQL con anterioridad y la salida observada similar al siguiente usando la secuencia de comandos :
mysqld[3991] lock 0x000000000a1589e0 contended 45 times, 3 avg us
mysqld[3991] lock 0x000000004ad289d0 contended 1 times, 3 avg us
Mientras que el script anterior recoge información sobre todos los procesos que se ejecutan en el sistema, sería muy fácil para modificarlo para trabajar solamente en un determinado proceso o un ejecutable. Por ejemplo, podríamos cambiar el guión para tomar un argumento de ID de proceso y modificar la sonda al entrar en la llamada futex para parecerse a:
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()
}
}
Obviamente, podría modificar los lotes de guiones de formas para adaptarse a lo que quiere hacer. Te animo a echar un vistazo a los diversos scripts de ejemplo para SystemTap. Ellos son probablemente el mejor punto de partida.
Me temo que la publicación de blog menciona explícitamente que no fue muy útil para medir la contención de bloqueo. –
En los comentarios, dice que no intentó resolver los símbolos sin embargo. – Eugene
Buen punto, lo intentaré. –