แอป Rails ของคุณช้าไหม
เมื่อใช้เวลาไม่กี่วินาทีในการโหลดสิ่งที่ควรเป็นมุมมองธรรมดา คุณมีปัญหาที่ควรค่าแก่การขุด
คุณอาจมีการเรียกฐานข้อมูลมากเกินไปหรือวิธีการบางอย่างที่ช้า หรืออาจจะเป็นการวนซ้ำของ speedup ที่บางคนใส่รหัสของคุณแล้วลืมไป
คุณสามารถหาเครื่องมือมากมายที่จะช่วยคุณค้นหาสิ่งที่ทำให้แอปของคุณช้าลง เมื่อไม่กี่สัปดาห์ก่อน ฉันพูดถึง rbtrace
. rpm
. ของ Relic ใหม่ gem ยังช่วยให้แอปของฉันเร็วขึ้นอีกด้วย
แต่เครื่องมือที่ฉันชื่นชอบในการสำรวจปัญหาด้านประสิทธิภาพทำได้มากกว่านั้น นอกกรอบจะแสดงให้คุณเห็นว่าโค้ดของคุณกำลังทำอะไรอยู่ แต่เมื่อคุณเพิ่มปลั๊กอินเข้าไป มันจะยิ่งมีประสิทธิภาพมากขึ้น ช่วยให้คุณ เห็น ปัญหาด้านประสิทธิภาพของแอปของคุณทางสายตา และช่วยให้คุณค้นหาและแก้ไขแอปที่ช้าได้เร็วยิ่งขึ้น
ตัวสร้างโปรไฟล์ Rails ที่ฉันชอบ
เครื่องมือประสิทธิภาพ Rails ที่ฉันโปรดปรานเรียกว่า rack-mini-profiler
. เมื่อคุณเพิ่มอัญมณีนั้นลงในแอพของคุณ คุณจะได้รับตัวบ่งชี้เล็กน้อยในแต่ละหน้าของคุณ ดูเหมือนว่านี้:
หากคุณคลิกที่ช่องนั้น ช่องนั้นจะขยายออกและคุณจะเห็นสิ่งที่ยอดเยี่ยมมากมาย คำสั่ง SQL ใดที่รัน ระยะเวลาที่ใช้ในการแสดงบางส่วน และอื่นๆ:
MiniProfiler จะเตือนคุณตลอดเวลาว่าแต่ละหน้าใช้เวลาในการโหลดนานเท่าใด ที่ช่วยให้คุณเรียนรู้เพิ่มเติมเกี่ยวกับประสิทธิภาพของแอป คุณจะสร้างความเข้าใจโดยสัญชาตญาณว่าหน้าใดช้าและหน้าใดเร็ว คุณจะเริ่มสังเกตเห็นเมื่อหน้าเว็บใช้เวลานานในการแสดงผลอย่างน่าประหลาดใจ และคุณสามารถเริ่มแก้ไขได้ทันทีในขณะที่ยังอยู่ในใจ
MiniProfiler สามารถทำได้มากกว่า แต่ก่อนอื่น คุณจะต้องติดตั้ง flamegraph
พลอย
เมื่อทำเช่นนั้น คุณจะปลดล็อกวิธีใหม่ในการดูประสิทธิภาพของแอป
Flamegraphs:สนุกสนานอย่างกับเสียง
เปลวไฟมีลักษณะดังนี้:
ค่อนข้างชัดเจนว่าชื่อมาจากไหนใช่ไหม
หลังจากที่คุณติดตั้ง rack-mini-profiler
อัญมณีและ flamegraph
อัญมณี คุณสามารถดูเปลวไฟสำหรับคำขอของคุณ เพียงเพิ่ม pp=flamegraph
เป็นพารามิเตอร์ HTTP ซึ่งจะมีลักษณะดังนี้:
https://www.example.com/restaurants?pp=flamegraph
กราฟแท่งไฟจะปรากฏขึ้น และคุณสามารถซูมเข้าและออก เลื่อนดูรอบๆ และพยายามค้นหาสิ่งที่น่าสนใจเพื่อสำรวจได้
แต่ละ “เลเยอร์” ในแฟล็กกราฟคือหนึ่งบรรทัดในการติดตามสแต็ก:
และแกนนอนคือเวลา ด้านซ้ายสุดของกราฟคือเวลาที่คำขอของคุณเริ่มต้น และด้านขวาสุดคือเมื่อคำขอเสร็จสิ้น
ดังนั้นมันจึงดูเท่ แต่คุณสามารถทำอะไรกับเปลวไฟ?
วิธีใช้เฟลมกราฟ
เนื่องจากแกน X แสดงถึงเวลา คุณจึงสามารถเห็นภาพได้ชัดเจนว่าแอปของคุณกำลังจมอยู่ตรงไหน ชั้นที่กว้างที่สุดใช้เวลานานที่สุดในการวิ่ง สิ่งเหล่านี้เป็นประเด็นแรกที่คุณควรพิจารณา เนื่องจากการเร่งความเร็วอาจมีผลกระทบมากที่สุด
แอพของคุณใช้เวลานานแค่ไหนในการแสดงมุมมองของคุณ? ในการดำเนินการควบคุม? ตีฐานข้อมูล? กำลังแสดงผลบางส่วนหรือไม่
ทั้งหมดนี้มองเห็นได้ชัดเจน:
มีประโยชน์อีกอย่างหนึ่งที่แฟลกกราฟแสดงให้คุณเห็น:
คุณเห็นหนามแหลมๆ หลายอันที่มีความสูงเท่ากันแบบนี้ไหม
บ่อยครั้งหมายความว่าคุณมีข้อความค้นหา N+1 บางประเภท คุณไม่มี includes
ที่ไหนสักแห่งหรือทำการเรียก API จำนวนมาก หากคุณเพิ่ม includes
คุณจะได้เปลวไฟที่มีลักษณะดังนี้:
การสืบค้น N+1 SQL นั้นค่อนข้างง่ายในการมองเห็นด้วยเครื่องมือประสิทธิภาพส่วนใหญ่ คุณเพียงแค่มองหาการเรียก SQL ที่มีลักษณะคล้ายคลึงกัน แต่ปัญหาที่ไม่ใช่ของ SQL N+1 เช่น การกด API หลายครั้งเกินไป จะสังเกตได้ยากกว่ามาก โดยเฉพาะ หากการบันทึกของคุณไม่ดีนัก
ปัญหาเหล่านี้มองเห็นได้ชัดเจนยิ่งขึ้นด้วยการใช้แฟล็กกราฟ
สิ่งที่ไม่ควรใส่ใจ
Flamegraphs สามารถครอบงำได้ พวกเขาแสดงข้อมูลมากมายให้คุณเห็น และคุณแทบจะถูกบังคับให้ต้องรับข้อมูลทั้งหมดในคราวเดียว แล้วคุณละเว้นอะไรได้บ้าง
โดยปกติ คุณสามารถข้ามชั้นล่างและด้านบนของกราฟได้ แต่ฉันเริ่มสำรวจรอบตรงกลางของกราฟหรืออาจจะ 3/4 ของทางขึ้นไปบนสุด นั่นคือสิ่งที่รหัสของฉันมักจะออกไปเที่ยว
ด้านบนของกราฟมักจะเกี่ยวข้องกับ ActiveRecord หรือ IO และด้านล่างคือโค้ดเฟรมเวิร์กของ Rails ดังนั้นจึงควรให้โค้ดของคุณอยู่ตรงกลาง
คุณเคยใช้เปลวไฟหรือไม่? เป็นวิธีที่ยอดเยี่ยมในการค้นหาสถานที่ที่ดีที่สุดในการเพิ่มประสิทธิภาพ ให้มันลอง! เพิ่ม rack-mini-profiler
และ flamegraph
อัญมณีให้กับ Gemfile
. ของคุณ . คุณจะประหลาดใจกับความเข้าใจที่มากขึ้นในโค้ดของคุณ