2014-04-25 11 views
7

Bellek okuduğum/yazdığım birkaç sistem çağrısını karşılaştırıyorum. C'da sayfa hatalarını (sayfa içi/dışı) ölçmek için tanımlı herhangi bir API var mı? Bir c programından sayfa hatalarını ölçün

Bu kütüphane libperfstat.a bulundu ancak AIX için ben linux için bir şey bulamadı olduğunu.

Düzenleme: beni C programı içinde kullanabileceği bir şey varsa sadece keşfetmek, linux time & perf-stat komutların farkındayım.

+1

Bu bir C kütüphanesi değildir, ancak sayfa hataları da dahil olmak üzere programınızla ilgili çok sayıda bilgiyi görüntülemek için 'time -v a.out' komutunu kullanabilirsiniz. – Daniel

+0

Bağlantının 1. satırında "C' programlama dili altprogramlarının toplanması" yazıyor. 'Zaman' komutunu biliyorum ama 'C' programının içinden bir şey yapılabiliyorsa araştırıyordum. Yine de teşekkürler! – brokenfoot

+0

"C programında benim için kullanılabilir." - yanlışlığa tahammül edebilir misin? Muhtemelen bu kadar fazla bir API yoktur, çünkü bu kadar zayıf bir şekilde tanımlanmıştır (bu sistem çağrısına girip çıkarken hatalar olabilir, ne zaman rapor etmeyi istiyorsunuz?). –

cevap

2

getrusage fonksiyonu (SVR4, 4.3BSD yoktur aşağıdaki gibi aramak zorunda

hiçbir lib C sarıcı yoktur. POSIX.1-2001; ancak tüm alanlar standart olarak tanımlanmamıştır). Linux kullanımında broken fields birkaç var ama man getrusage listeleri birçok ilginç alanları:

long ru_minflt;  /* page reclaims (soft page faults) */ 
long ru_majflt;  /* page faults (hard page faults) */ 

long ru_inblock;  /* block input operations */ 
long ru_oublock;  /* block output operations */ 

rusage da (harici programda yalnızca kullanılabilir) wait4 bildirilir. Bu, /usr/bin/time programı tarafından kullanılır (küçük/büyük sayfa hataları sayımlarını yazdırır).

+0

Güzelce çalıştı :)! Teşekkür ederim! – brokenfoot

+0

'ru_inblock' /' ru_oublock', pagecache'yi boşaltdıktan sonra 'read()' isteklerinizi saydı mı? – osgx

+1

Evet, bu doğrusal olarak ölçeklendirildi. 'blok giriş işlemleri' = '8' (dosya boyutu 1K)' 'giriş işlemlerini engelle' = '2234992' (dosya boyutu 1G) :) – brokenfoot

2

Bu bir API değildir, ancak benim kendi programımın içinden okuma/proc/myPID/statümü kendi süreçlerim için sayfa hata istatistiklerini içeren C programımdan geçirerek çok fazla başarı elde ettim. programımı çalıştırdığım ve depoladığım gibi gerçek zamanlı olarak izler.

Bunu yapmanın, sayfa hatalarının kendi kendine neden olabileceğini unutmayın, bu nedenle bazı yanlışlıklar olacaktır, ancak genel bir fikir edineceksiniz. Eğer Linux üzerinde çalıştırıyorsanız https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_MRG/1.3/html/Realtime_Reference_Guide/chap-Realtime_Reference_Guide-Memory_allocation.html

+0

Bu iyi bir fikir! :) Teşekkürler! – brokenfoot

6

, siz (perf stat tarafından kullanılan) perf_event_open sistem çağrısını kullanabilirsiniz:

dosyanın formatının detayları için buraya bakınız. Doğru parametreleri almak biraz zor, http://web.eece.maine.edu/~vweaver/projects/perf_events/perf_event_open.html numaralı adama bakın ve aşağıdaki kodu inceleyin. sayfa hataları

static long perf_event_open(struct perf_event_attr *hw_event, 
       pid_t pid, 
       int cpu, 
       int group_fd, 
       unsigned long flags) { 
    int ret = syscall(__NR_perf_event_open, hw_event, pid, cpu, 
      group_fd, flags); 
    return ret; 
} 

ve sonra saymak için:

struct perf_event_attr pe_attr_page_faults; 
    memset(&pe_attr_page_faults, 0, sizeof(pe_attr_page_faults)); 
    pe_attr_page_faults.size = sizeof(pe_attr_page_faults); 
    pe_attr_page_faults.type = PERF_TYPE_SOFTWARE; 
    pe_attr_page_faults.config = PERF_COUNT_SW_PAGE_FAULTS; 
    pe_attr_page_faults.disabled = 1; 
    pe_attr_page_faults.exclude_kernel = 1; 
    int page_faults_fd = perf_event_open(&pe_attr_page_faults, 0, CPU, -1, 0); 
    if (page_faults_fd == -1) { 
    printf("perf_event_open failed for page faults: %s\n", strerror(errno)); 
    return -1; 
    } 

    // Start counting 
    ioctl(page_faults_fd, PERF_EVENT_IOC_RESET, 0); 
    ioctl(page_faults_fd, PERF_EVENT_IOC_ENABLE, 0); 

    // Your code to be profiled here 
    ..... 

    // Stop counting and read value 
    ioctl(page_faults_fd, PERF_EVENT_IOC_DISABLE, 0); 
    uint64_t page_faults_count; 
    read(page_faults_fd, &page_faults_count, sizeof(page_faults_count)); 
+0

Bu iyi bir şey, ancak bunun C ciltleme olmadığını unutmayın. – Vality

+0

Evet, burada sarıcı kodunu yazmak için henüz zamanım olmadı. –

+0

Harika bir örnek, teşekkür ederim! – osgx