เรามักได้รับคำถามเกี่ยวกับการเพิ่มประสิทธิภาพหรือการติดตาม Sidekiq การติดตามเป็นความเชี่ยวชาญของเรา แต่การเพิ่มประสิทธิภาพประสิทธิภาพของ Sidekiq เป็นเรื่องอื่น לגמרי ในความเป็นจริง การเพิ่มประสิทธิภาพซับซ้อน แต่ลองเริ่มดูที่คำตอบที่ดูง่าย...
สองวิธีเพิ่มความเร็ว
เพื่อเริ่มต้น ความเร็วสามารถเพิ่มได้สองวิธี — ด้วยการทำงานขนาดใหญ่ (ซึ่งอาจใช้หน่วยความจำหรือ IO มากขึ้น หรือซับซ้อนขึ้น) หรือปรับการตั้งค่า concurrency หรือ workers (ซึ่งจะใช้ CPU มากขึ้น และอาจใช้ IO มากขึ้น) อืม ความเป็นจริงเริ่มโชว์หน้าแล้ว: ความเร็วมีค่าใช้จ่าย หากคุณมีหน่วยความจำ IO หรือ CPU เหลืออยู่ นี่เป็นเรื่องฟรี แต่เราคิดว่าสำคัญต้องตระหนักถึง trade-offs ที่อาจต้องทำ
เพิ่มความเร็วผ่านการตั้งค่า Concurrency
Sidekiq จัดการ concurrency โดยใช้หลาย threads ใน process ของมัน วิธีนี้ทำให้มันประมวลผลงานหลายอย่างพร้อมกัน แต่ละ thread ประมวลผลงานเดียวในเวลาเดียวกัน โดยค่าเริ่มต้น Sidekiq ใช้ 10 threads ต่อ process คุณสามารถกำหนดให้ใช้ threads มากขึ้น ทำให้ concurrency เพิ่มขึ้น
โปรดทราบว่าโมเดล concurrency ใหม่ต้องได้รับการรองรับจากแอปของคุณ ตัวอย่างเช่น ต้องมี connection pool ไปยังฐานข้อมูลที่เพียงพอ และ host ต้องรองรับการเพิ่มขึ้นของ I/O operations คุณสามารถอ่านเอกสาร Sidekiq เกี่ยวกับ concurrency เพื่อข้อมูลเพิ่มเติม
เพิ่มความเร็วด้วยการรันหลาย Workers
นอกจากการ spawn หลาย processes แล้ว คุณยังสามารถรันหลาย workers ได้ ด้วยวิธีนี้ คุณสามารถ scale ส่วนที่ใช้ CPU มากขึ้น ทำงานแบบ parallel เมื่อปกติแล้วพวกมันจะขัดขวางกันบน CPU หากรันใน process เดียว เราเคยเขียนเกี่ยวกับ concurrency ใน Ruby และ Global Interpreter Lock ในบทความนี้ หากคุณต้องการตามทัน
มันทำงานหรือเสีย? สิ่งที่ต้องติดตามและ Magic Dashboards ของเรา
การเปลี่ยนแปลงพารามิเตอร์เริ่มต้นอาจส่งผลต่อประสิทธิภาพของแอปพลิเคชัน ก่อนเปลี่ยนแปลง การตั้งค่า monitoring เพื่อดูว่าการเปลี่ยนแปลงมีผลดีหรือทำให้ประสิทธิภาพลดลง เป็นสิ่งแนะนำ
เริ่มจากตรวจสอบว่าเราไม่ได้ทำลายสิ่งใดที่ระดับ host คุณจะต้องดูว่าแอปของคุณใช้ทรัพยากรของ hardware ที่รันอยู่มากแค่ไหน หากยังมีพื้นที่เหลือในหน่วยความจำและ CPU คุณสามารถเพิ่มการตั้งค่า concurrency เพื่อให้ทำงานเร็วขึ้นเล็กน้อย
ไม่ว่าคุณจะใช้ APM (Application Performance Monitoring) ตัวไหน ก็อาจมีวิธีติดตาม host metrics หากคุณใช้ AppSignal dashboards สำหรับ host ของคุณจะถูกสร้างโดยอัตโนมัติ เพื่อให้คุณได้รับการแจ้งเตือนก่อนที่สิ่งต่างๆ จะควบคุมไม่ได้ คุณสามารถตั้งค่า alerts สำหรับ CPU usage บน host เฉพาะโดยใช้ Anomaly detection ได้ง่าย
ตอนนี้ มาดูว่า Sidekiq ไม่ได้เสียหายที่ระดับ Sidekiq APM ที่คุณเลือกอาจอนุญาตให้ตั้งค่า monitoring และ alerting สำหรับ background jobs แบบ manual บน AppSignal นี้ง่ายมาก: เราติดตามให้คุณใน Sidekiq magic dashboard (ซึ่งถูกสร้างโดยอัตโนมัติโดยไม่ต้อง setup จากคุณ เมื่อคุณรัน gem เวอร์ชันล่าสุดของเรา)
ใน setup นี้ คุณจะต้องติดตาม job status ต่อ queue และตั้ง trigger สำหรับ failure rate เพื่อแจ้งเตือนบน Slack, PagerDuty, email หรือสิ่งที่คุณใช้
งานน้อยกว่า แต่งานใหญ่กว่า?
เราได้ดูคร่าวๆ ที่การเพิ่มความเร็วโดย trade-off CPU ตอนนี้ มาดูการเพิ่มความเร็วโดย trade-off บนหน่วยความจำหรือ IO หรือความซับซ้อนมากขึ้น คุณอาจคิดว่าสามารถทำได้โดยการสร้างงานขนาดใหญ่ แนวคิดคืองานใหญ่อาจเร็วกว่าเพราะไม่มี Sidekiq overhead ต่อ operation ในประสบการณ์ของเรา อย่างไรก็ตาม Sidekiq overhead จะฆ่าประสิทธิภาพได้นานานา บ่อยครั้งเป็น database queries ที่งานทำที่ฆ่าประสิทธิภาพ เราเห็นว่าการรวมงานมากขึ้น เพื่อทำ fewer queries เป็น วิธีสำคัญสู่ประสิทธิภาพที่ดีขึ้น ลดรูป: ทำการ update 1000 records ครั้งเดียว แทนที่จะ update 1 record 1000 ครั้ง
สิ่งที่ต้องติดตามเพื่อดูว่าทำงานหรือเสีย
แรก คุณจะต้องติดตาม job status ต่อ queue เหมือนกัน และตั้ง trigger สำหรับ failure rate เนื่องจากงานใช้เวลานานและมี operations มากขึ้น คุณจะต้องติดตาม การใช้หน่วยความจำของ Sidekiq คุณควรตั้งค่า alert สำหรับ การใช้หน่วยความจำของ Sidekiq โดยเฉพาะสำหรับ host ที่หมดหน่วยความจำ โดยใช้ Anomaly detection ของ AppSignal
คุณควรติดตาม ความยาวของ queue ต่อ queue เช่นกัน จะแจ้งเตือนเมื่อมี backlog เกิดขึ้น—เมื่อ workers มีงานคิวมากกว่าที่จะประมวลผลได้ เราแนะนำให้ตั้งค่า Anomaly detection trigger สำหรับ job queue ที่ 'สำคัญ'
Trade-off ที่คุณไม่เห็นใน APM
ปัญหาใหญ่ของงานขนาดใหญ่คือมันเขียนโค้ดยากขึ้น คุณจะต้องทำให้แต่ละงานเป็น idempotent อย่างชัดเจน และติดตามสถานะของมัน ในตัวอย่างง่าย: เมื่อคุณมีงานที่ส่งเมลให้คนเดียวและมันล้มเหลว คุณสามารถ retry ได้โดยไม่ก่อให้เกิดความเสียหายมาก แต่ส่งเมลให้ 1000 คน หากงานล้มเหลว คุณไม่อยากส่งซ้ำให้ 240 คนที่ส่งไปแล้วก่อนที่งานจะล้มเหลว การรับรองว่าสิ่งนั้นไม่เกิดขึ้นทำให้โค้ดซับซ้อนขึ้น
ความซับซ้อนจริงของความเป็นจริง
ถึงเวลาตรวจสอบความเป็นจริงอีกครั้ง บ่อยครั้ง background processes ของคุณอาจไม่ได้ช้าจากอะไรที่รันใน Sidekiq อาจเป็นที่ฐานข้อมูลที่คุณ query ช้า เพราะ host ที่มันรันกำลังหมดหน่วยความจำ เมื่อหาตัวอย่าง cool สำหรับโพสต์นี้ เราเจอสถานการณ์แบบนั้น: 原因คือ external API มี response time นาน ไม่มีอะไรใน Sidekiq จะแก้ได้
เพราะปัญหาอาจมองเห็นที่นี่แต่เกิดจากที่อื่น לגמרי ที่ AppSignal เราสร้างผลิตภัณฑ์ให้มี errors, performance, และ host metrics all-in-one มุมมองรวมของ metrics นี้จะทำให้หา root cause ของปัญหาง่ายขึ้น
ไม่มีคำตอบง่ายๆ เหรอ?
แม้เราจะเริ่มบทความนี้ด้วยพื้นฐานของ monitoring และการเพิ่มประสิทธิภาพ Sidekiq เราก็ทันทีเจอกับความเป็นจริงว่า ความเร็วจะใช้ CPU และ IO หรือ Memory หรือเพิ่มความซับซ้อน แม้เราจะแตะปัญหาบางส่วนของความซับซ้อนของประสิทธิภาพในสถาปัตยกรรมของคุณ ความเป็นจริงคือเราเพิ่งเลื่อนลื่นรอบ 99% ของสิ่งที่ยากในโพสต์นี้
ดังนั้น แม้เราอาจทำให้คุณหายความหวังในคำตอบที่ง่าย เราหวังว่าบทความนี้จะกระตุ้นความคิดที่น่าสนใจเกี่ยวกับการเพิ่มประสิทธิภาพและการติดตาม Sidekiq setup ของคุณ!