การป้องกันงานพื้นหลังล่าช้า_งานจากการใช้ CPU มากเกินไปบนเซิร์ฟเวอร์เดียว

แอปพลิเคชัน My Rails มีงานหลายอย่างที่ถูกถ่ายโอนไปยังกระบวนการเบื้องหลัง เช่น การปรับขนาดรูปภาพและการอัปโหลดไปยัง S3 ฉันใช้ delayed_job เพื่อจัดการกระบวนการเหล่านี้

กระบวนการเหล่านี้ โดยเฉพาะการแสดงภาพขนาดย่อ PDF (โดยใช้ Ghostscript) และการปรับขนาดภาพ (โดยใช้ ImageMagick) ต้องใช้ CPU มากและมักจะใช้เวลา CPU 100% เนื่องจากงานเหล่านี้ทำงานบนเซิร์ฟเวอร์ (RedHat Linux) เดียวกันกับเว็บแอปพลิเคชัน รวมถึง DB จึงอาจทำให้เว็บแอปพลิเคชันของเราไม่ตอบสนองได้

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

ความคิดชื่นชม


person Olly    schedule 27.08.2009    source แหล่งที่มา


คำตอบ (1)


หากฉันจำไม่ผิด delayed_job จะใช้กระบวนการของผู้ปฏิบัติงานที่จะจัดการงานเบื้องหลังทั้งหมด ควรจะเป็นไปได้ง่ายที่จะเปลี่ยนลำดับความสำคัญของการกำหนดเวลา OS ของกระบวนการเมื่อคุณเริ่มต้น

ดังนั้นแทนที่จะเป็นเช่นนั้น:

ruby script/delayed_job -e production -n 2 start

พยายาม:

nice -n 15 ruby script/delayed_job -e production -n 2 start
person molf    schedule 27.08.2009
comment
คะแนนโบนัสหากใครก็ตามสามารถเข้าใจสิ่งนี้ได้โดยใช้ล่าช้า_job_args w/ Capistrano - person Chuck Bergeron; 06.03.2012
comment
มันไม่ได้ใช้ delayed_job_args แต่ทำให้งานเสร็จ: stackoverflow.com/a/9928720/359957 - person James Chevalier; 18.04.2014