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 เล็กๆ บนทุกหน้า:

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

MiniProfiler ให้เตือนตลอดว่าแต่ละหน้า load ใช้เวลานานแค่ไหน ช่วยเรียนรู้ performance ของ app คุณจะสร้าง intuition ว่าหน้าไหนช้า หน้าไหนเร็ว สังเกตเวลาหน้าไหน render 久 surprisingly และแก้ทันทีขณะยังมีในหัว
MiniProfiler ทำได้มากกว่า แตต้องติดตั้ง flamegraph gem ก่อน
ติดตั้งแล้ว unlock วิธีใหม่เห็น performance
Flamegraphs: สนุกเหมือนชื่อ
Flamegraph long این:

ชัดเจนว่ามาจากไหน
ติดตั้ง 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:

และแกน X คือเวลา ด้านซ้ายสุด = request เริ่ม ด้านขวาสุด = request จบ
ดู cool แตทำอะไรได้บ้าง?
用 Flamegraph ยังไง
เพราะ X axis = เวลา ได้ภาพชัดเจนว่า app bog down ที่ไหน Layers ที่กว้างที่สุด = ใช้เวลานานสุด ควรดูก่อน เพราะเร่งพวกมัน impact ใหญ่สุด
App ใช้เวลาเท่าไหร่ render view? ใน controller action? hit database? render partials?
ทั้งหมดเห็นได้ชัด visual:

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

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

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 เพิ่มขึ้นมาก