Чи можуть всі 700 екземплярів працювати одночасно?
Це залежить від того, що ви маєте на увазі одночасно. Якщо ми вибагливі, то ні, вони не можуть, якщо у вас не буде 700 потоків виконання у вашій системі, які ви можете використовувати (так, мабуть, ні). Однак реально, так, вони, ймовірно, можуть, за умови, що у вас достатньо оперативної пам’яті та / або поміняти місцями в системі. UNIX та різні діти надзвичайно добре керують величезними рівнями одночасності, ось чому вони так популярні для широкомасштабного використання HPC.
Як далеко я можу дістатись, поки мій сервер не досягне межі?
На це неможливо відповісти конкретно без набору більшої кількості інформації. Досить багато, вам потрібно мати достатньо пам’яті, щоб зустрітися:
- Цілі вимоги до пам’яті під час виконання одного завдання, разів 700.
- Вимоги пам'яті bash для управління багатьма робочими завданнями (bash не жахливо з цього приводу, але управління роботою не є точно ефективною пам'яттю).
- Будь-які інші вимоги до пам'яті в системі.
Якщо припустити, що ви зустрінетесь (знову ж таки, маючи лише 50 Гб оперативної пам’яті, ви все ще вирішуєте інші проблеми:
- Скільки часу процесор буде витрачений на втрату контролю за роботою? Напевно, не багато, але при сотнях робочих місць це може бути значним.
- Скільки для цього потрібно буде пропускна здатність мережі? Просто відкриття всіх цих з'єднань може заграти вашу мережу на пару хвилин, залежно від вашої пропускної здатності та затримки.
- Багато інших речей, які я, певно, не думав.
Коли ця межа буде досягнута, буде лиш чекати, коли розпочнеться наступна ітерація з футу, або вікно зрушиться?
Це залежить від того, яка межа потрапила. Якщо це пам'ять, у системі щось загине (точніше, ядро вбивається в спробі звільнити пам'ять) або сама система може вийти з ладу (незвично конфігурувати системи, щоб навмисно виходити з ладу під час вичерпання пам'яті). Якщо настав час процесора, він буде просто продовжувати без проблем, багато іншого в системі буде неможливо. Якщо це мережа, ви можете зламати інші системи чи служби.
Що вам тут справді потрібно, це не запускати всі завдання одночасно. Натомість розділіть їх на партії та виконайте всі завдання в партії одночасно, нехай вони закінчуються, а потім розпочніть наступну партію. GNU Parallel ( https://www.gnu.org/software/parallel/ ) може бути використаний для цього, але він менш ідеальний в такому масштабі у виробничому середовищі (якщо ви йдете з ним, не будьте занадто агресивними, як я вже говорив, ви можете заграти в мережу і вплинути на системи, яких інакше ви не торкалися б) Я б дуже рекомендував заглянути відповідний інструмент для оркестрування мережі, як Ansible ( https://www.ansible.com/), оскільки це не тільки вирішить ваші проблеми з одночасністю (Ansible робить пакетне, як я вже згадував вище), але і надасть вам безліч інших корисних функцій, з якими можна працювати (наприклад, безвідмовне виконання завдань, приємні звіти про стан та натурна інтеграція з дуже велика кількість інших інструментів).
parallel
, використовуючи близько 50 одночасних робіт. Це чудове середовище між паралелізмом 1 і 700. Інша приємна річ, що це безхмарність. Одиничне зупинене з'єднання буде затримувати лише себе, а не будь-яке інше. Основним недоліком є управління помилками. Жоден із цих підходів на основі оболонок не буде витончено обробляти помилки. Вам доведеться вручну перевірити успіх і зробити власні спроби.