Lưu toàn bộ quá trình để tiếp tục sau khi khởi động lại


54

Tôi đã phát triển một thuật toán cho một vấn đề khá khó khăn trong toán học, có khả năng sẽ cần vài tháng để hoàn thành. Vì tôi chỉ có tài nguyên hạn chế, tôi đã khởi động nó trên máy tính xách tay Ubuntu 12.04 (x86) của mình. Bây giờ tôi muốn cài đặt một số bản cập nhật và thực sự khởi động lại máy tính xách tay (thông báo "vui lòng khởi động lại" chỉ gây phiền nhiễu).

Có cách nào để lưu toàn bộ quá trình bao gồm bộ nhớ được phân bổ của nó để tiếp tục vượt quá khởi động lại không?

Đây là một số thông tin về quá trình bạn có thể cần. Xin vui lòng hỏi thêm thông tin nếu cần.

  • Tôi đã gọi quy trình trong một thiết bị đầu cuối bằng lệnh " ./binary > ./somefile &" hoặc "thời gian ./binary> ./somefile &", tôi thực sự không thể nhớ được.
  • Nó đang in một số thông tin gỡ lỗi sang std :: cerr (không thường xuyên lắm).
  • Hiện tại, nó đang sử dụng khoảng 600,0 kiB và mặc dù điều này sẽ tăng lên, nhưng nó không có khả năng tăng nhanh.
  • quá trình chạy với ưu tiên bình thường
  • kernel là 3.2.0-26-generic-pae, cpu là AMD, hệ điều hành là Ubuntu 12.04 x86.
  • nó chạy từ 9 ngày và 14 giờ (quá lâu để hủy bỏ nó ;-))

3
Vì tò mò, bạn đang tính toán điều gì?
Viktor Mellgren

3
@ user1261166: Tôi nghiên cứu Vấn đề truy cập mục tiêu (là phần mở rộng của Vấn đề nhân viên bán hàng du lịch) với cách tiếp cận Chi nhánh và Cắt. Do đó tôi cần biết càng nhiều khía cạnh của một số đa giác chiều cao đặc biệt càng tốt. Về cơ bản, nó đã thổi bùng lên một vấn đề lớn đến một vấn đề khổng lồ và sau đó cố gắng giải quyết chỉ một chút để giảm bớt nó sau đó.
stefan

5
Nó không hoàn toàn trả lời câu hỏi của bạn nhưng bạn đã xem xét việc chạy mã của mình trên một cụm dành riêng trong tương lai chưa? Chúng hầu như không tắt và tôi chắc chắn có một số lưới điện toán có sẵn cho bạn. Họ không chỉ ở mọi lúc mà còn nhanh hơn một chút (đặc biệt nếu bạn có thể song song mã của mình). Bạn thậm chí có thể tự mình thiết lập một cái (tra cứu Oracle Grid Engine).
Wojtek Rzepala

Tôi chưa bao giờ nghĩ về việc nuôi ong này như một câu hỏi phổ biến như vậy (ít nhất là phổ biến hơn mọi câu hỏi khác của tôi vậy). Vì quá trình kết thúc ngay bây giờ (bất ngờ, mặc dù không có sự cố), tôi sẽ thử từng phương pháp ngay sau đây. Cảm ơn mọi người!
stefan

Câu trả lời:


41

Giải pháp tốt nhất / đơn giản nhất là thay đổi chương trình của bạn để lưu trạng thái vào một tệp sử dụng lại tệp đó để khôi phục quy trình.

Dựa trên trang wikipedia về ảnh chụp nhanh ứng dụng , có nhiều lựa chọn thay thế:

  1. Ngoài ra còn có cryopid nhưng dường như không rõ ràng.
  2. Điểm kiểm tra / khởi động lại Linux có vẻ là một lựa chọn tốt nhưng kernel của bạn cần phải CONFIG_CHECKPOINT_RESTOREđược kích hoạt.
  3. criu có lẽ là dự án cập nhật nhất và có lẽ là bức ảnh đẹp nhất của bạn nhưng cũng phụ thuộc vào một số tùy chọn Kernel cụ thể mà bản phân phối của bạn có thể chưa được đặt.

Điều này đã quá muộn nhưng một cách tiếp cận thực hành khác là bắt đầu quy trình của bạn trong một máy ảo chuyên dụng và chỉ cần tạm dừng và khôi phục toàn bộ máy ảo. Tùy thuộc vào trình ảo hóa của bạn, bạn cũng có thể di chuyển máy giữa các máy chủ khác nhau.

