Làm thế nào để "ngủ đông" một tiến trình trong Linux bằng cách lưu trữ bộ nhớ của nó vào đĩa và khôi phục nó sau đó?


99

Có thể 'ngủ đông' một quy trình trong linux không? Cũng giống như 'ngủ đông' trong máy tính xách tay, tôi sẽ ghi tất cả bộ nhớ được sử dụng bởi một quy trình vào đĩa, giải phóng RAM. Và sau đó, tôi có thể 'tiếp tục quá trình', tức là đọc tất cả dữ liệu từ bộ nhớ và đưa nó trở lại RAM và tôi có thể tiếp tục quá trình của mình?


8
Thú vị câu hỏi: D
dangerstat

Những gì bạn mô tả thực sự thường được gọi là 'điểm kiểm tra', bạn có thể gặp may mắn hơn khi tìm kiếm với cụm từ đó.
Tim Post

Nó phải được. Tính năng tốt. Hibernate vs close.
Vitaly Fadeev

Câu trả lời:


54

Tôi đã từng duy trì CryoPID , một chương trình thực hiện chính xác những gì bạn đang nói. Nó ghi nội dung của không gian địa chỉ của chương trình, VDSO, các tham chiếu của bộ mô tả tệp và trạng thái vào tệp mà sau này có thể được tái tạo lại. CryoPID bắt đầu khi không có móc nào có thể sử dụng được trong chính Linux và hoạt động hoàn toàn từ không gian người dùng (thực tế, nó vẫn hoạt động, tùy thuộc vào cài đặt phân phối / nhân / bảo mật của bạn).

Các vấn đề là (thực sự) các ổ cắm, tín hiệu RT đang chờ xử lý, nhiều vấn đề X11, việc triển khai getpid () bộ nhớ đệm glibc trong số nhiều vấn đề khác. Sự ngẫu nhiên hóa (đặc biệt là VDSO) hóa ra là điều không thể vượt qua đối với một số ít người trong chúng ta đang làm việc với nó sau khi Bernard từ bỏ nó. Tuy nhiên, nó rất vui và trở thành chủ đề của một số luận văn thạc sĩ.

Nếu bạn chỉ đang xem xét một chương trình có thể lưu trạng thái đang chạy của nó và khởi động lại trực tiếp vào trạng thái đó, thì xa .. xa .. dễ dàng hơn chỉ cần lưu thông tin đó từ trong chính chương trình đó, có lẽ khi bảo dưỡng một tín hiệu.


5
Kể từ tháng 7 năm 2014, thật không may, CryoPID không còn được chú ý nữa và không chạy trên các hạt nhân gần đây. Nhưng trong thời gian đó các dự án mới được sinh ra (một số bước đã được thực hiện ngay cả khi kết nối TCP "ngủ đông"). Tôi đã đặt câu trả lời bên dưới với thông tin cập nhật. Kiểm tra nó ra! ;)
dappiu

1
@dappiu Điều đó thật tuyệt - nhưng CryoPID chỉ là một ví dụ trong câu trả lời này để minh họa nó có thể phức tạp như thế nào, nơi tôi tiếp tục đề xuất họ xử lý việc lưu trạng thái trong chính chương trình, theo cách có thể dễ dàng tiếp tục. CryoPID trì trệ không làm cho câu trả lời ít liên quan hơn.
Tim Post

Cryopid2 gần đây hoạt động nhiều hơn (2013): sourceforge.net/projects/cryopid2
Leopd

31

Tôi muốn cập nhật trạng thái ở đây, kể từ năm 2014.

Câu trả lời được chấp nhận gợi ý CryoPID như một công cụ để thực hiện Checkpoint / Restore, nhưng tôi thấy dự án không có gì đáng chú ý và không thể biên dịch với các hạt nhân gần đây. Bây giờ, tôi tìm thấy hai dự án tích cực được chú ý cung cấp tính năng kiểm tra ứng dụng.

