Bagaimana menjalankan skrip secara paralel pada mesin jarak jauh?


16

Saya dapat ssh ke mesin jarak jauh yang memiliki 64 core. Katakanlah saya perlu menjalankan 640 skrip shell secara paralel pada mesin ini. Bagaimana saya melakukan ini?

Saya dapat melihat memisahkan 640 skrip menjadi 64 grup masing-masing dari 10 skrip. Bagaimana saya kemudian menjalankan masing-masing kelompok ini secara paralel , yaitu satu kelompok pada masing-masing salah satu inti yang tersedia.

Apakah naskah formulir

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

di mana script_Aberkorespondensi dengan kelompok pertama, script_Bdengan kelompok kedua dll, sudah cukup?

Skrip dalam satu grup yang berjalan pada satu inti boleh dijalankan secara berurutan, tapi saya ingin grup dijalankan secara paralel di semua core.


Tidak dijamin mereka didistribusikan secara merata oleh core. Lihatlah utas ini. stackoverflow.com/questions/13583146/…
Rui F Ribeiro

Jawaban:


24

Ini terlihat seperti pekerjaan untuk gnu parallel:

parallel bash -c ::: script_*

Keuntungannya adalah bahwa Anda tidak harus mengelompokkan skrip Anda dengan core, parallelakan melakukannya untuk Anda.

Tentu saja, jika Anda tidak ingin menjaga sesi SSH saat skrip berjalan, Anda harus menggunakan nohupatauscreen


Ini adalah jawaban yang bagus dan saya menerimanya karena dalam kasus umum ini akan bekerja dengan baik. Sayangnya bagi saya pribadi, saya tidak memiliki hak administrator untuk mesin jarak jauh sehingga tidak dapat menginstal parallelpaket. Terima kasih`
Tom

10
Anda tidak harus menginstal paralel secara global: Anda harus dapat menjalankan salinan dari direktori home Anda sendiri.
Dhag

bash -cmungkin tidak dibutuhkan: parallel ::: ./script*. Dengan 640 skrip, kemungkinan mereka sangat mirip (mis. Hanya argumen yang berbeda). Untuk itu pertimbangkan untuk menggunakan GNU Parallel secara langsung untuk mengatur argumen ini dan menggunakan satu skrip.
Ole Tange

Bagaimana saya menginstal paralel gnu pada mesin remote?
Tom

@ Tom Apa yang diubah oleh fakta bahwa Anda menggunakan mesin jarak jauh? Dapatkan paket yang tepat dari gnu.org/software/parallel dan instal.
Dmitry Grigoryev

5

Itu akan bekerja selama Anda tidak perlu memantau output dan Anda baik-baik saja membiarkan sesi ssh Anda terbuka selama skrip berjalan. Jika salah satu dari itu tidak benar, saya akan merekomendasikan menggunakan screendengan banyak tab. Anda bisa melakukan sesuatu seperti

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

Memantau output yang tidak saya pedulikan - Saya tidak ingin membiarkan sesi ssh terbuka. Bagaimana dengan menggunakan nohup? Ini akan mencegah skrip berhenti jika sesi tidak berakhir? Saya juga akan melihat rekomendasi layar Anda. Terima kasih!'
Tom

nohupmungkin akan bekerja, saya hanya lebih akrab dengan screendan memiliki lebih banyak fungsi yang mungkin bermanfaat bagi Anda.
David King

2

Untuk memulai dan mengelola sejumlah besar pekerjaan skrip, Anda akan memerlukan semacam perangkat lunak manajemen untuk mengontrol penggunaan sumber daya (CPU, memori, prioritas), melihat status pekerjaan (tunggu, tunda, jalankan, selesai).

Grid engine dibuat untuk itu, misalnya, Sun Grid Engine ( http://wiki.gridengine.info/wiki/index.php/Main_Page ) atau Open Grid Scheduler ( http://gridscheduler.sourceforge.net/ ). Anda perlu administrator untuk menginstal perangkat lunak yang tepat sebelum Anda dapat memulai. Administrator mungkin senang melakukannya, daripada melihat ratusan proses berjalan pada mesin, dan tidak memiliki kendali atas mereka.

Secara umum, admin menentukan berapa slot mesin yang dapat dibagi, dan Anda mengirimkan pekerjaan ke antrian dan menentukan berapa slot yang ingin dikonsumsi oleh mesin, mesin grid akan memantau keseluruhan penggunaan sistem, dan menjalankan pekerjaan sesuai dengan kebijakan antrian yang ditentukan oleh admin. mis. tidak lebih dari x pekerjaan dapat berjalan pada saat yang sama, dll. sisa pekerjaan akan berada dalam antrian dalam keadaan menunggu, dan dirilis setelah pekerjaan sebelumnya selesai.



0

Saya telah melakukan ini pada beberapa kesempatan dan biasanya hanya memutar skrip saya sendiri untuk melakukan pekerjaan dengan kontrol pekerjaan. Secara umum, jika Anda memiliki nama semua skrip yang ingin Anda jalankan dalam sebuah file, solusinya seperti:

#!/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

Ini kekuatan kasar, tetapi efektif. Plus Anda tidak perlu perangkat lunak tambahan seperti paralel ditambahkan ke sistem Anda.

Masalah besar adalah bahwa perintah tunggu akan menunggu skrip paling lambat untuk selesai, yang dapat membuang waktu. Saya telah membuat skrip untuk menangani situasi ini, tetapi skrip ini menjadi lebih kompleks seperti yang Anda bayangkan. Jika semua skrip Anda berjalan dalam jumlah waktu yang sama, ini berfungsi dengan baik.

Masalah lain adalah Anda mungkin harus menyetel MAX_PROCS untuk menentukan kinerja terbaik.

Tentu saja, jumlah koneksi ssh bisa menjadi berat. Dalam hal ini, cukup pindahkan skrip ini ke host jarak jauh dan ubah baris "ssh ..." untuk menjalankan skrip secara langsung.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.