วิธี "จำศีล" กระบวนการใน Linux โดยการจัดเก็บหน่วยความจำลงดิสก์และกู้คืนในภายหลัง


100

เป็นไปได้ไหมที่จะ 'จำศีล' กระบวนการใน linux? เช่นเดียวกับ 'จำศีล' ในแล็ปท็อปฉันจะเขียนหน่วยความจำทั้งหมดที่ใช้โดยกระบวนการลงในดิสก์เพิ่ม RAM จากนั้นในภายหลังฉันสามารถ 'ดำเนินการต่อ' ได้คืออ่านข้อมูลทั้งหมดจากหน่วยความจำและนำกลับไปที่ RAM แล้วฉันจะดำเนินการต่อได้หรือไม่


8
คำถามที่น่าสนใจ: D
dangerstat

สิ่งที่คุณอธิบายมักเรียกว่า 'การตรวจสอบ' คุณอาจโชคดีกว่าในการค้นหาด้วยคำนั้น
Tim Post

มันจะต้องเป็นคุณสมบัติที่ดี ไฮเบอร์เนตเทียบกับปิด
Vitaly Fadeev

คำตอบ:


54

ฉันเคยดูแลCryoPIDซึ่งเป็นโปรแกรมที่ทำในสิ่งที่คุณกำลังพูดถึง เขียนเนื้อหาของพื้นที่ที่อยู่ของโปรแกรม VDSO การอ้างอิงตัวอธิบายไฟล์และระบุไปยังไฟล์ที่สามารถสร้างขึ้นใหม่ได้ในภายหลัง CryoPID เริ่มต้นเมื่อไม่มี hooks ที่ใช้งานได้ใน Linux และทำงานทั้งหมดจาก userspace (อันที่จริงมันยังใช้งานได้ขึ้นอยู่กับการตั้งค่า distro / kernel / security ของคุณ)

ปัญหาคือซ็อกเก็ต (จริง) สัญญาณ RT ที่รอดำเนินการปัญหา X11 จำนวนมากการใช้งาน getpid () แคช glibc ท่ามกลางคนอื่น ๆ อีกมากมาย การสุ่ม (โดยเฉพาะ VDSO) กลายเป็นสิ่งที่ผ่านไม่ได้สำหรับพวกเราไม่กี่คนที่ทำงานกับมันหลังจากที่เบอร์นาร์ดเดินจากไป อย่างไรก็ตามมันเป็นเรื่องสนุกและกลายเป็นหัวข้อของวิทยานิพนธ์ระดับปริญญาโทหลายเรื่อง

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


5
ณ เดือนกรกฎาคม 2014 โชคไม่ดีที่ CryoPID ไม่ได้รับความเสียหายอีกต่อไปและไม่ทำงานบนเมล็ดล่าสุด แต่ในระหว่างนี้มีโครงการใหม่เกิดขึ้น (มีการดำเนินการบางขั้นตอนแม้ในการเชื่อมต่อ TCP "ไฮเบอร์เนต") ฉันได้ให้คำตอบด้านล่างพร้อมข้อมูลล่าสุด ลองดูสิ! ;)
dappiu

1
@dappiu เยี่ยมมาก - แต่ CryoPID เป็นเพียงตัวอย่างในคำตอบนี้เพื่อแสดงให้เห็นว่ามันยุ่งยากเพียงใดซึ่งฉันได้แนะนำให้พวกเขาจัดการกับการบันทึกสถานะภายในโปรแกรมด้วยวิธีที่สามารถกลับมาทำงานต่อได้อย่างง่ายดาย การหยุดนิ่งของ CryoPID ไม่ได้ทำให้คำตอบมีความเกี่ยวข้องน้อยลง
Tim Post

Cryopid2 มีการใช้งานล่าสุด (2013): sourceforge.net/projects/cryopid2
Leopd

32

ฉันต้องการอัปเดตสถานะที่นี่ ณ ปี 2014

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

อย่างแรกสิ่งที่ฉันแนะนำเพราะฉันโชคดีกว่าในการเรียกใช้คือCRIU ที่ดำเนินการจุดตรวจ / เรียกคืนส่วนใหญ่ในพื้นที่ผู้ใช้และต้องการตัวเลือกเคอร์เนล CONFIG_CHECKPOINT_RESTORE ที่เปิดใช้งาน

