Daha sonra yürütmek için bir Linux işlemi nasıl durdurulur bellek


19

Gelecekte aynı işleme devam etmek amacıyla CPU veya fiziksel bellek kaynaklarını tüketmemek için uzun süre çalışan bir işlemi durdurmak istiyorum .

CPU kısmı kullanılarak elde edilebilir SIGSTOPve SIGCONT sinyaller biliyorum ama (dışarı-in işlem kirli sayfaları durumunda takas-) hemen bir (durmuş) işlemin özel RSS bellek sayfa çıkış mümkün mü?


1
Bunun arkasındaki niyet nedir? Sürecin daha hızlı devam etmesini sağlamak istiyor musunuz? Veya hassas verilerin diske yazılmasını önlemek mi istiyorsunuz? Veya başka bir şey? Niyeti bilersek, daha iyi cevaplar verebiliriz.
oliver

13
İşletim sistemi bunu otomatik olarak yapacaktır. Belirli bir şey yapmak için gerçekten bir neden yok.
David Schwartz

@oliver Bir toplu iş zamanlayıcı ( github.com/brutusin/wava ) oluşturuyorum. Mevcut uygulama önleyici olmayan zamanlama sunuyor ama tüm çalışan işler sıraya alınmış işlere bağlı olduğunda bazı kilitlenme durumlarından kaçınmak için önleyici bir (işlerin çalışmasını durdurarak) taşımak istiyorum. Tam olarak sordum, durdu süreçleri devam bir davranış (bir kontrol noktasından yenilerini oluşturma değil)
idelvall

1
Riskli bir iddia olan
@DavidSchwartz

@idelvall Sonra, belleğe özel bir şey yapmak istemediğiniz anlaşılıyor.
David Schwartz

Yanıtlar:


11

Denetim noktası / geri yükleme adı verilen bir tekniğe bakabilirsiniz. Bu, çalışan bir işlemi almanıza ve durumunu bir dosya kümesine kaydetmenize, ardından daha sonra geri yüklemenize olanak tanır.
Kullanmak için criu [ git , wiki ] programını ( yum install criuveya apt install criu) yükleyerek başlayın .

Çalışan bir işlemi denetlemek için, dosyalarını ve cd'yi bu dizinde tutmak üzere boş bir dizin oluşturun.

mkdir /var/tmp/checkpoint
cd /var/tmp/checkpoint

Şimdi çalışan işlemi kontrol edin. Bu durumda, işlemimi ilişkili bir tty ile bir kabukta çalıştırdığım için --shell-job kullanıyorum.

criu dump -t 404 --shell-job

404 kontrol noktası istediğim sürecin pid. Bunu yaptığımda çalışan işlemimin öldürüldüğünü ve / var / tmp / checkpoint dizinimin geri yüklemek için gereken bir dizi dosyayla doldurulduğunu görüyorum.

Süreci geri yüklemek için, denetim noktası dosyaları ile dizinde olduğumdan emin olun ve geri yükleme yapın.

cd /var/tmp/checkpoint
criu restore --shell-job

İşlem, çalıştığı terminalde kaldığı yerden devam edecektir. Bu çalışan işlemi öldürür ve criu restore --shell-jobtekrar çalıştırırsam , süreç kontrol noktasına geri döner ve yeniden başlar.

Bu yardımcı olur umarım.


4
Bu OP'nin yapmak istediklerini yapmaz. Deneyin - kullanılan bellekte azalma olmayacaktır. Sadece işlem özel belleğinden disk önbelleğine geçecektir (dosya grubunun yazılması nedeniyle). Sadece ekstra bir kaydetme adımı ve ekstra bir geri yükleme adımı yapar ve aynı bellek aynı şekilde kullanılır (ve çıkarılabilir). Aslında, yazmak için yeni her şeyi üretme nedeniyle bazı bellekler çoğaldığından işleri daha da kötüleştirebilir.
David Schwartz

heh, iyi nokta @David, özellikle /tmptmpfs ise (bellek / takas alanı ile desteklenir). Normal bir disk destekli dosya sistemine işaret verirseniz vmtouch -e, sayfaları sayfa önbelleğinden çıkarmak için kullanabilirsiniz , ancak yine de geçici olarak fazladan RAM kullanır. ( criuDoğrudan i / o (O_DIRECT ile) yapma seçeneği yoksa ...)
Peter Cordes

1
OP'nin bunu isteyip istemediğini bilmek zordur, çünkü OP hangi sorunu çözmeye çalıştığını açıklamak yerine belirli bir çözüm ister. Bu mükemmel bir cevap olabilir ya da onun için işe yaramaz olabilir, söyleyemeyiz.
David Schwartz

Henüz ayrıntılı olarak bakmadım, ancak geri yüklenen işlem yeni bir süreç (farklı ad) gibi görünüyor ve bu tam olarak ihtiyacım olan şey değil ...
idelvall

1
@idelvall: Denetim noktası / geri yükleme aromaları bu şekilde çalışır. Önemli bir kullanım örneği, yeniden başlatmalar arasında bir hesaplamadaki ilerlemeyi kaydetmektir.
Peter Cordes
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.