2012-06-03 21 views
6

Sadece google performans araçlarını (google-perftools ve ubuntu'da libgoogle-perftools4 paketleri) kullanmaya başladım, yemin ederim ki bir günlüğüne geziyorum ve bir cevap bulamadım! Sorun şu ki, CPU profilleme ile TÜM işlevlerimin sonucunu alamıyorum.Google perf araçları nasıl kullanılır?

CPUPROFILE=dump.txt ./a.out 

Ben de bu denedim:

CPUPROFILE_FREQUENCY=10000 LD_PRELOAD=/usr/local/lib/libprofiler.so.0.3.0 CPUPROFILE=dump.txt ./a.out 

Ve bu ben kod çalıştırmasına nasıl

#include "gperftools/profiler.h" 
#include <iostream> 
#include <math.h> 
using namespace std; 
void bar() 
{ 
     int a,b,c,d,j,k; 
     a=0; 
     int z=0; 
     b = 1000; 
     while(z < b) 
     { 
       while (a < b) 
       { 
         d = sin(a); 
         c = cos(a); 
         j = tan(a); 
         k = tan(a); 
         k = d * c + j *k; 
         a++; 
       } 
       a = 0; 
       z++; 
     } 
} 
void foo() 
{ 
     cout << "hey " << endl; 
} 

int main() 
{ 
     ProfilerStart("/home/mohammad/gperf/dump.txt"); 

     int a = 1000; 
     while(a--){foo();} 
     bar(); 
     ProfilerFlush(); 
     ProfilerStop(); 
} 

g++ test.cc -lprofiler -o a.out

olarak Derleyen: Bu benim kodudur google-pprof --text a.out dump.txt'dan aldığım şey:

Using local file ./a.out. 
Using local file ./dump.txt. 
Total: 22 samples 
8 36.4% 36.4%  8 36.4% 00d8cb04 
6 27.3% 63.6%  6 27.3% bar 
3 13.6% 77.3%  3 13.6% __cos (inline) 
2 9.1% 86.4%  2 9.1% 00d8cab4 
1 4.5% 90.9%  1 4.5% 00d8cab6 
1 4.5% 95.5%  1 4.5% 00d8cb06 
1 4.5% 100.0%  1 4.5% __write_nocancel 
0 0.0% 100.0%  3 13.6% __cos 

Ancak foo işlevi hakkında hiçbir bilgi yok!

benim sistem bilgisi: ubuntu 12.04 gr ++ 4.6.3

İşte tüm!

+1

"CPUPROFILE_FREQUENC = 10000" ifadesini denediniz, ancak bu bir Y eksik, bu yüzden eğer fiili (ve yoksayılırsa) o zaman küçük foo'yu göstermek için yeterli örnekleriniz olmayabilir. – mgkrebbs

+0

CPU saatine bakıyorsunuz, duvar saati değil. CPU zamanı 'foo' kullanım miktarı neredeyse hiçbir şeydir. Tek yaptığı, I/O yapan kütüphane fonksiyonlarıdır ve I/O sırasında CPU örnekleri gerçekleşmez. –

cevap

9

TL; DR: foo profil olayları almak için hızlı ve küçük, 100 kez daha çalıştırın. Sıklık ayarı yazım hatasıyla yapıldı ve pprof, CONFIG_HZ'den (genellikle 250) daha sık örneklemiyor. Daha modern bir Linux'a geçmek daha iyidir perf profiler (tutorial from its authors, wikipedia).

Uzun versiyon:

Sizin foo fonksiyonu sadece çok kısa ve basit - sadece iki işlevi çağırır. çok daha büyük bir şeye ana yılında int a = 1000; değişen

foo(): 
.LFB972: 
     .loc 1 27 0 
     pushq %rbp 
     movq %rsp, %rbp 
     .loc 1 28 0 
     movl $.LC0, %esi 
     movl std::cout, %edi 
     call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) 
     movl std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&), %esi 
     movq %rax, %rdi 
     call std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&)) 
     .loc 1 29 0 
     popq %rbp 
     ret 
.LFE972: 
     .size foo(), .-foo() 

Yani, daha fazla kez için foo çalışmalıdır profilinde görmek: okunabilir C++ isimleri yapmaya c++filt programla test.s filtrelenmesi ile g++ test.cc -lprofiler -o test.s -S -g ile testi, Derleyen 10000 veya daha iyi 100000 gibi (test için yaptığım gibi).

Ayrıca "CPUPROFILE_FREQUENC=10000" hatasını düzeltmek için CPUPROFILE_FREQUENCY numaralı telefonu düzeltin (Y numaralı telefonu unutmayın). 10000'ün CPUPROFILE_FREQUENCY için çok yüksek bir ayar olduğunu söylemeliyim, çünkü genellikle çekirdek yapılandırması CONFIG_HZ'a bağlı olarak saniyede 1000 veya 250 olay oluşturabilir (çoğu 3.x çekirdeğin 250'si var, grep CONFIG_HZ= /boot/config*'u kontrol edin). Ve pprof içinde CPUPROFILE_FREQUENCY için varsayılan ayar 100'dir.

Ubuntu 14 üzerinde bash komut dosyasıyla farklı CPUPROFILE_FREQUENCY: 100000, 10000, 1000, 250 değerlerini test ettim.

for a in 100000 100000 10000 10000 1000 1000 300 300 250 250; do 
    echo -n "$a "; 
    CPUPROFILE_FREQUENCY=$a CPUPROFILE=dump$a.txt ./test >/dev/null; 
done 