Checkpoint / Restore In Userspace หรือ CRIU (ออกเสียงว่า kree-oo, IPA: / krɪʊ /, Russian: криу) เป็นเครื่องมือซอฟต์แวร์สำหรับระบบปฏิบัติการ Linux เมื่อใช้เครื่องมือนี้คุณสามารถหยุดแอปพลิเคชันที่กำลังทำงานอยู่ (หรือบางส่วน) และตรวจสอบไปยังฮาร์ดไดรฟ์เพื่อเป็นชุดไฟล์ จากนั้นคุณสามารถใช้ไฟล์เพื่อกู้คืนและเรียกใช้แอปพลิเคชันจากจุดที่ถูกตรึงไว้ที่ คุณลักษณะที่โดดเด่นของโครงการ CRIU คือส่วนใหญ่ใช้งานในพื้นที่ผู้ใช้

หลังคือDMTCP ; อ้างจากหน้าหลัก:

DMTCP (Distributed MultiThreaded Checkpointing) เป็นเครื่องมือในการตรวจสอบสถานะของแอปพลิเคชันพร้อมกันหลายรายการอย่างโปร่งใสรวมถึงแอปพลิเคชันแบบมัลติเธรดและแบบกระจาย มันทำงานโดยตรงบนไบนารีปฏิบัติการของผู้ใช้โดยไม่มีโมดูลเคอร์เนลลินุกซ์หรือการปรับเปลี่ยนเคอร์เนลอื่น ๆ

นอกจากนี้ยังมีหน้า Wikipedia ที่ดีในอาร์กิวเมนต์: Application_checkpointing


21

คำตอบที่กล่าวถึงctrl-zกำลังพูดถึงการหยุดกระบวนการด้วยสัญญาณในกรณีSIGTSTPนี้ คุณสามารถส่งสัญญาณหยุดโดยใช้kill:

kill -STOP <pid>

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

เมื่อต้องการปลุกอีกครั้งให้ใช้

kill -CONT <pid>

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


14

ปัญหาคือการกู้คืนสตรีมไฟล์และซ็อกเก็ตที่โปรแกรมเปิดไว้

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

หากคุณทำการไฮเบอร์เนตต่อโปรแกรม (โดยไม่รองรับแอพพลิเคชั่น) คุณจะจัดการกับไฟล์ที่เปิดได้อย่างไร? จะเกิดอะไรขึ้นถ้ากระบวนการอื่นเข้าถึงไฟล์เหล่านั้นในระหว่างกาล ฯลฯ ?

การรักษาสถานะเมื่อไม่ได้โหลดโปรแกรมจะเป็นเรื่องยาก

เพียงแค่ระงับเธรดและปล่อยให้สลับไปยังดิสก์จะมีผลเช่นเดียวกันหรือไม่?

หรือรันโปรแกรมในเครื่องเสมือนและปล่อยให้ VM จัดการการระงับ


13

Linux Kernel ได้ตอนนี้ดำเนินการบางส่วนด่าน / ฟิวเจอร์รีสตาร์ท: https://ckpt.wiki.kernel.org/สถานะเป็นที่นี่

ข้อมูลที่เป็นประโยชน์บางส่วนอยู่ใน lwn (linux weekly net): http://lwn.net/Articles/375855/ http://lwn.net/Articles/412749/ ......

ดังนั้นคำตอบคือ "ใช่"


3
โปรแกรม userspace เรียกว่า blcr
Behrooz

12

คำตอบสั้น ๆ คือ "ใช่ แต่ไม่น่าเชื่อถือเสมอไป" ตรวจสอบ CryoPID:

http://cryopid.berlios.de/

การเปิดไฟล์จะเป็นปัญหาที่พบบ่อยที่สุด CryoPID ระบุอย่างชัดเจน:

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

ปัญหาเดียวกันนี้จะส่งผลกระทบต่อการเชื่อมต่อ TCP แม้ว่า CryoPID จะรองรับ tcpcp สำหรับการเชื่อมต่อต่อ


