บันทึกกระบวนการทั้งหมดเพื่อดำเนินการต่อหลังจากรีบูต


54

ฉันพัฒนาอัลกอริทึมสำหรับปัญหาที่ค่อนข้างยากในวิชาคณิตศาสตร์ซึ่งน่าจะต้องใช้เวลาหลายเดือนกว่าจะเสร็จ เนื่องจากฉันมีทรัพยากร จำกัด เท่านั้นฉันจึงเริ่มใช้งานแล็ปท็อป Ubuntu 12.04 (x86) ของฉัน ตอนนี้ฉันต้องการติดตั้งการอัปเดตและรีสตาร์ทแล็ปท็อปจริง ๆ (ข้อความ "โปรดรีบูต" เป็นที่น่ารำคาญ)

มีวิธีบันทึกกระบวนการทั้งหมดรวมถึงหน่วยความจำที่จัดสรรไว้เพื่อดำเนินการต่อหลังจากรีบูตหรือไม่

นี่คือข้อมูลบางอย่างเกี่ยวกับกระบวนการที่คุณอาจต้องการ โปรดสอบถามข้อมูลเพิ่มเติมหากจำเป็น

  • ฉันเรียกกระบวนการในเทอร์มินัลด้วยคำสั่ง " ./binary > ./somefile &" หรือ "time ./binary> ./somefile &" ฉันจำไม่ได้จริงๆ
  • กำลังพิมพ์ข้อมูลดีบักไปยัง std :: cerr (ไม่บ่อย)
  • ปัจจุบันใช้งานประมาณ 600.0 kiB และถึงแม้ว่าจะเพิ่มขึ้น แต่ก็ไม่น่าจะเพิ่มขึ้นอย่างรวดเร็ว
  • กระบวนการทำงานโดยมีลำดับความสำคัญตามปกติ
  • เคอร์เนลคือ 3.2.0-26-generic-pae, cpu เป็น AMD, ระบบปฏิบัติการคือ Ubuntu 12.04 x86
  • มันทำงานตั้งแต่ 9 วันและ 14 ชั่วโมง (นานเกินไปที่จะยกเลิก ;-))

3
คุณคำนวณอะไรจากความอยากรู้
Viktor Mellgren

3
@ user1261166: ฉันศึกษาปัญหาการเยี่ยมชมเป้าหมาย (ซึ่งเป็นส่วนขยายของปัญหาพนักงานขายเดินทาง) ด้วยวิธีการแบบสาขาและแบบตัด ดังนั้นฉันจึงจำเป็นต้องรู้หลายแง่มุมของโพลีท็อปพิเศษมิติสูงที่สุดเท่าที่จะทำได้ โดยทั่วไปมันจะทำให้เกิดปัญหาใหญ่ขึ้นกับยักษ์ใหญ่หนึ่งตัวและจากนั้นพยายามแก้ไขเพียงเล็กน้อยเพื่อลดปัญหาในภายหลัง
ฟาน

5
มันไม่ตอบคำถามของคุณมากนัก แต่คุณคิดว่าจะใช้งานโค้ดของคุณในคลัสเตอร์เฉพาะในอนาคตหรือไม่ สิ่งเหล่านี้แทบจะปิดตัวลงและฉันแน่ใจว่ามีกริดการคำนวณบางอย่างสำหรับคุณ ไม่เพียง แต่พวกเขาตลอดเวลา แต่ยังเร็วขึ้นเล็กน้อย (โดยเฉพาะถ้าคุณสามารถขนานรหัสของคุณ) คุณสามารถตั้งค่าเองได้ (ดู Oracle Grid Engine)
Wojtek Rzepala

ฉันไม่เคยนึกถึงคำถามที่ได้รับความนิยมเช่นนี้ (อย่างน้อยก็เป็นที่นิยมมากกว่าคำถามอื่น ๆ ที่ฉันถาม) ตั้งแต่กระบวนการเสร็จสิ้นในขณะนี้ (โดยไม่คาดคิดแม้ว่าจะไม่มีข้อผิดพลาด) ฉันจะลองใช้แต่ละวิธีในไม่ช้า ขอบคุณทุกคน!
ฟาน

คำตอบ:


41

ทางออกที่ดีที่สุด / ง่ายที่สุดคือการเปลี่ยนโปรแกรมของคุณเพื่อบันทึกสถานะเป็นไฟล์การใช้ไฟล์นั้นซ้ำเพื่อเรียกคืนกระบวนการ

