Singed, Ruby ve Rails Uygulamaları için Profil Oluşturucu Ön Uç

May 09 2023
Hiç kendinizi bir Ruby kodu bloğunun, belirli bir web isteğinin veya belirli bir denetleyici eyleminin neden bu kadar yavaş çalıştığını anlamak isterken buldunuz mu? Belki geçmişte speedscope gibi bazı profil oluşturma araçları kullandınız, ancak bunu kullanışsız buldunuz veya denediniz ancak bunları nasıl kullanacağınızı bulamadınız. Josh Nichols (namı diğer @technicalpickles) tarafından yazılan Gusto'nun yeni profil oluşturma ön yüzü Singed ile tanışın.

Hiç kendinizi bir Ruby kodu bloğunun, belirli bir web isteğinin veya belirli bir denetleyici eyleminin neden bu kadar yavaş çalıştığını anlamak isterken buldunuz mu? Belki geçmişte speedscope gibi bazı profil oluşturma araçları kullandınız, ancak bunu kullanışsız buldunuz veya denediniz ancak bunları nasıl kullanacağınızı bulamadınız.

alev grafiği: Herhangi bir şey… ve bu kadar!

Josh Nichols (namı diğer @technicalpickles) tarafından yazılan Gusto'nun yeni profil oluşturma ön yüzü Singed ile tanışın . Singed, çeşitli araçlara ( stackprof , rbspy ve speedscope ) yönelik bir İsviçre çakısı ön ucu olacak şekilde inşa edildi ve daha önce sadece başlamak için bir sürü standart veya geçici kod yazmanız gereken alev grafiklerini kolayca yakalamanıza ve görüntülemenize yardımcı oluyor .

Neden Başka Bir Profil Oluşturma Aracı?

Singed, Kernel'e her yerde kullanılabilen yeni bir yöntem ekler:

flamegraph {
  # your code here
}

Öncelikle, alev grafiklerine bakmak isteyen çoğu Ruby geliştiricisi, stackprof için mükemmel ve kullanımı kolay bir ön uç olan rack-mini-profiler kullanır . Herhangi bir URL'nin sonuna ?pp=flamegraph ekleyin ve harika, tarayıcınızda açık bir flamegraph var.

Ancak, genellikle tarayıcımızın gezinti çubuğunda yalnızca geçerli URL olmayan şeylerin profilini çıkarmak isteriz.

Örneğin, Apollo gibi bir ağ geçidi üzerinden yapılan bir GraphQL isteğinin profilini çıkarmak isteyebiliriz. Apollo Gateway'in istekte bulunmak için kullandığı URL'yi kolayca bulamayabiliriz , bu nedenle bir alev grafiğini yakalamak için kopyalamak ve rack-mini-profiler kullanmak zordur.

Ya da sadece bir Ruby kodu bloğunun veya bir arka plan işinin veya hatta bir testin profilini çıkarmak isteyebiliriz. Bunu yapmak için kendi kodunuzu yazabilir ve stackprof'u kendiniz arayabilirsiniz, ancak çıktıyı bir dosyaya yönlendirmek için birkaç düzine satırlık hazır metindir ve sonra muhtemelen onu tarayıcınızda manuel olarak açmanız gerekir.

Neden Speedscope, Stackprof ve rbspy Kullanmalı?

Singed, temel olarak üç farklı aracın etrafındaki bir sarmalayıcıdır:

  • Speedscope , bir alev grafiği görselleştiricisi.
  • stackprof , Ruby için bir örnekleme profili oluşturucu.
  • Ruby için başka bir örnekleme profili oluşturucu olan rbspy , Rust'ta yazılmıştır.
Speedscope'un görselleştiricisi, büyük profillerde bile güzel ve oldukça hızlıdır.