3
หลังจากกดปุ่มส่งตอนนี้ฉันรู้แล้วว่าสิ่งนี้อ่านเหมือนสแปม / โฆษณาสำหรับ CryoPID ไม่ใช่ - ฉันเป็นแค่ผู้ใช้ยูทิลิตี้ที่พึงพอใจจริงๆ
Ulisses Montenegro

6

คำตอบสั้น ๆ คือ "ใช่" คุณอาจเริ่มต้นด้วยการดูแนวคิดนี้: การสร้างใหม่ที่ปฏิบัติการได้ของ ELF จากภาพหลัก ( http://vx.netlux.org/lib/vsc03.html )


1
ลิงค์ที่น่าสนใจ; แต่ลิงก์ชี้ให้เห็นว่าใช้งานไม่ได้อย่างน่าเชื่อถือ
จะ

6

ฉันขยาย Cryopid ผลิตแพ็คเกจชื่อ Cryopid2 ที่มีให้จาก SourceForge สิ่งนี้สามารถโยกย้ายกระบวนการเช่นเดียวกับการจำศีล (พร้อมกับไฟล์และซ็อกเก็ตที่เปิดอยู่ - ข้อมูลในซ็อกเก็ต / ท่อจะถูกดูดเข้าสู่กระบวนการในโหมดไฮเบอร์เนตและถ่มน้ำลายกลับเข้าสู่กระบวนการเหล่านี้เมื่อเริ่มกระบวนการใหม่)

เหตุผลที่ฉันไม่ได้ใช้งานกับโปรเจ็กต์นี้คือฉันไม่ใช่ผู้พัฒนาเคอร์เนล - ทั้งสิ่งนี้ (และ / หรือ cryopid ดั้งเดิม) จำเป็นต้องมีคนขึ้นเครื่องที่สามารถให้พวกเขาทำงานกับเคอร์เนลสุดท้าย (เช่น Linux 3.x) .

วิธีการ Cryopid ใช้งานได้ - และน่าจะเป็นทางออกที่ดีที่สุดสำหรับการจำศีล / การโยกย้ายกระบวนการวัตถุประสงค์ทั่วไปใน Linux ที่ฉันเจอ


3

อย่างที่คนอื่น ๆ ตั้งข้อสังเกตระบบปฏิบัติการจะให้ฟังก์ชันนี้ได้ยากเนื่องจากแอปพลิเคชันจำเป็นต้องมีการตรวจสอบข้อผิดพลาดในตัวเพื่อจัดการสตรีมที่เสีย

อย่างไรก็ตามเมื่อทราบด้านบางภาษาโปรแกรมและเครื่องมือที่ใช้เครื่องเสมือนอย่างชัดเจนสนับสนุนฟังก์ชันนี้เช่นภาษาการเขียนโปรแกรมด้วยตนเอง


0

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


0

มีงานวิจัยบางอย่างเกี่ยวกับจุดตรวจ / กู้คืนสำหรับ Linux ใน 2.2 และ 2.4 วัน แต่ก็ไม่เคยทำให้มันเป็นต้นแบบเลย เป็นไปได้ (โดยมีคำเตือนที่อธิบายไว้ในคำตอบอื่น ๆ ) สำหรับค่าบางอย่างที่เป็นไปได้ - ฉันสามารถเขียนโมดูลเคอร์เนลเพื่อทำมันได้ แต่สำหรับค่าทั่วไปที่เป็นไปได้ (ฉันสามารถทำได้จากเชลล์ในการแจกจ่าย Linux เชิงพาณิชย์) ยังไม่สามารถทำได้


0

นี่คือเป้าหมายสูงสุดของระบบปฏิบัติการแบบคลัสเตอร์ Mathew Dillon ใช้ความพยายามอย่างมากในการนำสิ่งนี้ไปใช้ในโครงการDragonfly BSDของเขา


ฟีเจอร์นี้ถูกนำมาใช้อย่างสมบูรณ์ใน Dragonfly BSD หรือไม่?
Arjun J Rao

0

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

หากคุณไม่ชอบ virtualbox ด้วยเหตุผลใดก็ตาม vmware และ Qemu ก็ดีเหมือนกัน


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