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

เชี่ยวชาญ Rails Performance: วิธี診斷และเร่งความเร็ว Apps ที่พิสูจน์แล้ว

Rails app ช้าไหม?

เวลา load view 簡單 ใช้ seconds มีปัญหาที่คุ้มค่าที่จะขุดหา

อาจมี database calls มากเกินไป หรือ slow methods หรือ speedup loop ใครสร้างไว้ลืม

มี tools เยอะช่วยหาสาเหตุช้า ผมพูดถึง rbtrace ไปแล้ว New Relic rpm gem ก็ช่วยเร่ง app ของผม

แตtool โปรดของผมสำหรับ performance problems ทำได้มากกว่า out of the box โชว์โค้ดทำอะไร แตตอน加 plugin กลาย powerful มาก ช่วย เห็น performance problems แบบ visual และช่วยหาและแก้ slow apps เร็วขึ้น

My Favorite Rails Profiler

Tool โปรดชื่อ rack-mini-profiler 加 gem นี้เข้า app จะได้ indicator เล็กๆ บนทุกหน้า:

เชี่ยวชาญ Rails Performance: วิธี診斷และเร่งความเร็ว Apps ที่พิสูจน์แล้ว

คลิกกล่อง จะ expand เห็น SQL statements ที่รัน, เวลา render partials และอื่นๆ:

เชี่ยวชาญ Rails Performance: วิธี診斷และเร่งความเร็ว Apps ที่พิสูจน์แล้ว

MiniProfiler ให้เตือนตลอดว่าแต่ละหน้า load ใช้เวลานานแค่ไหน ช่วยเรียนรู้ performance ของ app คุณจะสร้าง intuition ว่าหน้าไหนช้า หน้าไหนเร็ว สังเกตเวลาหน้าไหน render 久 surprisingly และแก้ทันทีขณะยังมีในหัว

MiniProfiler ทำได้มากกว่า แตต้องติดตั้ง flamegraph gem ก่อน

ติดตั้งแล้ว unlock วิธีใหม่เห็น performance

Flamegraphs: สนุกเหมือนชื่อ

Flamegraph long این:

เชี่ยวชาญ Rails Performance: วิธี診斷และเร่งความเร็ว Apps ที่พิสูจน์แล้ว

ชัดเจนว่ามาจากไหน

ติดตั้ง rack-mini-profiler และ flamegraph แล้ว flamegraph สำหรับ request ใดก็ได้ 加 pp=flamegraph เป็น HTTP parameter:

https://www.example.com/restaurants?pp=flamegraph

Flamegraph จะโผล่ zoom in/out, scroll, หาสิ่งน่าสนใจ

แต่ละ "layer" ใน flamegraph คือหนึ่งบรรทัดใน stack trace:

เชี่ยวชาญ Rails Performance: วิธี診斷และเร่งความเร็ว Apps ที่พิสูจน์แล้ว

และแกน X คือเวลา ด้านซ้ายสุด = request เริ่ม ด้านขวาสุด = request จบ

ดู cool แตทำอะไรได้บ้าง?

用 Flamegraph ยังไง

เพราะ X axis = เวลา ได้ภาพชัดเจนว่า app bog down ที่ไหน Layers ที่กว้างที่สุด = ใช้เวลานานสุด ควรดูก่อน เพราะเร่งพวกมัน impact ใหญ่สุด

App ใช้เวลาเท่าไหร่ render view? ใน controller action? hit database? render partials?

ทั้งหมดเห็นได้ชัด visual:

เชี่ยวชาญ Rails Performance: วิธี診斷และเร่งความเร็ว Apps ที่พิสูจน์แล้ว

อีกอย่างน่าสนใจ:

เห็น spikes หลายๆ ตัว ความสูงเท่าๆ กัน แบบนี้?

เชี่ยวชาญ Rails Performance: วิธี診斷และเร่งความเร็ว Apps ที่พิสูจน์แล้ว

มักหมายถึง N+1 query ขาด includes ที่ไหน หรือ call API เยอะ ถ้า加 includes flamegraph จะเป็นแบบนี้:

เชี่ยวชาญ Rails Performance: วิธี診斷และเร่งความเร็ว Apps ที่พิสูจน์แล้ว

N+1 SQL queries ดูง่ายกับ performance tools มาก: หา SQL calls ที่คล้ายกัน แต non-SQL N+1 issues เช่น hit API บ่อยเกิน ยากมาก โดยเฉพาะ ถ้า logging ไม่ดี

Flamegraphs ทำให้เห็นชัดกว่า

สิ่งที่ไม่ต้องสนใจ

Flamegraphs overwhelming เยอะ info บังคับรับทั้งหมดพร้อมกัน สิ่งที่ ignore ได้?

ปกติข้าม bottom และ top layers เริ่ม explore ระหว่างกลาง หรือ 3/4 ไปทางบน นั่นคือที่ที่โค้ดของผมค้าง

Top มัก ActiveRecord/IO-related bottom คือ Rails framework code ทำให้ code ของเราอยู่กลาง

เคย用 flamegraph ไหม? วิธีดีหา optimization spots ลองทำดู! 加 rack-mini-profiler และ flamegraph gems ใน Gemfile จะแปลกใจได้ว่า insight เพิ่มขึ้นมาก