Konnten möglicherweise alle 700 Instanzen gleichzeitig ausgeführt werden?
Das hängt davon ab, was Sie unter gleichzeitig verstehen. Wenn wir wählerisch sind, können sie es nicht, es sei denn, Sie haben 700 Ausführungsthreads auf Ihrem System, die Sie verwenden können (also wahrscheinlich nicht). Realistisch gesehen können sie dies jedoch wahrscheinlich, vorausgesetzt, Sie haben genügend RAM und / oder Swap-Speicherplatz auf dem System. UNIX und seine verschiedenen untergeordneten Betriebssysteme können erstaunlich gut mit enormen Nebenläufigkeiten umgehen. Dies ist einer der Gründe, warum sie für die Verwendung von HPC in großem Maßstab so beliebt sind.
Wie weit könnte ich kommen, bis mein Server sein Limit erreicht?
Dies ist ohne eine ganze Reihe weiterer Informationen nicht konkret zu beantworten. Ziemlich viel, müssen Sie genug Speicher haben, um zu erfüllen:
- Der gesamte Laufzeitspeicherbedarf eines Jobs, mal 700.
- Der Speicherbedarf von bash, um so viele Jobs zu verwalten (bash ist nicht schrecklich, aber die Jobsteuerung ist nicht gerade speichereffizient).
- Alle anderen Speicheranforderungen auf dem System.
Angenommen, Sie treffen dies (auch hier müssen Sie sich mit nur 50 GB RAM noch mit anderen Problemen befassen:
- Wie viel CPU-Zeit wird durch Bash-on-Job-Kontrolle verschwendet? Wahrscheinlich nicht viel, aber mit Hunderten von Arbeitsplätzen könnte es von Bedeutung sein.
- Wie viel Netzwerkbandbreite wird dies benötigen? Das einfache Öffnen all dieser Verbindungen kann je nach Bandbreite und Latenz Ihr Netzwerk für einige Minuten überlasten.
- An viele andere Dinge habe ich wahrscheinlich nicht gedacht.
Wenn diese Grenze erreicht ist, wartet es dann nur noch, bis die nächste Iteration beginnt, oder stürzt die Box ab?
Es kommt darauf an, welches Limit erreicht wird. Wenn es sich um Arbeitsspeicher handelt, stirbt auf dem System etwas ab (genauer gesagt, der Kernel versucht, Speicher freizugeben), oder das System selbst stürzt ab (es ist nicht ungewöhnlich, Systeme so zu konfigurieren, dass sie absichtlich abstürzen, wenn der Arbeitsspeicher knapp wird). Wenn es CPU-Zeit ist, wird es einfach ohne Probleme weitergehen, es wird einfach unmöglich sein, mehr auf dem System zu tun. Wenn es sich jedoch um das Netzwerk handelt, können andere Systeme oder Dienste abstürzen .
Was Sie hier wirklich brauchen, ist, nicht alle Jobs gleichzeitig auszuführen. Teilen Sie sie stattdessen in Stapel auf, und führen Sie alle Jobs innerhalb eines Stapels gleichzeitig aus, lassen Sie sie beenden und starten Sie dann den nächsten Stapel. GNU Parallel ( https://www.gnu.org/software/parallel/ ) kann dafür verwendet werden, ist jedoch in dieser Größenordnung in einer Produktionsumgebung weniger als ideal (wenn Sie damit einverstanden sind, werden Sie nicht zu aggressiv, Wie gesagt, Sie könnten das Netzwerk überfluten und Systeme beeinflussen, die Sie sonst nicht berühren würden. Ich würde wirklich empfehlen, sich ein geeignetes Netzwerk-Orchestrierungs-Tool wie Ansible ( https://www.ansible.com/) anzuschauen.), da dies nicht nur Ihre Nebenläufigkeitsprobleme löst (Ansible führt die Stapelverarbeitung wie oben erwähnt automatisch durch), sondern Ihnen auch viele andere nützliche Funktionen bietet, mit denen Sie arbeiten können (wie idempotente Ausführung von Aufgaben, nette Statusberichte und native Integration mit eine sehr große Anzahl anderer Werkzeuge).
parallel
rund 50 gleichzeitigen Jobs. Es ist ein großartiges Medium zwischen Parallelität von 1 und 700. Die andere nette Sache ist, dass es keinen Stapel gibt. Eine einzelne unterbrochene Verbindung blockiert nur sich selbst, keine der anderen. Der Hauptnachteil ist das Fehlermanagement. Keiner dieser Shell-basierten Ansätze kann mit Fehlern umgehen. Sie müssen den Erfolg manuell überprüfen und Ihre eigenen Versuche unternehmen.