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

วิธีใหม่ในการทำความเข้าใจประสิทธิภาพของแอป Rails ของคุณ

แอป Rails ของคุณช้าไหม

เมื่อใช้เวลาไม่กี่วินาทีในการโหลดสิ่งที่ควรเป็นมุมมองธรรมดา คุณมีปัญหาที่ควรค่าแก่การขุด

คุณอาจมีการเรียกฐานข้อมูลมากเกินไปหรือวิธีการบางอย่างที่ช้า หรืออาจจะเป็นการวนซ้ำของ speedup ที่บางคนใส่รหัสของคุณแล้วลืมไป

คุณสามารถหาเครื่องมือมากมายที่จะช่วยคุณค้นหาสิ่งที่ทำให้แอปของคุณช้าลง เมื่อไม่กี่สัปดาห์ก่อน ฉันพูดถึง rbtrace . rpm . ของ Relic ใหม่ gem ยังช่วยให้แอปของฉันเร็วขึ้นอีกด้วย

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

ตัวสร้างโปรไฟล์ Rails ที่ฉันชอบ

เครื่องมือประสิทธิภาพ Rails ที่ฉันโปรดปรานเรียกว่า rack-mini-profiler . เมื่อคุณเพิ่มอัญมณีนั้นลงในแอพของคุณ คุณจะได้รับตัวบ่งชี้เล็กน้อยในแต่ละหน้าของคุณ ดูเหมือนว่านี้:

วิธีใหม่ในการทำความเข้าใจประสิทธิภาพของแอป Rails ของคุณ

หากคุณคลิกที่ช่องนั้น ช่องนั้นจะขยายออกและคุณจะเห็นสิ่งที่ยอดเยี่ยมมากมาย คำสั่ง SQL ใดที่รัน ระยะเวลาที่ใช้ในการแสดงบางส่วน และอื่นๆ:

วิธีใหม่ในการทำความเข้าใจประสิทธิภาพของแอป Rails ของคุณ

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

MiniProfiler สามารถทำได้มากกว่า แต่ก่อนอื่น คุณจะต้องติดตั้ง flamegraph พลอย

เมื่อทำเช่นนั้น คุณจะปลดล็อกวิธีใหม่ในการดูประสิทธิภาพของแอป

Flamegraphs:สนุกสนานอย่างกับเสียง

เปลวไฟมีลักษณะดังนี้:

วิธีใหม่ในการทำความเข้าใจประสิทธิภาพของแอป Rails ของคุณ

ค่อนข้างชัดเจนว่าชื่อมาจากไหนใช่ไหม

หลังจากที่คุณติดตั้ง rack-mini-profiler อัญมณีและ flamegraph อัญมณี คุณสามารถดูเปลวไฟสำหรับคำขอของคุณ เพียงเพิ่ม pp=flamegraph เป็นพารามิเตอร์ HTTP ซึ่งจะมีลักษณะดังนี้:

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

กราฟแท่งไฟจะปรากฏขึ้น และคุณสามารถซูมเข้าและออก เลื่อนดูรอบๆ และพยายามค้นหาสิ่งที่น่าสนใจเพื่อสำรวจได้

แต่ละ “เลเยอร์” ในแฟล็กกราฟคือหนึ่งบรรทัดในการติดตามสแต็ก:

วิธีใหม่ในการทำความเข้าใจประสิทธิภาพของแอป Rails ของคุณ

และแกนนอนคือเวลา ด้านซ้ายสุดของกราฟคือเวลาที่คำขอของคุณเริ่มต้น และด้านขวาสุดคือเมื่อคำขอเสร็จสิ้น

ดังนั้นมันจึงดูเท่ แต่คุณสามารถทำอะไรกับเปลวไฟ?

วิธีใช้เฟลมกราฟ

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

แอพของคุณใช้เวลานานแค่ไหนในการแสดงมุมมองของคุณ? ในการดำเนินการควบคุม? ตีฐานข้อมูล? กำลังแสดงผลบางส่วนหรือไม่

ทั้งหมดนี้มองเห็นได้ชัดเจน:

วิธีใหม่ในการทำความเข้าใจประสิทธิภาพของแอป Rails ของคุณ

มีประโยชน์อีกอย่างหนึ่งที่แฟลกกราฟแสดงให้คุณเห็น:

คุณเห็นหนามแหลมๆ หลายอันที่มีความสูงเท่ากันแบบนี้ไหม

วิธีใหม่ในการทำความเข้าใจประสิทธิภาพของแอป Rails ของคุณ

บ่อยครั้งหมายความว่าคุณมีข้อความค้นหา N+1 บางประเภท คุณไม่มี includes ที่ไหนสักแห่งหรือทำการเรียก API จำนวนมาก หากคุณเพิ่ม includes คุณจะได้เปลวไฟที่มีลักษณะดังนี้:

วิธีใหม่ในการทำความเข้าใจประสิทธิภาพของแอป Rails ของคุณ

การสืบค้น N+1 SQL นั้นค่อนข้างง่ายในการมองเห็นด้วยเครื่องมือประสิทธิภาพส่วนใหญ่ คุณเพียงแค่มองหาการเรียก SQL ที่มีลักษณะคล้ายคลึงกัน แต่ปัญหาที่ไม่ใช่ของ SQL N+1 เช่น การกด API หลายครั้งเกินไป จะสังเกตได้ยากกว่ามาก โดยเฉพาะ หากการบันทึกของคุณไม่ดีนัก

ปัญหาเหล่านี้มองเห็นได้ชัดเจนยิ่งขึ้นด้วยการใช้แฟล็กกราฟ

สิ่งที่ไม่ควรใส่ใจ

Flamegraphs สามารถครอบงำได้ พวกเขาแสดงข้อมูลมากมายให้คุณเห็น และคุณแทบจะถูกบังคับให้ต้องรับข้อมูลทั้งหมดในคราวเดียว แล้วคุณละเว้นอะไรได้บ้าง

โดยปกติ คุณสามารถข้ามชั้นล่างและด้านบนของกราฟได้ แต่ฉันเริ่มสำรวจรอบตรงกลางของกราฟหรืออาจจะ 3/4 ของทางขึ้นไปบนสุด นั่นคือสิ่งที่รหัสของฉันมักจะออกไปเที่ยว

ด้านบนของกราฟมักจะเกี่ยวข้องกับ ActiveRecord หรือ IO และด้านล่างคือโค้ดเฟรมเวิร์กของ Rails ดังนั้นจึงควรให้โค้ดของคุณอยู่ตรงกลาง

คุณเคยใช้เปลวไฟหรือไม่? เป็นวิธีที่ยอดเยี่ยมในการค้นหาสถานที่ที่ดีที่สุดในการเพิ่มประสิทธิภาพ ให้มันลอง! เพิ่ม rack-mini-profiler และ flamegraph อัญมณีให้กับ Gemfile . ของคุณ . คุณจะประหลาดใจกับความเข้าใจที่มากขึ้นในโค้ดของคุณ