Czy wszystkie 700 instancji może działać jednocześnie?
To zależy od tego, co masz na myśli jednocześnie. Jeśli jesteśmy wybredni, to nie, nie mogą, chyba że masz 700 wątków wykonania w swoim systemie, z których możesz skorzystać (więc prawdopodobnie nie). Realistycznie jednak tak, prawdopodobnie mogą, pod warunkiem, że masz wystarczającą ilość pamięci RAM i / lub miejsca wymiany w systemie. UNIX i jego różnorodne dzieci są wyjątkowo dobre w zarządzaniu ogromnymi poziomami współbieżności, dlatego właśnie są tak popularne w przypadku HPC na dużą skalę.
Jak daleko mogę dotrzeć, dopóki mój serwer nie osiągnie limitu?
Niemożliwe jest udzielenie konkretnej odpowiedzi bez wielu dodatkowych informacji. Prawie musisz mieć wystarczającą ilość pamięci, aby sprostać:
- Wymagania dotyczące pamięci całego zadania dla jednego zadania, razy 700.
- Wymagania pamięci bash do zarządzania tak wieloma zadaniami (bash nie jest w tym okropny, ale kontrola zadań nie jest dokładnie wydajna pod względem pamięci).
- Wszelkie inne wymagania dotyczące pamięci w systemie.
Zakładając, że się z tym spotkałeś (ponownie, mając tylko 50 GB pamięci RAM, nadal masz do czynienia z innymi problemami:
- Ile czasu procesora zmarnuje bash podczas kontroli zadań? Prawdopodobnie niewiele, ale przy setkach miejsc pracy może to być znaczące.
- Jaka będzie potrzebna przepustowość sieci? Samo otwarcie wszystkich tych połączeń może zalać sieć na kilka minut, w zależności od przepustowości i opóźnień.
- Wiele innych rzeczy, o których prawdopodobnie nie myślałem.
Czy po osiągnięciu tego limitu zaczeka tylko na następną iterację od foo, czy też nastąpi awaria skrzynki?
To zależy od tego, jaki limit zostanie osiągnięty. Jeśli jest to pamięć, coś umrze w systemie (a dokładniej, zostanie zabity przez jądro w celu zwolnienia pamięci) lub sam system może ulec awarii (nie jest niczym niezwykłym konfigurowanie systemów do celowego awarii, gdy kończy się pamięć). Jeśli jest czas na procesor, po prostu będzie działał bez problemu, po prostu nie będzie można zrobić wiele więcej w systemie. Jeśli jest to sieć, możesz zawiesić inne systemy lub usługi.
To, czego naprawdę potrzebujesz, to nie jednoczesne uruchamianie wszystkich zadań. Zamiast tego podziel je na partie i uruchom jednocześnie wszystkie zadania w ramach partii, pozwól im zakończyć, a następnie rozpocznij kolejną. Można do tego wykorzystać GNU Parallel ( https://www.gnu.org/software/parallel/ ), ale w środowisku produkcyjnym jest mniej niż idealne na taką skalę (jeśli pójdziesz z tym, nie bądź zbyt agresywny, jak powiedziałem, możesz zalać sieć i wpłynąć na systemy, których inaczej byś nie dotknął). Naprawdę poleciłbym zajrzeć do odpowiedniego narzędzia do aranżacji sieci, takiego jak Ansible ( https://www.ansible.com/), ponieważ nie tylko rozwiąże to problemy z współbieżnością (Ansible wykonuje wsadowanie, jak wspomniano powyżej automatycznie), ale także zapewni wiele innych przydatnych funkcji do pracy (takich jak idempotentne wykonywanie zadań, ładne raporty o stanie i natywna integracja z bardzo duża liczba innych narzędzi).
parallel
, korzystając z około 50 równoczesnych zadań. Jest to świetne medium między równoległością 1 i 700. Inną miłą rzeczą jest to, że nie ma partii. Pojedyncze zablokowane połączenie utknie tylko samo, a nie inne. Główną wadą jest zarządzanie błędami. Żadne z tych podejść opartych na powłoce z wdziękiem nie obsłuży błędów. Będziesz musiał samodzielnie sprawdzić sukces i wykonać własne próby.