Singed, Front-End Profiler untuk Aplikasi Ruby dan Rails
Pernahkah Anda menemukan diri Anda ingin memahami mengapa blok kode Ruby, permintaan web tertentu, atau tindakan pengontrol tertentu berjalan sangat lambat? Mungkin Anda pernah menggunakan beberapa alat pembuatan profil seperti speedscope di masa lalu, tetapi merasa tidak praktis, atau Anda telah mencoba tetapi gagal menemukan cara menggunakannya.
Memperkenalkan Singed , frontend profil baru dari Gusto yang ditulis oleh Josh Nichols (alias @technicalpickles) . Singed dibangun untuk menjadi frontend swiss-army-knife untuk beberapa alat ( stackprof , rbspy , dan speedscope ), membantu Anda menangkap dan melihat flamegraph dengan mudah, di mana sebelumnya Anda harus menulis sekumpulan boilerplate atau kode sementara hanya untuk memulai .
Mengapa Alat Profil Lain?
Singed menambahkan metode baru pada Kernel, tersedia di mana saja:
flamegraph {
# your code here
}
Terutama, sebagian besar pengembang Ruby yang ingin melihat flamegraph menggunakan rack-mini-profiler , yang merupakan frontend yang sangat baik dan mudah digunakan untuk stackprof . Cukup tambahkan ?pp=flamegraph ke akhir URL apa saja dan jagoan, Anda sudah membuka flamegraph di browser Anda.
Namun, kami sering ingin memprofilkan hal-hal yang bukan hanya URL saat ini di bilah navigasi browser kami.
Misalnya, kami mungkin ingin membuat profil permintaan GraphQL, yang dibuat melalui gateway seperti Apollo. Kami mungkin tidak dapat dengan mudah menemukan URL yang digunakan Apollo Gateway untuk membuat permintaannya, sehingga sulit untuk mereplikasi dan menggunakan rack-mini-profiler untuk merekam flamegraph.
Atau, kita mungkin ingin membuat profil blok kode Ruby atau pekerjaan latar belakang, atau bahkan ujian. Anda dapat menulis kode Anda sendiri untuk melakukan ini dan memanggil stackprof sendiri, tetapi ada beberapa lusin baris boilerplate yang bagus untuk mengarahkan output ke file, dan Anda mungkin masih harus membukanya di browser secara manual.
Mengapa Menggunakan Speedscope, Stackprof, dan rbspy?
Singed pada dasarnya adalah pembungkus dari tiga alat yang berbeda:
- Speedscope , visualisator flamegraph.
- stackprof , profiler sampel untuk Ruby.
- rbspy , profiler sampel lain untuk Ruby, ditulis dalam Rust.
stackprof adalah profiler sampel untuk Ruby. Ini adalah ekstensi-C untuk VM Ruby, yang artinya harus "dimulai" dengan proses Ruby Anda pada saat yang bersamaan. rbspy bekerja secara berbeda — ini sebenarnya menggunakan hak istimewa sudo untuk membaca memori proses Ruby dari luar. Dengan demikian, itu dapat dilampirkan kapan saja ke proses Ruby, itulah sebabnya Singed menggunakannya untuk membuat profil proses Ruby dari CLI.
Sampling profiler seperti stackprof dan rbspy adalah pilihan yang bagus karena skalanya cukup baik untuk basis kode yang lebih besar. Profiler pelacakan, seperti ruby-prof , cenderung gagal pada skala Gusto karena banyaknya kode yang terlibat dalam menjalankan aplikasi kita.
Terakhir, stackprof dan rbspy memiliki banyak dukungan di komunitas. Kita tidak perlu melakukan pemutakhiran profiler kita sendiri untuk mendukung versi Ruby yang baru, misalnya.
Tur Fitur Cepat
Mari kita lihat sekilas apa yang sebenarnya bisa dilakukan Singed. Salah satu cara favorit saya untuk menggunakan Singed adalah dengan membuat profil blok kode sederhana di aplikasi Rails kami.
Misalnya, saya ingin membuat profil pekerjaan latar belakang, MyWorker. Saya akan membuat file bernama myprofile.rb, meletakkannya di root aplikasi Rails kami, dan kemudian menambahkan:
user = User.first
flamegraph { MyWorker.new.perform(user) }
bin/rails runner myprofile.rb
Hal umum lainnya yang saya temui dengan profil adalah terkadang cukup rumit untuk menyiapkan status yang diperlukan untuk memprofilkan sepotong kode. Mungkin Anda hanya memerlukan status database yang sangat spesifik atau banyak kode yang perlu dijalankan terlebih dahulu. Sering kali, penyiapan ini sudah ada dalam pengujian kami.
Singed membuatnya sangat mudah untuk membuat profil tes. Ini berarti Anda dapat, tentu saja, membuat profil dan mengoptimalkan rangkaian pengujian Anda, tetapi menurut saya ini lebih berguna untuk membuat profil kode yang memerlukan banyak penyiapan khusus:
require 'singed/rspec'
RSpec.describe YourClass do
it "is slow :(", flamegraph: true do
# your code here
end
end
Kasus penggunaan lain untuk Singed adalah membuat profil permintaan. Di Gusto, kami memiliki gateway GraphQL (Apollo) yang membuat permintaan ke backend Rails kami. Kadang-kadang, saya ingin membuat profil permintaan itu, tetapi cukup sulit melakukannya dengan rack-mini-profiler karena saya tidak tahu URL dan badan permintaan yang dikirim oleh backend Apollo ke Rails. Sebaliknya, dengan Singed, yang saya lakukan adalah:
- Picu permintaan backend GraphQL dari frontend.
- Di Chrome DevTools, saya menyalin permintaan itu "sebagai pengambilan". Ini memungkinkan saya untuk menempelkannya ke konsol Javascript saya dan memicu permintaan GraphQL yang satu ini sesuai permintaan.
- Saya menghentikan dan memulai ulang server backend saya, kali ini menambahkan variabel lingkungan SINGED_MIDDLEWARE_ALWAYS_CAPTURE=1.
- Saya memicu permintaan lagi di konsol Javascript saya.
Anda juga dapat dengan mudah membuat profil boot aplikasi Rails:
bundle binstub singed
bin/singed -- bin/rails runner 'true'
Frontend Profiler Dengan Banyak Kegunaan
Semoga saya meyakinkan Anda untuk mencoba Singed. Saya menggunakannya hampir setiap hari di Gusto.
Jika menurut Anda ini menarik, lihat di GitHub .