2013-03-25 13 views
5

Qualcuno sa come ottenere gli accessi alla memoria (puntatori) che causano errori di pagina? Sono interessato principalmente ai principali errori di pagina.Accesso alla memoria di registro che causa gravi errori di pagina

Un po 'di background su ciò che sto cercando di ottenere. Ho un'applicazione con un ingombro di memoria di grandi dimensioni (un database) e voglio correlare il paging con gli accessi alle grandi strutture di dati (come le tabelle, gli indici che sono allocati usando mmap()). Le mappature del processo sono facili da recuperare da/proc // maps. Ora, se ho gli accessi alla memoria che causano errori di pagina, posso tenere traccia del numero di errori di pagina causati dall'accesso a ciascuna struttura di dati.

Penso che perf o systemtap potrebbe fare il lavoro. Qualche idea?

risposta

6

vedere cosa è disponibile presso il punto della sonda:

% stap -L vm.pagefault 
vm.pagefault name:string write_access:long address:long $mm:struct mm_struct* \ 
    $vma:struct vm_area_struct* $address:long unsigned int $flags:unsigned int 

Log, il tentativo di mappare gli indirizzi per i nomi dei simboli

# stap -e 'probe vm.pagefault { if (execname()=="foo") { printf("%p (%s)\n", address, usymdata(address)) } }' -d /bin/foo --ldd 

Vedi anche: http://sourceware.org/systemtap/examples/#memory/pfaults.stp

6

La tua ipotesi è giusto. È possibile utilizzare lo strumento perf per tenere traccia del numero di errori di pagina causati dall'applicazione.

Si consiglia di leggere this tutorial per imparare a utilizzare lo strumento.

Per installare basta usare:

Stai cercando l'evento page fault. È possibile installare (in Ubuntu o altra distribuzione apt) da:

sudo apt-get install linux-tools-common linux-base 
sudo apt-get install linux-tools-YOUR-KERNEL number 

È possibile ottenere il numero di kernel con: uname -r

A titolo di esempio, questo comando esegue lo strumento perf sulle "ls "comando:

perf record -e page-faults:u -F 250 ls 

e quindi si può guardare i risultati (il binario di 'ls' non ha informazioni di debug, quindi non aspettatevi una bella uscita) con:

perf report