04 Ve sonuç CONFIG_HZ set daha tek iş parçacığı saniyede daha fazla etkinlik, yapamaz google-perftools aynı 120-140 olayları ve yaklaşık 0.5 saniye her ./test çalışma zamanı, yani cpuprofiler vardı çekirdeğimde (250 tane var). Orijinal bir = 1000 foo ve cout fonksiyonlarının ile

100000 PROFILE: interrupts/evictions/bytes = 124/1/6584 
100000 PROFILE: interrupts/evictions/bytes = 134/0/7864 
10000 PROFILE: interrupts/evictions/bytes = 125/0/7488 
10000 PROFILE: interrupts/evictions/bytes = 123/0/6960 
1000 PROFILE: interrupts/evictions/bytes = 134/0/6264 
1000 PROFILE: interrupts/evictions/bytes = 125/2/7272 
300 PROFILE: interrupts/evictions/bytes = 137/2/7984 
300 PROFILE: interrupts/evictions/bytes = 126/0/7216 
250 PROFILE: interrupts/evictions/bytes = 123/3/6680 
250 PROFILE: interrupts/evictions/bytes = 137/2/7352 

hiçbir foo var bu yüzden her vadede üzerlerinde herhangi profilleme olay (hatta 250 etkinlik/s) almak için çok hızlı çalışır, ne de herhangi bir giriş/çıkış fonksiyonları . Küçük miktarlarda, __write_nocancel örnekleme olayına sahip olabilir ve sonra foo ve I/O işlevleri libstdC++ şeklinde raporlanır (en üstte olmayan bir yerde, veya google-pprof seçeneğinin google-pprof seçeneğini kullanın)

a=100000 ile
.... 
    1 0.9% 99.1%  1 0.9% __write_nocancel 
.... 
    0 0.0% 100.0%  1 0.9% _IO_new_file_overflow 
    0 0.0% 100.0%  1 0.9% _IO_new_file_write 
    0 0.0% 100.0%  1 0.9% __GI__IO_putc 
    0 0.0% 100.0%  1 0.9% foo 
    0 0.0% 100.0%  1 0.9% new_do_write 
    0 0.0% 100.0%  1 0.9% std::endl 
    0 0.0% 100.0%  1 0.9% std::ostream::put 

, foo hala kendi olayları için çok kısa ve hızlı olduğunu, ancak G/Ç fonksiyonları birkaç var: sıfır olmayan çocuk olay sayılır. Sıfır kendi sayaçları ile

34 24.6% 24.6%  34 24.6% __write_nocancel 

    1 0.7% 95.7%  35 25.4% __GI__IO_fflush 
    1 0.7% 96.4%  1 0.7% __GI__IO_putc 
    1 0.7% 97.8%  2 1.4% std::operator<< 
    1 0.7% 98.6%  36 26.1% std::ostream::flush 
    1 0.7% 99.3%  2 1.4% std::ostream::put 
    0 0.0% 100.0%  34 24.6% _IO_new_file_sync 
    0 0.0% 100.0%  34 24.6% _IO_new_file_write 
    0 0.0% 100.0%  40 29.0% foo 

    0 0.0% 100.0%  34 24.6% new_do_write 

    0 0.0% 100.0%  2 1.4% std::endl 

Fonksiyonlar sadece sayesinde okuma çağrısı zincirleri (çerçeve bilgisi ihmal değilse o örneği aldım işlevlerini çağıran kim bilir) ait pprof yeteneği görülmektedir: Bu uzun --text çıkışından grepped listesidir .

Ben de daha modern, daha yetenekli tavsiye edebilir

(hem yazılım ve donanım olaylarını en fazla 5 kHz frekans veya daha fazla; hem kullanıcı alanı ve çekirdek profilleme) ve daha iyi desteklenen profilci Linux perf profilci (tutorial from its authors, wikipedia) .

perf den a=10000 ile sonuç yok:

$ perf report |less 
... skip some extra info about the machine, kernel, and perf starting command 
# Samples: 1K of event 'cycles' 
# Event count (approx.): 1155264208 
# Overhead Command Shared Object   Symbol 
    41.94% test3 libm-2.19.so   [.] __tan_sse2                                          
    16.95% test3 libm-2.19.so   [.] __sin_sse2  
    13.40% test3 libm-2.19.so   [.] __cos_sse2                                          
    4.93% test3 test3    [.] bar()                                           
    2.90% test3 libc-2.19.so   [.] __GI___libc_write  
.... 
    0.20% test3 test3    [.] foo()                                           

:

$ perf record ./test3 >/dev/null 
... skip some perf's spam about inaccessibility of kernel symbols 
... note the 3 kHz frequency here VVVV 
Lowering default frequency rate to 3250. 
Please consider tweaking /proc/sys/kernel/perf_event_max_sample_rate. 
[ perf record: Woken up 1 times to write data ] 
[ perf record: Captured and wrote 0.078 MB perf.data (~3386 samples) ] 

Ben (varsayılan başlar tarafından interaktif profil tarayıcısını çünkü perf report) daha az kullanacağız perf.data çıktı dosyasından metin raporunu görmek için Veya ham olayı (örnek) sayaçlarını görmek için veya perf report -n | less:

# Overhead  Samples Command  Shared Object 
    41.94%   663 test3 libm-2.19.so   [.] __tan_sse2                                          
    16.95%   268 test3 libm-2.19.so   [.] __sin_sse2 
    13.40%   212 test3 libm-2.19.so   [.] __cos_sse2                                          
    4.93%   78 test3 test3    [.] bar()                                           
    2.90%   62 test3 libc-2.19.so   [.] __GI___libc_write  
.... 
    0.20%    4 test3 test3    [.] foo()                                           
İlgili konular