stackprof, Ruby için bir örnekleme profili oluşturucusudur. Bu, Ruby sanal makinesi için bir C uzantısıdır, yani Ruby işleminizle aynı anda "başlatılması" gerekir. rbspy farklı çalışır - aslında Ruby işleminin hafızasını dışarıdan okumak için sudo ayrıcalıklarını kullanır. Bu nedenle, herhangi bir zamanda bir Ruby işlemine eklenebilir, bu nedenle Singed, CLI'den Ruby işlemlerinin profilini çıkarmak için bunu kullanır.

Stackprof ve rbspy gibi örnekleme profili oluşturucular, daha büyük kod tabanlarına oldukça iyi ölçeklendikleri için harika bir seçimdir. Ruby-prof gibi izleme profili oluşturucular , uygulamamızı çalıştırmaya dahil olan büyük miktarda kod nedeniyle Gusto ölçeğinde başarısız olma eğilimindedir.

Son olarak, stackprof ve rbspy toplulukta büyük miktarda desteğe sahiptir. Örneğin, yeni Ruby sürümlerini desteklemek için profil oluşturucuyu kendi yükseltmemizi yapmak zorunda değiliz.

Hızlı Özellik Turu

Singed'in gerçekte neler yapabileceğine hızlıca bir göz atalım. Singed'i kullanmanın en sevdiğim yollarından biri, Rails uygulamamızda basit bir kod bloğunun profilini oluşturmaktır.

Örneğin, bir arka plan işi olan MyWorker'ın profilini çıkarmak istediğimi varsayalım. myprofile.rb adlı bir dosya oluşturacak, onu Rails uygulama kökümüze yerleştirecek ve ardından şunları ekleyeceğim:

user = User.first
flamegraph { MyWorker.new.perform(user) }

bin/rails runner myprofile.rb

Profillerle ilgili karşılaştığım bir başka yaygın şey de, bir kod parçasının profilini oluşturmak için gereken durumu ayarlamanın bazen oldukça karmaşık olmasıdır. Belki de çok özel bir veritabanı durumuna ihtiyacınız var veya önce çok sayıda kodun çalıştırılması gerekiyor. Çoğu zaman, bu kurulum testlerimizde zaten mevcuttur.

Singed, bir testin profilini çıkarmayı gerçekten kolaylaştırır. Bu, elbette test takımınızın profilini çıkarabileceğiniz ve optimize edebileceğiniz anlamına gelir, ancak gerçekten çok fazla özel kurulum gerektiren profil oluşturma kodu için bunu daha yararlı buluyorum:

require 'singed/rspec'
RSpec.describe YourClass do
  it "is slow :(", flamegraph: true do
    # your code here
  end
end

Singed için başka bir kullanım durumu, profil oluşturma istekleridir. Gusto'da, Rails arka ucumuza istekte bulunan bir GraphQL ağ geçidimiz (Apollo) var. Bazen bu isteklerin profilini çıkarmak istiyorum, ancak bunu rack-mini-profiler ile yapmak oldukça zor çünkü Apollo arka ucunun Rails'e gönderdiği URL'yi ve istek gövdesini bilmiyorum. Bunun yerine, Singed ile yaptığım şey:

  • Ön uçtan GraphQL arka uç isteğini tetikleyin.
  • Chrome DevTools'ta bu isteği "getirme olarak" kopyalarım. Bu, onu Javascript konsoluma yapıştırmamı ve talep üzerine bu GraphQL isteğini tetiklememi sağlıyor.
  • Bu sefer SINGED_MIDDLEWARE_ALWAYS_CAPTURE=1 ortam değişkenini ekleyerek arka uç sunucumu durdurup yeniden başlatıyorum.
  • Javascript konsolumda isteği tekrar tetikliyorum.

Ayrıca bir Rails uygulama önyüklemesinin profilini kolayca oluşturabilirsiniz:

bundle binstub singed
bin/singed -- bin/rails runner 'true'

Birçok Kullanıma Sahip Bir Profil Oluşturucu Ön Uç

Umarım seni Singed'i denemeye ikna etmişimdir. Gusto'da neredeyse her gün kullanıyorum.

Bunu ilginç bulduysanız, GitHub'da kontrol edin .