Могут ли все 700 экземпляров работать одновременно?
Это зависит от того, что вы подразумеваете под одновременно. Если мы привередливы, то нет, они не смогут, если у вас в системе не будет 700 потоков выполнения, которые вы можете использовать (так что, вероятно, нет). Реально, хотя, да, они, вероятно, могут, если у вас достаточно оперативной памяти и / или пространства подкачки в системе. UNIX и его различные дети замечательно хороши в управлении огромными уровнями параллелизма, поэтому они так популярны для крупномасштабного использования высокопроизводительных вычислений.
Как далеко я могу пройти, пока мой сервер не достигнет своего предела?
На это невозможно ответить конкретно, не имея намного больше информации. В общем, вам нужно иметь достаточно памяти, чтобы встретиться:
- Все требования к памяти во время выполнения одной работы, раз 700.
- Требования к памяти bash для управления таким количеством заданий (bash не так уж и страшен, но управление заданиями не совсем эффективно использует память).
- Любые другие требования к памяти в системе.
Предполагая, что вы встречаете это (опять же, только с 50 ГБ ОЗУ, вы все равно должны иметь дело с другими проблемами:
- Сколько процессорного времени будет потрачено bash на управление заданиями? Вероятно, не так много, но с сотнями рабочих мест, это может быть значительным.
- Какая пропускная способность сети потребуется? Простое открытие всех этих подключений может затопить вашу сеть на пару минут в зависимости от вашей пропускной способности и задержки.
- Многие другие вещи, о которых я, вероятно, не подумали.
Когда этот лимит будет достигнут, будет ли он ждать начала следующей итерации с foo, или произойдет сбой коробки?
Это зависит от того, какой предел достигнут. Если это память, что-то умирает в системе (точнее, убивается ядром при попытке освободить память), или сама система может аварийно завершить работу (нет ничего необычного в том, чтобы настроить системы на преднамеренное падение при исчерпании памяти). Если это процессорное время, оно будет продолжать работать без проблем, просто невозможно будет многое сделать в системе. Если это сеть, вы можете привести к сбою других систем или служб.
Что вам действительно нужно, так это не запускать все задания одновременно. Вместо этого разделите их на пакеты и запустите все задания в пакете одновременно, дайте им закончить, а затем запустите следующий пакет. Для этого можно использовать GNU Parallel ( https://www.gnu.org/software/parallel/ ), но он менее чем идеален в таких масштабах в производственной среде (если вы используете его, не становитесь слишком агрессивными, как я уже сказал, вы можете затопить сеть и повлиять на системы, которые иначе вы бы не затронули). Я действительно рекомендовал бы поискать подходящий инструмент сетевой оркестровки, такой как Ansible ( https://www.ansible.com/), поскольку это не только решит ваши проблемы параллелизма (Ansible автоматически выполняет пакетирование, как я уже упоминал выше), но и предоставит вам множество других полезных функций (например, идемпотентное выполнение задач, хорошие отчеты о состоянии и встроенная интеграция с очень большое количество других инструментов).
parallel
, используя около 50 одновременных заданий. Это отличная середина между параллелизмом от 1 до 700. Еще одна приятная вещь - это то, что она не имеет партии. Одно остановленное соединение остановится только само по себе, а не любое другое. Основным недостатком является управление ошибками. Ни один из этих подходов на основе оболочки не будет корректно обрабатывать ошибки. Вам придется самостоятельно проверять успешность и делать свои собственные повторные попытки.