Đầu tiên, cái mà tôi đề xuất 'vì tôi may mắn hơn khi chạy nó, là CRIU thực hiện kiểm tra / khôi phục chủ yếu trong không gian người dùng và yêu cầu bật tùy chọn hạt nhân CONFIG_CHECKPOINT_RESTORE để hoạt động.

Checkpoint / Restore In Userspace, hoặc CRIU (phát âm là kree-oo, IPA: / krɪʊ /, tiếng Nga: криу), là một công cụ phần mềm dành cho hệ điều hành Linux. Sử dụng công cụ này, bạn có thể đóng băng một ứng dụng đang chạy (hoặc một phần của nó) và kiểm tra nó vào ổ cứng dưới dạng một bộ sưu tập các tệp. Sau đó, bạn có thể sử dụng các tệp để khôi phục và chạy ứng dụng từ thời điểm nó bị đóng băng. Đặc điểm khác biệt của dự án CRIU là nó chủ yếu được thực hiện trong không gian người dùng.

Sau này là DMTCP ; trích dẫn từ trang chính của họ:

DMTCP (Điểm kiểm tra đa luồng phân tán) là một công cụ để kiểm tra trạng thái của nhiều ứng dụng đồng thời một cách minh bạch, bao gồm các ứng dụng đa luồng và phân tán. Nó hoạt động trực tiếp trên tệp thực thi nhị phân của người dùng, không có bất kỳ mô-đun hạt nhân Linux nào hoặc các sửa đổi hạt nhân khác.

Ngoài ra còn có một trang Wikipedia hay về đối số: Application_checkpointing


20

Các câu trả lời được đề cập ctrl-zthực sự đang nói về việc dừng quá trình bằng một tín hiệu, trong trường hợp này SIGTSTP. Bạn có thể phát tín hiệu dừng bằng kill:

kill -STOP <pid>

Điều đó sẽ tạm dừng thực hiện quy trình. Nó sẽ không giải phóng ngay bộ nhớ được sử dụng bởi nó, nhưng vì bộ nhớ cần thiết cho các quá trình khác, bộ nhớ được sử dụng bởi quá trình bị dừng sẽ dần dần được hoán đổi.

Khi bạn muốn đánh thức lại nó, hãy sử dụng

kill -CONT <pid>

Các giải pháp phức tạp hơn, như CryoPID, chỉ thực sự cần thiết nếu bạn muốn quá trình bị dừng để có thể tồn tại khi hệ thống tắt / khởi động lại - có vẻ như bạn không cần điều đó.


13

Sự cố đang khôi phục các luồng - tệp và ổ cắm - mà chương trình đã mở.

Khi toàn bộ hệ điều hành của bạn ở chế độ ngủ đông, các tệp cục bộ và các tệp đó rõ ràng có thể được khôi phục. Các kết nối mạng thì không, nhưng sau đó mã truy cập internet thường kiểm tra lỗi nhiều hơn và như vậy và vẫn tồn tại các điều kiện lỗi (hoặc phải có).

Nếu bạn đã thực hiện chế độ ngủ đông theo từng chương trình (không có ứng dụng hỗ trợ), bạn sẽ xử lý các tệp đang mở như thế nào? Điều gì sẽ xảy ra nếu một quá trình khác truy cập các tệp đó trong thời gian tạm thời? Vân vân?

Việc duy trì trạng thái khi chương trình không được tải sẽ rất khó khăn.

Đơn giản chỉ cần tạm dừng các luồng và để nó được hoán đổi vào đĩa sẽ có tác dụng tương tự?

Hoặc chạy chương trình trong một máy ảo và để VM xử lý việc tạm ngưng.


12

Câu trả lời ngắn gọn là "có, nhưng không phải lúc nào cũng đáng tin cậy". Kiểm tra CryoPID:

http://cryopid.berlios.de/

Mở tệp thực sự sẽ là vấn đề phổ biến nhất. CryoPID tuyên bố rõ ràng:

Các tệp đang mở và các phần bù được khôi phục. Các tệp tạm thời chưa được liên kết và không thể truy cập trên hệ thống tệp luôn được lưu trong hình ảnh. Các tệp khác không tồn tại trên sơ yếu lý lịch vẫn chưa được khôi phục. Hỗ trợ lưu nội dung tệp cho những tình huống như vậy đã được lên kế hoạch.

