Bagaimana kami menambahkan sentuhan kesempurnaan ke alat analisis kinerja Linux Perf GUI (Hotspot)

Dalam salah satu proyek kami, kami meningkatkan profiler Linux Perf GUI dengan mengembangkan fungsionalitas barunya.



Kebutuhan pelanggan dapat diungkapkan dengan karakteristik profiler yang diinginkan berikut ini:



  • memiliki alat analisis kinerja untuk sekumpulan arsitektur tertentu;
  • dapat melakukan analisis kinerja secara mendalam hingga instruksi dalam kode yang dibongkar;
  • memiliki cara untuk melihat dan bekerja dengan keluaran kode yang telah dibongkar dalam GUI yang nyaman untuk rangkaian arsitektur seperti itu - x86_64, ARMv7, ARMv8.


Artinya, diperlukan profiler, yang seharusnya:



  • menjadi lintas platform;
  • dapat menghasilkan disassembler untuk fungsi untuk arsitektur dari set ini - x86_64, ARMv7, ARMv8;
  • menampilkan hasil dan berinteraksi dengan pengguna melalui GUI dan menjaga kegunaan.


Untuk memenuhi kebutuhan pelanggan, kami telah mengembangkan komponen sistem baru - disassembler lintas platform dengan pembuatan kode untuk x86_64, ARMv7, ARMv8 (fungsionalitas dan GUI untuk bekerja dengan keluarannya).



Mari kita lihat contoh demo sederhana kode C ++ di Hotspot yang sedang beraksi dan kemampuan analisis kinerja yang disediakannya. Contoh:



cat demo.cpp:
#include <iostream>
int g (int arg) {
    return abs(rand()) * arg;
}

int f() {
    int i = 1;
    int res = 1 ;

    std::cout << abs(rand()) << std::endl;
    while (i < 1000000) {
        res += i * g(res);
        i++;
    }
    std::cout << res << std::endl;
    return res;
}

int main() {
    std::cout << f() << std::endl;
    return 0;
}


Kami menyusun, membangun aplikasi demo kami:



 g++ demo.cpp -o demo


Luncurkan profiler kami:



./hotspot


Langkah 1 - kumpulkan dan tulis data ke file perf.data.



Ini dapat dilakukan dengan dua cara - dari baris perintah menggunakan panggilan eksplisit ke perf



record -o /home/demo/perf.data --call-graph dwarf ./demo


Atau menggunakan menu Hotspot File-> Record Data.



Untuk demo kami, kami mengumpulkan peristiwa dari jenis siklus, tetapi Anda dapat menyetel yang lain atau serangkaian jenis peristiwa (cache-miss, instruksi, branch-miss, dll.).







Klik Mulai Merekam, tunggu hingga Lihat Hasil menyala:







Menyelam ke dunia analisis performa.



Di sini kita akan menemukan informasi ringkasan dan juara di antara konsumen runtime demo kita.







Rantai panggilan di kedua arah - dari yang dipanggil ke metode panggilan (Bottom Up) dan sebaliknya (Bottom Down) dengan waktu (bobot).















Flame Graph dan data kinerja, waktu eksekusi untuk setiap

fungsi / metode yang penting.



Untuk mendapatkan informasi lebih rinci tentang fungsi yang menarik bagi kami, dengan distribusi acara di dalamnya (hingga instruksi untuk kode yang dibongkar), klik Pembongkaran, item menu konteks. Ini dibuka dengan mengklik kanan pada fungsi yang Anda suka:







Sekarang kita tahu segalanya tentang fungsi ini!







Anda dapat menavigasi tumpukan panggilan. Klik dua kali pada instruksi panggilan yang disorot biru. Dan sebelum kita adalah disassembler untuk fungsi yang disebut g (int). Instruksi yang memakan CPU tidak memiliki pesaing di sini.







Ctrl + B, Ctrl + D - dan kami juga memiliki kode perintah mesin, dan disassembler dibuat menggunakan objdump. Dalam kasus sebelumnya, kode yang dihasilkan dengan memanggil perf annotate ditampilkan.







Tombol Kembali menyala, Anda dapat bergerak di sepanjang tumpukan panggilan di kedua arah!



Pergi ke instruksi dengan alamat 1236 dan klik dua kali pada instruksi dengan alamat 124f. Dan lagi, transisi kembali ke instruksi dengan alamat 1236 tersedia.







Ctrl + B, Ctrl + I mengalihkan kita ke sintaks Intel Assembler: Kami akan







senang dengan kesempatan untuk mencari teks dengan pola yang dimasukkan, misalnya, menggunakan register% rsp:







Dan ... tanpa meninggalkan tempat, kami pindah ke ARM ... Untuk melakukan ini, pada dasarnya kita memerlukan dua entitas - file yang dapat dieksekusi dari aplikasi pengguna, yang dikompilasi pada ARM, dan file perf.data untuknya, direkam di sana. Dalam demo kami, ini adalah coremark.1.exe dan perf.1.fp.cycles.data, dibangun di atas ARMv8. Kami menempatkannya di / home / demo / armv8 / dan memuat perf.data -











Dengan demikian, kami tidak hanya memenuhi tugas yang ditetapkan oleh pelanggan, tetapi juga melampauinya - khususnya, perhitungan dan tampilan distribusi acara sesuai dengan instruksi disassembler memungkinkan kami untuk melakukan analisis mendalam hingga instruksi yang dapat ditautkan ke string dalam kode, program memiliki GUI - antarmuka yang ramah pengguna dengan pengaturan profil silang.



Linux perf gui Hotspot didistribusikan di bawah persyaratan Lisensi Publik Umum GNU melalui perjanjian dengan mitra kami. Dengan kata lain, kami memberikan hak kepada semua pengguna yang tertarik untuk menyalin, mengubah, dan mendistribusikan program profiler ini secara gratis.



Itu di-host di GitHub bersama dengan instruksi untuk mengunduh dan menginstal . Setiap orang bisa mengenalnya dan menghargainya.



Kami mengundang Anda, membawa Linux Perf GUI (Hotspot) ke panduan, dalam perjalanan yang mengasyikkan melalui aplikasi Anda dan kekhasan kerjanya, terjun ke atmosfer elit tim perakitan, mengunjungi berbagai arsitektur, dan banyak lagi.



All Articles