เรามักได้รับคำถามเกี่ยวกับการเพิ่มประสิทธิภาพหรือการตรวจสอบ Sidekiq การตรวจสอบเป็นเกมของเรา แต่การเพิ่มประสิทธิภาพการทำงานของ Sidekiq นั้นเป็นเกมบอลที่แตกต่างออกไปโดยสิ้นเชิง ในความเป็นจริง การเพิ่มประสิทธิภาพนั้นซับซ้อน แต่มาเริ่มด้วยการดูคำตอบที่ดูเหมือนง่าย...
สองวิธีในการเพิ่มความเร็ว
ในการเริ่มต้น ความเร็วสามารถเพิ่มได้สองวิธี — โดยการทำงานที่ใหญ่ขึ้น (ซึ่งอาจใช้หน่วยความจำหรือ IO มากกว่าหรือซับซ้อนกว่า) หรือโดยการปรับการตั้งค่าการทำงานพร้อมกันหรือผู้ปฏิบัติงาน (ซึ่งจะใช้ CPU มากกว่าและอาจเป็น IO) อุ๊ย ความเป็นจริงเริ่มเข้ามาแล้ว ความเร็วต้องแลกมาด้วยต้นทุน หากคุณสามารถสำรองหน่วยความจำ IO หรือ CPU เพิ่มเติมได้ ก็ไม่ต้องเสียค่าใช้จ่ายใดๆ แต่เราคิดว่าสิ่งสำคัญคือต้องตระหนักถึงข้อแลกเปลี่ยนที่อาจจำเป็นต้องทำ
เพิ่มความเร็วด้วยการตั้งค่าการทำงานพร้อมกัน
Sidekiq จัดการการทำงานพร้อมกันโดยใช้หลายเธรดในกระบวนการ ด้วยวิธีนี้ มันสามารถประมวลผลงานหลายงานพร้อมกัน โดยแต่ละเธรดจะประมวลผลงานครั้งละหนึ่งงาน โดยค่าเริ่มต้น Sidekiq ใช้ 10 เธรดต่อกระบวนการ คุณสามารถกำหนดค่าให้ใช้เธรดมากขึ้น ซึ่งจะเป็นการเพิ่มการทำงานพร้อมกัน
โปรดทราบว่าแอปของคุณต้องรองรับรูปแบบการทำงานพร้อมกันแบบใหม่ ตัวอย่างเช่น ต้องการพูลการเชื่อมต่อกับฐานข้อมูลขนาดใหญ่เพียงพอ และโฮสต์ของคุณต้องสามารถรองรับการดำเนินการ I/O ที่เพิ่มขึ้นได้ คุณสามารถตรวจสอบเอกสาร Sidekiq เกี่ยวกับการทำงานพร้อมกันสำหรับข้อมูลเพิ่มเติม
เพิ่มความเร็วด้วยการเรียกใช้คนงานหลายคน
นอกจากการวางไข่หลายกระบวนการแล้ว คุณยังสามารถเรียกใช้ผู้ปฏิบัติงานได้หลายคน ด้วยวิธีนี้ คุณสามารถขยายขนาดชิ้นส่วนที่ต้องใช้ CPU มาก โดยทำงานแบบคู่ขนานกันหากชิ้นส่วนเหล่านั้นจะขัดแย้งกันใน CPU หากทำงานในกระบวนการเดียว ก่อนหน้านี้เราได้เขียนเกี่ยวกับการทำงานพร้อมกันใน Ruby และ Global Interpreter Lock ในบทความนี้ หากคุณต้องการติดตามเรื่องนี้
ใช้งานได้หรือไม่พัง? สิ่งที่ต้องตรวจสอบและแดชบอร์ดมหัศจรรย์ของเรา
การเปลี่ยนพารามิเตอร์เริ่มต้นอาจส่งผลต่อประสิทธิภาพของแอปพลิเคชันของคุณ ก่อนที่จะเปลี่ยนการตั้งค่า ขอแนะนำให้ตั้งค่าการตรวจสอบเพื่อดูว่าการเปลี่ยนแปลงส่งผลกระทบในทางบวกหรือลดประสิทธิภาพการทำงาน
เริ่มต้นด้วยการตรวจสอบว่าเรากำลังทำลายสิ่งต่าง ๆ ในระดับโฮสต์หรือไม่ คุณจะต้องการดูว่าแอปของคุณใช้ทรัพยากรมากเพียงใดในฮาร์ดแวร์ที่คุณกำลังใช้งาน หากคุณมีความจุเหลืออยู่ในหน่วยความจำและ CPU คุณสามารถเพิ่มการตั้งค่าการทำงานพร้อมกันเพื่อทำให้สิ่งต่างๆ เร็วขึ้นเล็กน้อย
ไม่ว่าคุณจะใช้ APM (Application Performance Monitoring) แบบใด ก็อาจมีวิธีการติดตามตัวชี้วัดของโฮสต์ หากคุณใช้ AppSignal แดชบอร์ดสำหรับโฮสต์ของคุณจะถูกสร้างขึ้นโดยอัตโนมัติ เพื่อให้แน่ใจว่าคุณได้รับการแจ้งเตือนก่อนที่สิ่งต่าง ๆ จะเกิดอาละวาด คุณสามารถตั้งค่าการแจ้งเตือนการใช้งาน CPU บนโฮสต์เฉพาะได้อย่างง่ายดายโดยใช้การตรวจจับความผิดปกติ
ตอนนี้ มาดูกันว่าสิ่งต่าง ๆ จะไม่พังที่ระดับ Sidekiq หรือไม่ APM ที่คุณเลือกอาจช่วยให้คุณสามารถตั้งค่าการตรวจสอบและแจ้งเตือนสำหรับงานพื้นหลังของคุณได้ด้วยวิธีใดวิธีหนึ่ง ใน AppSignal สิ่งนี้ง่ายมาก:เราติดตามสิ่งนี้ให้คุณในแดชบอร์ดเวทย์มนตร์ Sidekiq (ซึ่งสร้างขึ้นโดยที่คุณไม่ต้องตั้งค่าใด ๆ เมื่อคุณเรียกใช้อัญมณีของเราในเวอร์ชันล่าสุด)
ในการตั้งค่านี้ คุณจะต้องตรวจสอบสถานะงาน ต่อคิวและตั้งค่าทริกเกอร์สำหรับอัตราความล้มเหลวที่จะได้รับการแจ้งเตือนใน Slack, PagerDuty อีเมลหรืออะไรก็ตามที่คุณใช้
จำนวนงานน้อยลง?
เราได้ดูอย่างรวดเร็วเกี่ยวกับการเพิ่มความเร็วในขณะที่แลกกับ CPU ตอนนี้ มาดูความเร็วที่เพิ่มขึ้นในขณะที่แลกกับหน่วยความจำหรือ IO หรือความซับซ้อนมากขึ้น คุณคงคิดว่าคุณทำได้โดยการสร้างงานที่ใหญ่ขึ้น แนวคิดก็คืองานขนาดใหญ่สามารถทำงานได้เร็วขึ้น เพราะพวกเขาไม่มีค่าโสหุ้ย Sidekiq ต่อการดำเนินการ อย่างไรก็ตาม จากประสบการณ์ของเรา ค่าโสหุ้ยของ Sidekiq แทบจะไม่ทำให้ประสิทธิภาพของคุณแย่ลง บ่อยครั้ง เป็นฐานข้อมูลที่สอบถามว่างานทำซึ่งสามารถฆ่าประสิทธิภาพได้ เราพบว่าการรวมงานมากขึ้นเพื่อดำเนินการค้นหาน้อยลง คือ วิธีสำคัญเพื่อประสิทธิภาพที่ดีขึ้น ง่ายขึ้น:อัปเดต 1 รายการจาก 1,000 รายการ แทนที่จะอัปเดต 1,000 รายการจาก 1 รายการ
สิ่งที่ควรตรวจสอบเพื่อดูว่าใช้งานได้หรือไม่
ก่อนอื่น คุณจะต้องตรวจสอบสถานะงาน ต่อคิวที่นี่เช่นกันและตั้งค่าทริกเกอร์สำหรับ อัตราความล้มเหลว . เนื่องจากงานใช้เวลานานและมีการดำเนินการมากขึ้น คุณจะต้องตรวจสอบการใช้หน่วยความจำของ Sidekiq ด้วย . คุณควรตั้งค่าการแจ้งเตือนเกี่ยวกับการใช้หน่วยความจำ Sidekiq แต่โดยเฉพาะสำหรับ โฮสต์ที่มีหน่วยความจำไม่เพียงพอ โดยใช้การตรวจจับความผิดปกติของ AppSignal
คุณควรตรวจสอบความยาวของคิว .ด้วย ต่อคิว การดำเนินการนี้จะแจ้งเตือนคุณเมื่อมีงานค้างเมื่อพนักงานมีคิวมากกว่าที่จะดำเนินการได้ เราขอแนะนำให้คุณตั้งค่าทริกเกอร์การตรวจจับความผิดปกติสำหรับคิวงานที่ "สำคัญ" ของคุณ
การประนีประนอมที่คุณจะไม่เห็นใน APM ของคุณ
ปัญหาใหญ่ของงานที่ใหญ่กว่าคือเขียนโค้ดได้ยากขึ้น คุณจะต้องทำให้งานแต่ละงานมีความชัดเจนและติดตามสถานะของพวกเขา ในตัวอย่างง่ายๆ:เมื่อคุณมีงานส่งคนคนหนึ่งแต่งานไม่สำเร็จ คุณสามารถลองใหม่อีกครั้งโดยไม่เกิดอันตรายมากนัก เมื่อส่งคนไปทางไปรษณีย์ 1,000 คน หากงานล้มเหลว คุณไม่ต้องการที่จะส่งใหม่ไปยัง 240 คนที่คุณส่งก่อนที่งานจะล้มเหลว ตรวจสอบให้แน่ใจว่าสิ่งนั้นไม่เกิดขึ้นทำให้โค้ดซับซ้อนขึ้น
ความซับซ้อนที่แท้จริงของความเป็นจริง
ถึงเวลาตรวจสอบความเป็นจริงอีกครั้ง บ่อยครั้ง กระบวนการในเบื้องหลังของคุณอาจไม่ช้าเนื่องจากมีสิ่งใดทำงานใน Sidekiq อาจเป็นเพราะฐานข้อมูลที่คุณกำลังสืบค้นทำงานช้าเนื่องจากโฮสต์ที่เรียกใช้มีหน่วยความจำไม่เพียงพอ เมื่อมองหาตัวอย่างเจ๋งๆ ที่จะใช้ในโพสต์นี้ เราพบสถานการณ์หนึ่งดังกล่าว:ปรากฎว่าระยะเวลามีจุดสูงสุดเนื่องจาก API ภายนอกมีเวลาตอบสนองนาน ไม่มีอะไรใน Sidekiq ที่จะแก้ปัญหานั้นได้
เนื่องจากปัญหาสามารถเห็นได้ในที่เดียว แต่เกิดขึ้นที่อื่นโดยสิ้นเชิง ที่ AppSignal เราได้สร้างผลิตภัณฑ์เพื่อให้มีข้อผิดพลาด ประสิทธิภาพ และเมตริกโฮสต์แบบครบวงจร เมตริกที่รวมกันของมุมมองนี้จะช่วยให้ค้นหาสาเหตุของปัญหาได้ง่ายขึ้น
ไม่มีคำตอบง่ายๆ ใช่ไหม
แม้ว่าเราจะเริ่มต้นบทความนี้ด้วยพื้นฐานของการตรวจสอบและการเพิ่มประสิทธิภาพ Sidekiq เราก็พบความจริงทันทีว่าความเร็วจะทำให้ CPU และ IO เสียไป หรือหน่วยความจำ หรือแนะนำความซับซ้อนมากขึ้น และแม้ว่าเราจะพูดถึงความซับซ้อนของประสิทธิภาพในสถาปัตยกรรมของคุณแล้ว แต่ความจริงก็คือเราลื่นไถลสิ่งที่ยากไปประมาณ 99% ในโพสต์นี้
ดังนั้น แม้ว่าเราอาจจะเลิกหวังคำตอบง่ายๆ ของคุณไปแล้ว แต่เราหวังว่าบทความนี้จะกระตุ้นให้เกิดความคิดที่น่าสนใจเกี่ยวกับการเพิ่มประสิทธิภาพและติดตามการตั้งค่า Sidekiq ของคุณ