2013-03-25 11 views
5

Sayfanın hata yapmasına neden olan bellek erişimlerine (işaretçiler) nasıl ulaşılacağını bilen var mı? Çoğunlukla ana sayfa hatalarıyla ilgileniyorum.Önemli sayfa hatalarına neden olan bellek erişimlerini günlüğe kaydetme

Neyi başarmaya çalıştığım hakkında biraz arka plan. Büyük bir bellek ayak izi (bir veritabanı) ile bir uygulama var ve büyük veri yapıları (mmap() kullanılarak ayrılan tablolar, dizinler gibi) erişim ile sayfalama ilişkilendirmek istiyorum. Sürecin eşlemeleri/proc // haritalarından kolayca alınabilir. Şimdi, sayfa hatalarına neden olan bellek erişimlerine sahip olursam, her veri yapısına erişirken kaç sayfa hatasına neden olduğunu izleyebilirim.

Bence perf veya systemtap işi yapabilir. Herhangi bir fikir?

cevap

6

sonda noktada mevcut ne bakınız:

% 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 

Günlüğü, sembol isimlerinin de

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

bakınız Adresleri haritasının yapılması: http://sourceware.org/systemtap/examples/#memory/pfaults.stp

6

Tahminin doğru. Uygulamanızın neden olduğu sayfa hataları sayısını izlemek için mükemmel bir araç kullanabilirsiniz.

Aracı kullanmayı öğrenmek için this tutorial numaralı telefonu okumanızı öneririm. Sadece yüklemek için

kullanın: Sen sayfa arıza durumunda arıyoruz

.

Örnek olarak

bu komut "ls perf aracını -r çalışır'uname: Sen ile çekirdek sayısını elde edebilirsiniz

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

: Sen tarafından (ubuntu veya diğer apt dağılımında) yükleyebilirsiniz "komutu:

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

ve sonra sonuçları bakabilirsiniz (bir ikili ':

ile ls' hayır hata ayıklama bilgilerini, bu yüzden oldukça çıkışını sanmıyoruz)