Các vấn đề tương tự cũng sẽ ảnh hưởng đến kết nối TCP, mặc dù CryoPID hỗ trợ tcpcp để nối lại kết nối.


3
Sau khi nhấn nút gửi, bây giờ tôi nhận ra điều này giống như thư rác / quảng cáo cho CryoPID. Nó không phải - tôi chỉ đơn giản là một người dùng hài lòng với tiện ích, thực sự.
Ulisses Montenegro



6

Tôi đã mở rộng Cryopid sản xuất một gói có tên Cryopid2 có sẵn từ SourceForge. Điều này có thể di chuyển một quá trình cũng như cho nó ở chế độ ngủ đông (cùng với bất kỳ tệp và ổ cắm đang mở nào - dữ liệu trong ổ cắm / đường ống bị hút vào quá trình ở chế độ ngủ đông và quay trở lại chúng khi quá trình được khởi động lại).

Lý do tôi không hoạt động với dự án này là tôi không phải là nhà phát triển hạt nhân - cả điều này (và / hoặc cryopid ban đầu) cần phải có một người nào đó trong hội đồng quản trị có thể giúp chúng chạy với các hạt nhân mới nhất (ví dụ: Linux 3.x) .

Phương pháp Cryopid hoạt động - và có lẽ là giải pháp tốt nhất cho quá trình ngủ đông / di chuyển mục đích chung trong Linux mà tôi đã xem qua.


3

Như những người khác đã lưu ý, rất khó để Hệ điều hành cung cấp chức năng này, vì ứng dụng cần có một số nội dung kiểm tra lỗi để xử lý các luồng bị hỏng.

Tuy nhiên, lưu ý là một số ngôn ngữ lập trình và công cụ sử dụng máy ảo hỗ trợ rõ ràng chức năng này, chẳng hạn như ngôn ngữ lập trình Self .


0

Ctrl-Z làm tăng cơ hội hoán đổi các trang của quy trình, nhưng nó không giải phóng hoàn toàn tài nguyên của quy trình. Vấn đề với việc giải phóng hoàn toàn tài nguyên của quy trình là những thứ như tệp xử lý, ổ cắm là tài nguyên hạt nhân mà quy trình có thể sử dụng, nhưng không biết cách tự tồn tại. Vì vậy, Ctrl-Z càng tốt.


0

Đã có một số nghiên cứu về trạm kiểm soát / khôi phục cho Linux trở lại sau 2.2 và 2.4 ngày, nhưng nó chưa bao giờ trở thành nguyên mẫu. Có thể (với những lưu ý được mô tả trong các câu trả lời khác) đối với một số giá trị có thể - Tôi bạn có thể viết một mô-đun hạt nhân để làm điều đó, điều đó hoàn toàn có thể. Nhưng đối với giá trị phổ biến là có thể (tôi có thể làm điều đó từ shell trên bản phân phối Linux thương mại), thì vẫn chưa thể.


0

Đây là mục tiêu cuối cùng của hệ điều hành phân cụm. Mathew Dillon đã nỗ lực rất nhiều để thực hiện một cái gì đó như thế này trong dự án Dragonfly BSD của mình .


Tính năng này có được triển khai đầy đủ trong Dragonfly BSD không?
Arjun J Rao

0

thêm một giải pháp khác: bạn có thể sử dụng hộp ảo. chạy các ứng dụng của bạn trong một máy ảo thông thường và chỉ cần "lưu trạng thái máy" bất cứ khi nào bạn muốn. Tôi biết đây không phải là một câu trả lời, nhưng tôi nghĩ nó có thể hữu ích khi không có lựa chọn thực sự nào.

nếu vì bất kỳ lý do gì bạn không thích virtualbox, vmware và Qemu cũng tốt.


-2

ctrl+ztrong linux, nhưng tôi không chắc nó cung cấp các tính năng bạn đã chỉ định. Tôi nghi ngờ bạn đã hỏi câu hỏi này vì nó không

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.