L'ultima versione di systemtap viene fornito con un sacco di example scripts. Uno in particolare sembra che sarebbe server come un buon punto di partenza per aiutare a realizzare il vostro compito:
#! /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]))
}
stavo cercando di individuare eventuali qualcosa di simile con un processo di MySQL in precedenza e l'output osservato simile al seguente utilizzando lo script di cui sopra :
mysqld[3991] lock 0x000000000a1589e0 contended 45 times, 3 avg us
mysqld[3991] lock 0x000000004ad289d0 contended 1 times, 3 avg us
mentre lo script sopra raccoglie le informazioni su tutti i processi in esecuzione sul sistema, sarebbe abbastanza facile da modificare per lavorare solo su un determinato processo o eseguibile. Ad esempio, potremmo modificare lo script di prendere un argomento ID di processo e modificare la sonda entrando la chiamata futex a guardare come:
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()
}
}
Ovviamente, è possibile modificare i lotti di script di modi per soddisfare ciò che si vuole fare. Ti inviterei a dare un'occhiata ai vari script di esempio per SystemTap. Probabilmente sono il miglior punto di partenza.
Ho paura che il post sul blog menzioni esplicitamente che non era molto utile per misurare la contesa del blocco. –
Nei commenti dice che non ha provato a risolvere i simboli però. – Eugene
Buon punto, ci proverò. –