คุณรู้ว่าประสิทธิภาพเป็นคุณลักษณะ และพบปัญหาด้านประสิทธิภาพมากมายในระหว่างการพัฒนา
แล้วการชะลอตัวที่เกิดขึ้นเฉพาะในการผลิตล่ะล่ะ คุณต้องเพิ่มข้อความบันทึกลงในโค้ดทุกบรรทัดหรือไม่ นั่นจะทำให้ทุกอย่างช้าลงไปอีก! หรือคุณส่ง "บางทีนี่อาจแก้ไขได้" จำนวนมากเพื่อดูว่ามีอะไรอยู่บ้าง
คุณไม่จำเป็นต้องทำลายโค้ดของคุณเพื่อวิเคราะห์ ให้ลอง 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 ทำอะไรได้บ้าง