Skip to content

Node.js tips: อย่าใช้ loop วนหลายรอบใน callback function

พอดีลอง optimize โค้ด Node.js  app ที่เขียนเอาไว้เมื่อนานมาแล้วแก้ไปแก้มาแทนที่จะดีขึ้นดันแย่กว่าเดิมเพราะทำงานไปเรื่อยๆ แล้วโปรแกรม terminated ไม่แจ้ง error อะไรเลย งานเข้าล่ะสิ!

เลยเปิด htop  ดู CPU และ memory ดูปรากฎว่า CPU peak ทำงาน 100% และ memory แนวโน้มเพิ่มขึ้นเรื่อยๆ พอถึงระยะหนึ่งที่ OS มัน limit การใช้ resources ของเครื่องเพื่อรักษาระบบโดยรวมมันเลย kill process ของ Node.js ทิ้ง เอาหละเจอสาเหตุแล้วก็เลยไล่โค้ดต่อ

ไล่โค้ดไปมา ลองผิดลองถูกหลายครั้ง ก็พบว่าการวน loop หลายรอบใน callback function ของ event ที่ถูกเรียกเกือบตลอดเวลานี่เองที่ทำให้ CPU มัน peak ขนาดนั้น ลองคิดดูครับว่า callback function ที่ถูกเรียกบ่อยๆ แล้วมี loop แบบ synchronize อย่าง for loop ที่ทำงานซัก 100 หรือ 1000 รอบข้างในจะเกิดอะไรขึ้น? ลองนึกดูว่า ถ้ามีการเรียก callback function 10 ครั้งและข้างในมี sync loop 100 รอบนั่นหมายความว่าต้องทำงาน 10*100 ครั้งและถ้าข้างในมีการคำนวณหนักๆ ก็จะทำให้ CPU peak 100% เกือบตลอดเวลาทำให้ app เราเสี่ยงจะโดน OS สอยทิ้งมาก

ฉะนั้นเลี่ยงได้ก็เลี่ยงครับ พยายามเขียนโค้ดให้เป็น async มากที่สุด

เข้าเมืองตาหลิ่วก็หลิ่วตาตามเขียน event based ก็ต้องตามๆ เขาหน่อยละกันครับ

 

Be First to Comment

Leave a Reply

Your email address will not be published.