Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

วิธีดีบักปัญหาประสิทธิภาพ Ruby ในการผลิต

คุณรู้ว่าประสิทธิภาพเป็นคุณลักษณะ และพบปัญหาด้านประสิทธิภาพมากมายในระหว่างการพัฒนา

แล้วการชะลอตัวที่เกิดขึ้นเฉพาะในการผลิตล่ะล่ะ คุณต้องเพิ่มข้อความบันทึกลงในโค้ดทุกบรรทัดหรือไม่ นั่นจะทำให้ทุกอย่างช้าลงไปอีก! หรือคุณส่ง "บางทีนี่อาจแก้ไขได้" จำนวนมากเพื่อดูว่ามีอะไรอยู่บ้าง

คุณไม่จำเป็นต้องทำลายโค้ดของคุณเพื่อวิเคราะห์ ให้ลอง rbtrace . แทน -ไอติม.

ติดตามแอป Ruby ที่กำลังทำงานอยู่

ด้วย rbtrace คุณสามารถตรวจพบปัญหาด้านประสิทธิภาพ เรียกใช้โค้ดภายในกระบวนการ Ruby อื่น และการเรียกใช้เมธอดบันทึกโดยไม่ต้องเพิ่มโค้ดใดๆ เพียงเพิ่ม gem "rbtrace" ไปยัง Gemfile . ของคุณ .

ฉันได้เรียนรู้เกี่ยวกับ rbtrace จากโพสต์ที่น่าทึ่งของ Sam Saffron เกี่ยวกับการดีบักหน่วยความจำรั่วใน Ruby (ซึ่งคุณควรตรวจสอบจริงๆ หากยังไม่ได้ดำเนินการ)

ในโพสต์นั้น Sam ใช้ rbtrace เพื่อดูวัตถุทั้งหมดที่กระบวนการใช้:

bundle exec rbtrace -p $SIDEKIQ_PID -e 'Thread.new{GC.start;require "objspace";io=File.open("/tmp/ruby-heap.dump", "w"); ObjectSpace.dump_all(output: io); io.close}'

สุดยอดมาก แต่ยังมีอะไรอีกมากมายที่คุณทำได้

คุณทำอะไรกับ rbtrace ได้บ้าง

เคยต้องการดูคำสั่ง SQL ที่คุณใช้งานจริง (และใช้เวลานานเท่าใด)

~/Source/testapps/rbtrace jweiss$ rbtrace -p $RAILS_PID --methods "ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#execute_and_clear(sql)"             
*** attached to process 7897
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#execute_and_clear(sql="SELECT  \"articles\".* FROM \"articles\" WHERE \"articles\".\"id\" = $1 LIMIT 1") <0.002631>

การเรียกเมธอดทั้งหมดที่ใช้เวลานานกว่า 2 วินาที?

~/Source/testapps/rbtrace jweiss$ rbtrace -p $RAILS_PID --slow 2000
*** attached to process 8154
    Integer#times <2.463761>
        ArticlesController#create <2.558673>

คุณต้องการที่จะรู้ทุกครั้งที่มีการเรียกวิธีการบางอย่างหรือไม่

~/Source/testapps/rbtrace jweiss$ rbtrace -p $RAILS_PID --methods "ActiveRecord::Persistence#save" 
*** attached to process 8154
ActiveRecord::Persistence#save <0.010964>

ดูว่าแอปของคุณกำลังทำงานอยู่หรือไม่

~/Source/testapps/rbtrace jweiss$ rbtrace -p $RAILS_PID -e "Thread.list"
*** attached to process 8154
>> Thread.list
=> [#<Thread:0x007ff4fcc9a8a8@/usr/local/lib/ruby/gems/2.2.0/gems/puma-2.6.0/lib/puma/server.rb:269 sleep>, #<Thread:0x007ff4fcc9aa10@/usr/local/lib/ruby/gems/2.2.0/gems/puma-2.6.0/lib/puma/thread_pool.rb:148 sleep>, #<Thread:0x007ff4fcc9ab50@/usr/local/lib/ruby/gems/2.2.0/gems/puma-2.6.0/lib/puma/reactor.rb:104 sleep>, #<Thread:0x007ff4f98c0410 sleep>]

ใช่ กับ -e คุณสามารถเรียกใช้รหัส Ruby ภายในเซิร์ฟเวอร์ของคุณ:

~/Source/testapps/rbtrace jweiss$ rbtrace -p $RAILS_PID -e "ActiveRecord::Base.connection_config"
*** attached to process 8154
>> ActiveRecord::Base.connection_config
=> {:adapter=>"postgresql", :pool=>5, :timeout=>5000, :database=>"rbtrace_test"}

ใช่ โอเค ตอนนี้ฉันกลัวนิดหน่อย แต่นั่นก็ยัง มาก เย็น. (และมีเพียงผู้ใช้ที่ได้รับอนุญาตให้ยุ่งกับกระบวนการเท่านั้นที่สามารถ rbtrace ได้ ดังนั้นจึงน่าจะใช้ได้)

rbtrace มีเครื่องมือมากมายให้คุณตรวจสอบกระบวนการ Ruby ของคุณในการจัดเตรียมและการผลิต คุณสามารถดูวิธีที่กระบวนการของคุณใช้หน่วยความจำ (หรือใช้งานในทางที่ผิด) ติดตามการเรียกใช้ฟังก์ชันที่ช้า และแม้แต่รันโค้ด Ruby

คุณไม่จำเป็นต้องสร้างการทดสอบและบันทึกข้อความจำนวนมากเพื่อแก้ไขปัญหา คุณสามารถกระโดดไปที่เซิร์ฟเวอร์ รับข้อมูล แล้วกระโดดกลับออกไป และแม้ว่าฉันจะไม่ ทั้งหมด สบายใจที่จะใช้มันในการผลิต ฉันแน่ใจว่ามันจะช่วยได้ในสภาพแวดล้อมการทดสอบของเรา

แล้วคุณล่ะ คุณสามารถใช้ rbtrace ทำอะไรได้บ้าง