Komut dosyalarını uzaktaki bir makinede paralel olarak nasıl çalıştırırım?


16

64 çekirdekli bir uzak makineye ssh yapabilirim. Bu makinede paralel olarak 640 kabuk betiği çalıştırmam gerektiğini söyleyelim. Bunu nasıl yaparım?

640 betiğin 10 betiğin her birini 64 gruba böldüğünü görebiliyorum. Daha sonra bu grupların her birini nasıl paralel çalıştırabilirim , yani mevcut çekirdeklerin her birinde bir grup.

Formun bir senaryosu olur mu

    ./script_A &
    ./script_B &
    ./script_C &
    ...

nerede script_Abirinci gruba, script_Bikinci gruba vs. karşılık gelir , yeterli?

Bir çekirdek üzerinde çalışan bir grup içindeki komut dosyaları sırayla çalıştırmak için uygundur, ancak grupların tüm çekirdeklerde paralel olarak çalışmasını istiyorum.


Çekirdekler tarafından eşit olarak dağıtıldıkları garanti edilmez. Bu konuya bir göz atın. stackoverflow.com/questions/13583146/…
Rui F Ribeiro

Yanıtlar:


24

Bu GNU paralel için bir iş gibi görünüyor:

parallel bash -c ::: script_*

Avantajı, senaryolarınızı çekirdeklere göre gruplamak parallelzorunda kalmamanızdır, bunu sizin için yapar.

Tabii ki, komut dosyaları çalışırken SSH oturumunu bebek bakımı yapmak istemiyorsanız, nohupveyascreen


Bu iyi bir cevap ve ben genel durumda olduğu gibi kabul ediyorum bu iyi çalışır.Ne yazık ki benim için kişisel olarak uzak makineye yönetici ayrıcalıklarım yok ve bu yüzden parallelpaketi yükleyemiyorum . Teşekkürler
Tom

10
Global olarak paralel kurulum yapmanız gerekmez: kendi ana dizininizden bir kopya çalıştırabilmeniz gerekir.
dhag

bash -cgereksiz olabilir parallel ::: ./script*. 640 betiği ile çok benzer olmaları muhtemeldir (örneğin, sadece bir argüman farklıdır). Bunun için bu bağımsız değişkenleri ayarlamak ve tek bir komut dosyası kullanmak için doğrudan GNU Parallel kullanmayı düşünün.
Ole Tange

GNU'yu uzaktaki bir makineye nasıl kurarım?
Tom

@Tom Uzak bir makine kullanmanızın nesi değişti? Sadece gnu.org/software/parallel adresinden doğru paketi alın ve kurun.
Dmitry Grigoryev

5

Bu, çıkışı izlemeniz gerekmediği sürece çalışır ve komut dosyalarının çalışması için ssh oturumunuzu açık bırakabilirsiniz. Bunlardan biri doğru değilse screen, birden çok sekme ile kullanmanızı tavsiye ederim . Gibi bir şey yapabilirdin

screen
for script in script_A script_B script_C; do
  screen -t "$script" ./$script
done;

İlgilenmediğim çıktıları izleme - ssh oturumunu açık bırakmak istemem. Nohup kullanmaya ne dersiniz? Bu, oturum sonlandırılırsa komut dosyalarının durmasını önler hayır? Ekran önerinize de göz atacağım. Teşekkürler!'
Tom

nohupMuhtemelen işe screenyarar , ben sadece daha aşinayım ve sizin için yararlı olabilecek veya olmayabilecek çok daha fazla işlevselliğe sahip.
David King

2

Çok sayıda komut dosyası oluşturma işini başlatmak ve yönetmek için, kaynak kullanımını (CPU, bellek, öncelik) kontrol etmek için bir tür yönetim yazılımına ihtiyacınız olacak, iş durumunu görün (bekleyin, askıya alın, çalışın, tamamlandı).

Şebeke motoru bunun için, örneğin, Sun Şebeke Motoru ( http://wiki.gridengine.info/wiki/index.php/Main_Page ) veya Açık Izgara Zamanlayıcı ( http://gridscheduler.sourceforge.net/ ). Başlamadan önce yöneticinin sizin için uygun yazılımı yüklemesi gerekir. Yönetici, makinede çalışan yüzlerce işlemi görmek yerine bunu yapmaktan mutlu olabilir ve bunlar üzerinde herhangi bir kontrolü yoktur.

Genel olarak, yönetici bir makinenin kaç yuvaya bölünebileceğini tanımlar ve bir kuyruğa bir iş gönderirsiniz ve işin kaç yuvayı tüketmek istediğinizi belirtirseniz, ızgara motoru genel sistem kullanımını izler ve işi yönetici tarafından tanımlanan kuyruk politikası. örneğin, aynı anda x'den fazla iş çalıştırılamaz vb. işlerin geri kalanı bekleme durumunda olacak ve önceki işler bittikten sonra serbest bırakılacaktır.



0

Bunu çeşitli vesilelerle yaptım ve genellikle iş kontrolü ile iş yapmak için kendi senaryomu yuvarladım. Genel olarak, bir dosyada çalıştırmak istediğiniz tüm komut dosyalarının adlarına sahipseniz, çözüm şöyle görünür:

#!/bin/bash
scripts=$(cat scriptfiles.txt)
declare -i NUM=0
declare -i MAX_PROCS=30
for script in "$scripts"
do
  NUM=$((NUM+1))
  ssh remote.host.ip "${script}" > ${script}.log 2>&1 &
  if [ $NUM -ge $MAX_PROCS ];then
    echo "Waiting for $NUM processes to finish."
    wait
    NUM=0
  fi
done
echo "Waiting for final $NUM processes to finish."
wait
exit

Kaba kuvvet ama etkili. Ayrıca sistemlerinize paralel gibi ek bir yazılıma ihtiyaç duymazsınız.

Büyük bir sorun, wait komutunun en yavaş komut dosyasının bitmesini bekleyip zaman kaybına neden olmasıdır. Bu durumla ilgilenmek için senaryolar oluşturdum, ancak tahmin edebileceğiniz gibi daha karmaşık hale geliyorlar. Tüm komut dosyalarınız yaklaşık aynı sürede çalışırsa, bu iyi çalışır.

Başka bir sorun, en iyi performansı belirlemek için MAX_PROCS ayarlamanız gerekebilir.

Tabii ki, ssh bağlantılarının sayısı hantal olabilir. Bu durumda, bu komut dosyasını uzak ana bilgisayara taşıyın ve komut dosyalarını doğrudan çalıştırmak için "ssh ..." satırını değiştirin.

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.