Yeniden başlattıktan sonra devam etmek için tüm süreci kaydedin


54

Matematikte oldukça zor bir problem için bir algoritma geliştirdim, bitirmek için birkaç ay gerekiyor. Yalnızca sınırlı kaynaklarım olduğu için, bunu Ubuntu 12.04 (x86) dizüstü bilgisayarımda başlattım. Şimdi bazı güncellemeleri yüklemek ve aslında dizüstü bilgisayarı yeniden başlatmak istiyorum ("lütfen yeniden başlat" mesajı sadece can sıkıcı bir durum).

Yeniden başlatmanın ötesinde devam etmek için ayrılan belleği içeren tüm bir işlemi kaydetmenin bir yolu var mı?

İhtiyacınız olabilecek işlem hakkında bazı bilgiler. Gerekirse daha fazla bilgi istemek için çekinmeyin.

  • Süreci " ./binary > ./somefile &" veya "time ./binary> ./somefile &" komutuyla bir terminalde çağırdım, gerçekten hatırlayamıyorum.
  • Bazı hata ayıklama bilgilerini std :: cerr'a (çok sık değil) yazdırıyor.
  • Şu anda kabaca 600.0 kiB kullanıyor ve bu artmasına rağmen, hızlı bir şekilde artması pek mümkün değil.
  • süreç normal önceliğe sahip
  • Çekirdek 3.2.0-26-jenerik-pae, işlemci bir AMD, işletim sistemi Ubuntu 12.04 x86.
  • 9 gün 14 saatten beri çalışıyor (iptal etmek için çok uzun ;-))

3
Meraktan ne hesaplıyorsun?
Viktor Mellgren

3
@ user1261166: Şube ve Kesim yaklaşımı ile Hedef Ziyaret Sorununu (Seyahat Eden Satıcı Probleminin bir uzantısı olan) inceliyorum. Bu yüzden, bazı özel yüksek boyutlu poliplerin mümkün olduğunca çok yönünü bilmem gerekiyor. Temel olarak, devasa bir problem için büyük bir problem yaratıyor ve daha sonra azaltmak için biraz çözmeye çalışıyor.
stefan

5
Sorunuzu tam olarak cevaplamıyor ama gelecekte kodunuzu özel bir kümede çalıştırmayı düşündünüz mü? Bunlar pek de kapalı değil ve eminim size uygun bir bilgi işlem şebekesi var. Sadece her zaman açık değil, aynı zamanda biraz daha hızlı (özellikle kodunuzu paralel hale getirebilirseniz). Hatta bir tanesini kendin kurmaya gidebilirsin (Oracle Grid Engine'e bak).
Wojtek Rzepala

Hiç bu kadar popüler bir soru sorduğumu düşünmedim (en azından benim tarafımdan diğerlerinden daha popüler çünkü). İşlem şu an bittiğinden (beklenmedik bir şekilde, çökme olmadan), her yöntemi kısa bir süre sonra deneyeceğim. Herkese teşekkürler!
stefan

Yanıtlar:


41

En iyi / en basit çözüm, durumunuzu bir dosyaya kaydetmek için programınızı değiştirmek, işlemi geri yüklemek için bu dosyayı yeniden kullanmaktır.

Uygulama anlık görüntüleri hakkındaki wikipedia sayfasını temel alan birden fazla alternatif var:

  1. Kriyopid de var ama bakımsız görünüyor.
  2. Linux kontrol noktası / yeniden başlatma iyi bir seçim gibi görünüyor ama çekirdeğinizin CONFIG_CHECKPOINT_RESTOREetkin olması gerekiyor .
  3. criu muhtemelen en güncel proje ve muhtemelen en iyi şansınız ancak aynı zamanda dağıtımınızın belirlemediği bazı belirli Çekirdek seçeneklerine de bağlı .

Bu zaten çok geç ama daha pratik bir yaklaşım, işleminizi özel bir VM'de başlatmak ve sadece tüm Sanal makineyi askıya almak ve geri yüklemek. Hiper yöneticinize bağlı olarak, makineyi farklı ana bilgisayarlar arasında da taşıyabilirsiniz.

Gelecekte uzun süredir devam eden süreçlerinizi nerede yürüttüğünüzü, onları nasıl paralize edeceğinizi ve problemlerle nasıl başa çıkacağınızı düşünün, örneğin tam diskler, süreç öldürülür.


20

Bunu yapmanın oldukça "ucuz" bir yolu, bir VM'de işlem yapmaktır (örneğin, VirtualBox ile). Kapatmadan önce VM'yi askıya alın ve durumu kaydedin. Önyüklemeden sonra VM & durumunu geri yükleyin.

Bu, işin öldürülmesini ve yeniden başlatılmasını gerektirme dezavantajına sahiptir. Fakat aslında birkaç ay sürecek olsa, dokuz günlük bir fark önemsiz hale gelir (6 ayda% 5 artış).


Düzenleme: Sadece Ulrich'in listesindeki numarasız 4. maddede bundan bahsettiğini fark ettim.

Özellikle alternatiflerden hiçbiri sağlam bir çözüm gibi görünmediğinden, bunu bir seçenek olarak görmenizi tavsiye ederim. Her birinin çalışmamasının bir nedeni vardır.

Sanırım yapılacak en iyi şey, bunlardan birini denemek ve işe yaramazsa, bir VM'deki işi yeniden başlatmak.


15

CryoPID aracına bir göz atın .

Ana sayfadan: "CryoPID, Linux'ta çalışan bir işlemin durumunu yakalamanıza ve bir dosyaya kaydetmenize izin verir. Bu dosya daha sonra yeniden başlatmanın ardından veya hatta başka bir makinede işlemi devam ettirmek için kullanılabilir."


4
Bunu daha önce Linux kutusundaki bir python betiğinin durumunu kaydetmek ve bir FreeBSD kutusuna taşımak ve orada devam ettirmek için kullandım. Orada bazı arcane sihir oluyor;)
Tim

