Ini adalah skrip Python untuk mengubah keluaran dari banyak profiler menjadi grafik titik.
Itu bisa:
Jika Anda menginginkan penampil interaktif untuk grafik yang dihasilkan oleh gprof2dot , periksa xdot.py.
gprof2dot saat ini memenuhi kebutuhan saya, dan saya mempunyai sedikit atau tidak ada waktu untuk pemeliharaannya. Jadi, saya khawatir fitur apa pun yang diminta kemungkinan besar tidak akan diterapkan, dan saya mungkin lambat dalam memproses laporan masalah atau permintaan penarikan.
Berikut hasil contoh data pada artikel Linux Gazette dengan pengaturan default:
Di Debian/Ubuntu jalankan:
apt-get install python3 graphviz
Di jalankan RedHat/Fedora
yum install python3 graphviz
PyPI
pip install gprof2dot
Skrip mandiri
Repositori Git
Usage:
gprof2dot.py [options] [file] ...
Options:
-h, --help show this help message and exit
-o FILE, --output=FILE
output filename [stdout]
-n PERCENTAGE, --node-thres=PERCENTAGE
eliminate nodes below this threshold [default: 0.5]
-e PERCENTAGE, --edge-thres=PERCENTAGE
eliminate edges below this threshold [default: 0.1]
-f FORMAT, --format=FORMAT
profile format: axe, callgrind, collapse, dtrace,
hprof, json, oprofile, perf, prof, pstats, sleepy,
sysprof or xperf [default: prof]
--total=TOTALMETHOD preferred method of calculating total time: callratios
or callstacks (currently affects only perf format)
[default: callratios]
-c THEME, --colormap=THEME
color map: bw, color, gray, pink or print [default:
color]
-s, --strip strip function parameters, template parameters, and
const modifiers from demangled C++ function names
--color-nodes-by-selftime
color nodes by self time, rather than by total time
(sum of self and descendants)
-w, --wrap wrap function names
--show-samples show function samples
--node-label=MEASURE measurements to on show the node (can be specified
multiple times): self-time, self-time-percentage,
total-time or total-time-percentage [default: total-
time-percentage, self-time-percentage]
--list-functions=LIST_FUNCTIONS
list functions available for selection in -z or -l,
requires selector argument ( use '+' to select all).
Recall that the selector argument is used with
Unix/Bash globbing/pattern matching, and that entries
are formatted '::'. When
argument starts with '%', a dump of all available
information is performed for selected entries, after
removal of leading '%'.
-z ROOT, --root=ROOT prune call graph to show only descendants of specified
root function
-l LEAF, --leaf=LEAF prune call graph to show only ancestors of specified
leaf function
--depth=DEPTH prune call graph to show only descendants or ancestors
until specified depth
--skew=THEME_SKEW skew the colorization curve. Values < 1.0 give more
variety to lower percentages. Values > 1.0 give less
variety to lower percentages
-p FILTER_PATHS, --path=FILTER_PATHS
Filter all modules not in a specified path
--compare Compare two graphs with almost identical structure. With this
option two files should be provided.gprof2dot.py
[options] --compare [file1] [file2] ...
--compare-tolerance=TOLERANCE
Tolerance threshold for node difference
(default=0.001%).If the difference is below this value
the nodes are considered identical.
--compare-only-slower
Display comparison only for function which are slower
in second graph.
--compare-only-faster
Display comparison only for function which are faster
in second graph.
--compare-color-by-difference
Color nodes based on the value of the difference.
Nodes with the largest differences represent the hot
spots.
perf record -g -- /path/to/your/executable
perf script | c++filt | gprof2dot.py -f perf | dot -Tpng -o output.png
opcontrol --callgraph=16
opcontrol --start
/path/to/your/executable arg1 arg2
opcontrol --stop
opcontrol --dump
opreport -cgf | gprof2dot.py -f oprofile | dot -Tpng -o output.png
Jika Anda belum familiar dengan xperf, bacalah artikel bagus ini terlebih dahulu. Kemudian lakukan:
Mulai xperf sebagai
xperf -on Latency -stackwalk profile
Jalankan aplikasi Anda.
Simpan datanya. ` xperf -d keluaran.etl
Mulai visualisator:
xperf output.etl
Di menu Jejak , pilih Muat Simbol . Konfigurasikan Jalur Simbol jika perlu.
Pilih area yang diinginkan pada grafik pengambilan sampel CPU , klik kanan, dan pilih Tabel Ringkasan .
Di menu Kolom , pastikan kolom Tumpukan diaktifkan dan terlihat.
Klik kanan pada baris, pilih Ekspor Tabel Lengkap , dan simpan ke output.csv .
Kemudian aktifkan gprof2dot sebagai
gprof2dot.py -f xperf output.csv | dot -Tpng -o output.png
Kumpulkan data profil sebagai (juga dapat dilakukan dari GUI):
amplxe-cl -collect hotspots -result-dir output -- your-app
Visualisasikan data profil sebagai:
amplxe-cl -report gprof-cc -result-dir output -format text -report-output output.txt
gprof2dot.py -f axe output.txt | dot -Tpng -o output.png
Lihat juga postingan blog Kirill Rogozhin.
/path/to/your/executable arg1 arg2
gprof path/to/your/executable | gprof2dot.py | dot -Tpng -o output.png
python -m profile -o output.pstats path/to/your/script arg1 arg2
gprof2dot.py -f pstats output.pstats | dot -Tpng -o output.png
python -m cProfile -o output.pstats path/to/your/script arg1 arg2
gprof2dot.py -f pstats output.pstats | dot -Tpng -o output.png
java -agentlib:hprof=cpu=samples ...
gprof2dot.py -f hprof java.hprof.txt | dot -Tpng -o output.png
Lihat postingan blog Russell Power untuk detailnya.
dtrace -x ustackframes=100 -n 'profile-97 /pid == 12345/ { @[ustack()] = count(); } tick-60s { exit(0); }' -o out.user_stacks
gprof2dot.py -f dtrace out.user_stacks | dot -Tpng -o output.png
# Notice: sometimes, the dtrace outputs format may be latin-1, and gprof2dot will fail to parse it.
# To solve this problem, you should use iconv to convert to UTF-8 explicitly.
# TODO: add an encoding flag to tell gprof2dot how to decode the profile file.
iconv -f ISO-8859-1 -t UTF-8 out.user_stacks | gprof2dot.py -f dtrace
Alat FlameGraph Brendan Gregg mengambil masukan file teks yang berisi satu baris per sampel. Format ini dapat dihasilkan dari berbagai input lain menggunakan skrip stackcollapse
di repositori FlameGraph. Itu juga dapat dihasilkan oleh alat seperti py-spy.
Contoh penggunaan:
Kinerja
perf record -g -- /path/to/your/executable
perf script | FlameGraph/stackcollapse-perf.pl > out.collapse
gprof2dot.py -f collapse out.collapse | dot -Tpng -o output.png
Mata-mata
py-spy record -p -f raw -o out.collapse
gprof2dot.py -f collapse out.collapse | dot -Tpng -o output.png
Gambar ini mengilustrasikan contoh penggunaan opsi --compare
dan --compare-color-by-difference
.
Panah yang menunjuk ke kanan menunjukkan node di mana fungsi berjalan lebih cepat di profil yang disediakan sebagai profil kedua (profil kedua), sedangkan panah yang menunjuk ke kiri menunjukkan node di mana fungsinya lebih cepat di profil yang disediakan sebagai profil pertama (profil pertama) .
+-----------------------------+
| function name
| total time % -/+ total_diff
| ( self time % ) -/+ self_diff /
| total calls1 / total calls2 /
+-----------------------------+
Di mana
total time %
dan self time %
berasal dari profil pertamadiff
dihitung sebagai nilai absolut time in the first profile - time in the second profile
.Catatan Opsi perbandingan telah diuji untuk profil pstats, ax dan callgrind.
Sebuah simpul dalam grafik keluaran mewakili suatu fungsi dan memiliki tata letak berikut:
+------------------------------+
| function name |
| total time % ( self time % ) |
| total calls |
+------------------------------+
Di mana:
Edge mewakili panggilan antara dua fungsi dan memiliki tata letak berikut:
total time %
calls
parent --------------------> children
Di mana:
Perhatikan bahwa dalam siklus rekursif, total waktu % dalam node adalah sama untuk seluruh fungsi dalam siklus, dan tidak ada total waktu % angka di tepi dalam siklus, karena angka tersebut tidak masuk akal.
Warna node dan tepi bervariasi sesuai dengan nilai % waktu total . Dalam peta warna seperti suhu default, fungsi yang menghabiskan sebagian besar waktu (titik panas) ditandai dengan warna merah jenuh, dan fungsi yang menghabiskan sedikit waktu ditandai dengan warna biru tua. Perhatikan bahwa fungsi-fungsi yang dapat diabaikan atau tidak ada waktu yang dihabiskan tidak muncul dalam grafik secara default.
Bendera --list-functions
mengizinkan pembuatan daftar entri fungsi yang ditemukan di masukan gprof
. Ini dimaksudkan sebagai alat untuk mempersiapkan pemanfaatan dengan tanda --leaf
( -l
) atau --root
( -z
).
prof2dot.py -f pstats /tmp/myLog.profile --list-functions "test_segments:*:*"
test_segments:5:,
test_segments:206:TestSegments,
test_segments:46:
Argumen pemilih digunakan dengan pencocokan globbing/pola Unix/Bash, dengan cara yang sama seperti yang dilakukan oleh flag -l
dan -z
.
Entri diformat '
Ketika argumen pemilih dimulai dengan '%', dump semua informasi yang tersedia dilakukan untuk entri yang dipilih, setelah penghapusan '%' di depan pemilih. Jika pemilihnya adalah "+" atau "*", daftar lengkap fungsi akan dicetak.
Secara default gprof2dot.py
menghasilkan grafik panggilan parsial , tidak termasuk node dan edge dengan sedikit atau tanpa dampak pada total waktu komputasi. Jika Anda menginginkan grafik panggilan lengkap, tetapkan ambang batas nol untuk node dan edge melalui opsi -n
/ --node-thres
dan -e
/ --edge-thres
, seperti:
gprof2dot.py -n0 -e0
Label node bisa menjadi sangat luas saat membuat profil kode C++, karena penyertaan cakupan, argumen fungsi, dan argumen templat dalam nama fungsi C++ yang telah didemangled.
Jika Anda tidak memerlukan informasi argumen fungsi dan templat, teruskan opsi -s
/ --strip
untuk menghapusnya.
Jika Anda ingin menyimpan semua informasi tersebut, atau jika labelnya masih terlalu lebar, Anda dapat meneruskan -w
/ --wrap
, untuk membungkus label. Perhatikan bahwa karena dot
tidak membungkus label secara otomatis, margin label tidak akan sejajar sempurna.
Kemungkinan besar, total waktu eksekusi terlalu singkat, sehingga profil tidak cukup presisi untuk menentukan di mana waktu tersebut dihabiskan.
Anda masih dapat memaksa menampilkan seluruh grafik dengan menetapkan ambang nol untuk node dan edge melalui opsi -n
/ --node-thres
dan -e
/ --edge-thres
, seperti:
gprof2dot.py -n0 -e0
Namun untuk mendapatkan hasil yang berarti, Anda perlu menemukan cara untuk menjalankan program untuk jangka waktu yang lebih lama (hasil gabungan dari beberapa proses).
Anda mungkin memiliki waktu eksekusi yang terlalu singkat, sehingga menyebabkan kesalahan pembulatan menjadi besar.
Lihat pertanyaan di atas untuk mengetahui cara menambah waktu eksekusi.
Pilihan yang penting untuk menghasilkan hasil yang sesuai adalah:
-g
: menghasilkan informasi debug-fno-omit-frame-pointer
: gunakan penunjuk bingkai (penggunaan penunjuk bingkai dinonaktifkan secara default di beberapa arsitektur seperti x86_64 dan untuk beberapa tingkat pengoptimalan; tidak mungkin menjalankan tumpukan panggilan tanpanya) Jika Anda menggunakan gprof Anda juga memerlukan opsi -pg
, namun saat ini Anda bisa mendapatkan hasil yang jauh lebih baik dengan alat pembuatan profil lainnya, yang sebagian besar tidak memerlukan instrumentasi kode khusus saat kompilasi.
Anda ingin kode yang Anda profilkan sedekat mungkin dengan kode yang akan Anda rilis. Jadi, Anda harus menyertakan semua opsi yang Anda gunakan dalam kode rilis Anda, biasanya:
-O2
: pengoptimalan yang tidak melibatkan pengorbanan kecepatan ruang-DNDEBUG
: menonaktifkan kode debug di perpustakaan standar (seperti makro penegasan)Namun banyak optimasi yang dilakukan oleh gcc mengganggu keakuratan/perincian hasil pembuatan profil. Anda harus meneruskan opsi ini untuk menonaktifkan pengoptimalan tertentu:
-fno-inline-functions
: jangan memasukkan fungsi ke dalam induknya (jika tidak, waktu yang dihabiskan untuk fungsi ini akan dikaitkan dengan pemanggil)-fno-inline-functions-called-once
: mirip dengan di atas-fno-optimize-sibling-calls
: jangan optimalkan panggilan rekursif saudara dan ekor (jika tidak, panggilan ekor dapat diatribusikan ke fungsi induk)Jika perincian masih terlalu rendah, Anda dapat meneruskan opsi berikut untuk mencapai perincian yang lebih halus:
-fno-default-inline
: jangan menjadikan fungsi anggota sebaris secara default hanya karena fungsi tersebut didefinisikan di dalam lingkup kelas-fno-inline
: jangan perhatikan kata kunci inline Namun perlu diperhatikan bahwa dengan opsi terakhir ini, pengaturan waktu fungsi yang dipanggil berkali-kali akan terdistorsi karena overhead pemanggilan fungsi. Hal ini terutama berlaku untuk kode C++ tipikal yang mengharapkan optimasi ini dilakukan untuk kinerja yang layak.Lihat daftar lengkap opsi pengoptimalan gcc untuk informasi lebih lanjut.
Lihat wiki untuk sumber daya eksternal, termasuk alat pelengkap/alternatif.