Tutte le 700 istanze potrebbero essere eseguite contemporaneamente?
Dipende da cosa intendi contemporaneamente. Se siamo pignoli, allora no, non possono farlo a meno che tu non abbia 700 thread di esecuzione sul tuo sistema che puoi utilizzare (quindi probabilmente no). Realisticamente, sì, probabilmente lo possono, a condizione che tu abbia abbastanza RAM e / o spazio di swap sul sistema. UNIX ed i suoi vari figli sono straordinariamente bravi a gestire enormi livelli di concorrenza, questo è uno dei motivi per cui sono così popolari per l'uso su larga scala dell'HPC.
Quanto lontano potrei arrivare fino a quando il mio server non raggiunge il limite?
È impossibile rispondere concretamente senza molte più informazioni. Praticamente, è necessario disporre di memoria sufficiente per soddisfare:
- L'intero fabbisogno di memoria di runtime di un lavoro, per 700.
- I requisiti di memoria di bash per gestire molti lavori (bash non è orribile al riguardo, ma il controllo dei lavori non è esattamente efficiente in termini di memoria).
- Eventuali altri requisiti di memoria sul sistema.
Supponendo che lo soddisfi (di nuovo, con solo 50 GB di RAM, devi ancora affrontare altri problemi:
- Quanto tempo della CPU sarà sprecato da bash sul controllo del lavoro? Probabilmente non molto, ma con centinaia di posti di lavoro, potrebbe essere significativo.
- Di quanta larghezza di banda di rete avrà bisogno? L'apertura di tutte queste connessioni potrebbe inondare la rete per un paio di minuti a seconda della larghezza di banda e della latenza.
- Molte altre cose a cui probabilmente non ho pensato.
Quando viene raggiunto quel limite, aspetterà solo di iniziare la prossima iterazione al largo o la scatola andrà in crash?
Dipende da quale limite viene raggiunto. Se è memoria, qualcosa morirà sul sistema (in particolare, verrà ucciso dal kernel nel tentativo di liberare memoria) o il sistema stesso potrebbe arrestarsi in modo anomalo (non è insolito configurare i sistemi affinché si arrestino intenzionalmente quando si esaurisce la memoria). Se è il tempo della CPU, continuerà senza problemi, sarà impossibile fare molto altro sul sistema. Se si tratta della rete, è possibile che si verifichino arresti anomali di altri sistemi o servizi.
Ciò di cui hai davvero bisogno qui non è eseguire tutti i lavori contemporaneamente. Invece, dividerli in batch ed eseguire tutti i lavori all'interno di un batch contemporaneamente, lasciarli finire, quindi avviare il batch successivo. GNU Parallel ( https://www.gnu.org/software/parallel/ ) può essere usato per questo, ma è meno che ideale a quella scala in un ambiente di produzione (se ci vai, non diventare troppo aggressivo, come ho detto, potresti inondare la rete e influire su sistemi che altrimenti non toccheresti). Consiglio vivamente di esaminare uno strumento di orchestrazione di rete adeguato come Ansible ( https://www.ansible.com/), poiché ciò non solo risolverà i tuoi problemi di concorrenza (Ansible esegue il batch come ho già menzionato automaticamente), ma ti fornirà anche molte altre utili funzionalità con cui lavorare (come l'esecuzione idempotente di attività, bei report di stato e integrazione nativa con un gran numero di altri strumenti).
parallel
, usando circa 50 lavori simultanei. È un ottimo mezzo tra il parallelismo di 1 e 700. L'altra cosa bella è che è senza batch. Una singola connessione bloccata si bloccherà solo se stessa, non nessuna delle altre. Il principale svantaggio è la gestione degli errori. Nessuno di questi approcci basati su shell gestirà con grazia errori. Dovrai controllare manualmente il successo da solo e fare i tuoi tentativi.