จากหน้าวิกิพีเดียเกี่ยวกับสแนปชอตของแอปพลิเคชั่นมีหลายทางเลือก:

  1. นอกจากนี้ยังมีcryopidแต่ดูเหมือนว่าจะไม่มีสี
  2. จุดตรวจ / รีสตาร์ท Linuxน่าจะเป็นตัวเลือกที่ดี แต่เคอร์เนลของคุณจำเป็นต้องCONFIG_CHECKPOINT_RESTOREเปิดใช้งาน
  3. criuน่าจะเป็นมากที่สุดโครงการถึงวันที่และอาจจะยิงที่ดีที่สุดของคุณ แต่ยังขึ้นอยู่ในบางส่วนที่เฉพาะเจาะจงตัวเลือก Kernelซึ่งการกระจายของคุณอาจจะไม่ได้ตั้ง

นี่มันสายเกินไปแล้ว แต่อีกวิธีการปฏิบัติเพิ่มเติมคือการเริ่มต้นกระบวนการของคุณใน VM เฉพาะและเพียงแค่หยุดและคืนค่าเครื่องเสมือนทั้งหมด ขึ้นอยู่กับไฮเปอร์ไวเซอร์ของคุณคุณสามารถย้ายเครื่องระหว่างโฮสต์ที่แตกต่างกัน

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


20

วิธีที่ค่อนข้าง "ถูก" ในการทำเช่นนี้คือทำการประมวลผลใน VM (เช่นกับ VirtualBox) ก่อนที่คุณจะปิดการทำงานชั่วคราวของ VM และบันทึกสถานะ หลังจากบู๊ตคืนค่า VM & สถานะ

สิ่งนี้มีข้อเสียของการฆ่าและรีสตาร์ทงาน แต่ถ้าเป็นจริงจะทำงานเป็นเวลาหลายเดือนความแตกต่างเก้าวันกลายเป็นเรื่องเล็กน้อย (เพิ่มขึ้น 5% ในช่วง 6 เดือน)


แก้ไข:ฉันเพิ่งรู้ว่า Ulrich ได้กล่าวถึงเรื่องนี้ในรายการที่ไม่ได้กำหนดหมายเลข 4 ในรายการของเขา

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

ฉันคิดว่าสิ่งที่ดีที่สุดที่จะทำคือลองหนึ่งในนั้นและถ้ามันไม่ทำงานรีสตาร์ทงานใน VM


15

จะมองที่เครื่องมือCryoPID

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


4
ใช้สิ่งนี้ก่อนที่จะบันทึกสถานะของสคริปต์ไพ ธ อนที่ทำงานบนกล่อง Linux และย้ายไปยังกล่อง FreeBSD และดำเนินการต่อที่นั่น เวทมนตร์อาถรรพ์บางอย่างเกิดขึ้นที่นั่น)
ทิม

ฉันไม่ทราบว่า FreeBSD และ Linux สามารถทำงานร่วมกับไบนารีได้ นั่นเป็นสิ่งที่น่าสนใจมากที่ฉันเพิ่งเรียนรู้ แต่นั่นหมายความว่าพวกเขามีโมเดลหน่วยความจำที่เหมือนกันทุกประการ ดูเหมือนไม่น่าเชื่อสำหรับฉันว่าพวกเขามีการประชุม syscall เดียวกัน libc เดียวกัน (ฉันเดาว่า fbsd ใช้ glibc) การประชุมการโทรที่แน่นอนเดียวกันที่ระดับ asm ฯลฯ ความเข้ากันไม่ได้ส่งเสียงให้ฉันราวกับว่าคุณใช้กระบวนการ MacOS และทิ้ง มันลงบนกล่อง Windows; มันช่างน่าทึ่งจริงๆ
แมว

มีใครลองนี้เมื่อเร็ว ๆ นี้? ไซต์หายไปฉันไม่สามารถหา. deb สร้างจากแหล่งที่มาล้มเหลว ฯลฯ ฉันต้องการทราบว่าเป็นไปได้หรือไม่ก่อนที่จะใช้อีกต่อไป ฉันใช้เดเบียนถ้ามันสำคัญ
จอห์น P

1
@JohnP มีให้ที่ GitHub แล้วตอนนี้: github.com/maaziz/cryopid
starbeamrainbowlabs

7

หากคุณต้องการรีสตาร์ทโปรแกรมฉันขอแนะนำให้คุณใช้เวลาเพิ่มคุณสมบัติบางอย่างในรหัสของคุณซึ่งอาจช่วยคุณประหยัดเวลาในอนาคต

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

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

คุณสามารถตั้งค่ารหัสของคุณดังนั้นเมื่อคุณส่งสัญญาณมันจะบันทึกหนึ่งในไฟล์จุดตรวจเหล่านี้เพื่อให้คุณสามารถบันทึก "สถานะ" ของการคำนวณของคุณได้ทุกที่

นอกจากนี้ความสามารถในการดูว่าข้อมูลเปลี่ยนแปลงอย่างไรเมื่อการคำนวณดำเนินไปเรื่อย ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.