Trong tương lai, hãy suy nghĩ về nơi bạn chạy các quy trình chạy dài của mình, cách xử lý song song chúng và cách xử lý các sự cố, ví dụ như toàn bộ đĩa, quy trình bị giết, v.v.


20

Một cách khá "rẻ" để làm điều này sẽ là xử lý trong VM (ví dụ: với VirtualBox). Trước khi bạn tắt hệ thống treo VM và lưu trạng thái. Sau khi khởi động khôi phục VM & trạng thái.

Điều này không có nhược điểm là yêu cầu giết và khởi động lại công việc. Nhưng nếu nó thực sự sẽ chạy trong vài tháng thì chênh lệch chín ngày trở nên tầm thường (tăng 5% trong 6 tháng).


Chỉnh sửa: Tôi mới nhận ra rằng Ulrich đã đề cập đến vấn đề này trong mục 4 không đánh số trong danh sách của mình.

Tôi vẫn sẽ khuyến khích bạn coi đây là một lựa chọn, đặc biệt là vì không có giải pháp thay thế nào có vẻ như là một giải pháp mạnh mẽ. Mỗi có một lý do tại sao nó có thể không hoạt động.

Tôi cho rằng điều tốt nhất nên làm là thử một trong những thứ đó và nếu nó không hoạt động, hãy khởi động lại công việc trong VM.


15

Hãy xem qua công cụ CryoPID .

Từ trang chủ: "CryoPID cho phép bạn nắm bắt trạng thái của một tiến trình đang chạy trong Linux và lưu nó vào một tệp. Tệp này sau đó có thể được sử dụng để tiếp tục quá trình sau này, sau khi khởi động lại hoặc thậm chí trên một máy khác."


4
Đã sử dụng điều này trước đây để lưu trạng thái của tập lệnh python chạy trên hộp Linux và chuyển nó sang hộp FreeBSD và tiếp tục ở đó. Một số phép thuật phức tạp đang diễn ra ở đó;)
Tim

Tôi không biết FreeBSD và Linux tương thích nhị phân; đó là điều rất thú vị tôi vừa học được. Nhưng điều đó có nghĩa là họ có mô hình bộ nhớ giống hệt nhau? Đối với tôi, có vẻ hoài nghi rằng họ có cùng một quy ước về tòa nhà, cùng một libc (tôi đoán fbsd sử dụng glibc), các quy ước gọi chính xác tương tự ở cấp độ asm, v.v. nó vào một hộp Windows; Điều đó thực sự khá tuyệt vời.
con mèo

Có ai đã thử điều này gần đây? Trang web đã biến mất, tôi không thể tìm thấy một .deb, xây dựng từ nguồn không thành công, v.v. Tôi muốn biết liệu nó có khả thi hay không trước khi chi tiêu lâu hơn cho nó. Tôi đang dùng Debian nếu có vấn đề.
John P

1
@JohnP Hiện có sẵn trên GitHub: github.com/maaziz/cryopid
starbeamrainbowlabs

7

Nếu bạn cuối cùng cần phải khởi động lại chương trình của mình, tôi sẽ khuyến khích bạn dành một chút thời gian để thêm một số tính năng vào mã của bạn có thể giúp bạn tiết kiệm thời gian trong tương lai.

Nếu quá trình sẽ được chạy trong một thời gian dài, việc có thể lưu toàn bộ trạng thái quy trình khi bạn khởi động lại máy có lẽ không hữu ích lắm nếu quá trình của bạn gặp sự cố trong khi nó đang chạy.

Tôi sẽ khuyến khích bạn để đầu ra chương trình của bạn thành một dữ liệu "điểm kiểm tra". Dữ liệu này phải đủ để chương trình của bạn có thể tiếp tục từ trạng thái như lúc lưu tệp kiểm tra. Bạn không cần phải lưu toàn bộ quá trình, chỉ cần một ảnh chụp nhanh các biến có liên quan đang được sử dụng trong tính toán của bạn, đủ để tính toán của bạn tiếp tục ở nơi nó dừng lại. Mã của bạn cũng cần bao gồm một số cách đọc dữ liệu từ tệp này để có được trạng thái bắt đầu.

Bạn có thể thiết lập mã của mình để khi bạn gửi tín hiệu, nó sẽ lưu một trong các tệp điểm kiểm tra này, do đó bạn có thể lưu "trạng thái" tính toán của mình bất kỳ lúc nào.

Ngoài ra, việc có thể xem dữ liệu thay đổi như thế nào khi tiến trình tính toán có thể rất thú vị!

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.