FreeBSD ve Linux'un ikili uyumlu olduğunu bilmiyordum; Bu sadece öğrendiğim çok ilginç bir şey. Fakat bu onların tamamen aynı bellek modellerine sahip oldukları anlamına mı geliyor? Bana aynı sistem çağrıları, aynı libc (sanırım fbsd glibc kullanıyorlar), asm düzeyindeki aynı kesin çağrı sözleşmeleri vb. bir Windows kutusu üzerine; bu gerçekten oldukça şaşırtıcı.
kedi,

Bunu yakın zamanda deneyen oldu mu? Site bitti, bir kaynak bulmuyorum, kaynaktan bina yapılamıyor, vb. Daha fazla harcamadan önce mümkün olup olmadığını bilmek istiyorum. Önemli olursa Debian'dayım.
John P,

1
@JohnP GitHub'da şuan mevcut: github.com/maaziz/cryopid
starbeamrainbowlabs

7

Programınızı yeniden başlatmanız gerekmiyorsa, gelecekte size zaman kazandıracak bazı özellikler ekleyerek kodunuza zaman ayırmanızı tavsiye ederim.

İşlem uzun süre çalıştırılacaksa, makineyi yeniden başlattığınızda işlem durumunun tamamını kaydedebilmeniz, işleminiz çalışırken çöküyorsa büyük olasılıkla yararlı olmayabilir.

Program çıktınızı bir dosya "kontrol noktası" verisine almanızı tavsiye ederim. Bu veriler, programınızın kontrol noktası dosyası kaydedildiği zamanki durumundan devam edebilmesi için yeterli olacaktır. İşlemin tamamını kaydetmeniz gerekmez, hesaplamanızda kullanılan ilgili değişkenlerin sadece bir görüntüsüdür, hesaplamanızın kaldığı yerden devam etmesi için yeterlidir. Kodunuzun, başlangıç ​​durumunu elde etmek için bu dosyadaki verilerde bir miktar okuma yolu içermesi gerekir.

Kodunuzu, bir sinyal gönderdiğinizde, bu kontrol noktası dosyalarından birini kaydederek, hesaplamanızın "durumunu" herhangi bir noktada kaydedebilmeniz için ayarlayabilirsiniz.

Ek olarak, hesaplama ilerledikçe verilerin nasıl değiştiğini görebilmek kendi başına ilginç olabilir!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.