¿Podrían todas las 700 instancias ejecutarse simultáneamente?
Eso depende de lo que quieras decir al mismo tiempo Si estamos siendo exigentes, entonces no, no pueden a menos que tenga 700 hilos de ejecución en su sistema que pueda utilizar (probablemente no). De manera realista, sí, probablemente puedan, siempre que tenga suficiente RAM y / o espacio de intercambio en el sistema. UNIX y sus diversos niños son notablemente buenos en la gestión de grandes niveles de concurrencia, eso es parte de por qué son tan populares para el uso de HPC a gran escala.
¿Hasta dónde podría llegar hasta que mi servidor alcance su límite?
Esto es imposible de responder concretamente sin mucha más información. Más o menos, necesitas tener suficiente memoria para cumplir:
- Los requisitos de memoria de tiempo de ejecución completo de un trabajo, multiplicado por 700.
- Los requisitos de memoria de bash para administrar tantos trabajos (bash no es horrible sobre esto, pero el control del trabajo no es exactamente eficiente en memoria).
- Cualquier otro requisito de memoria en el sistema.
Suponiendo que cumple con eso (nuevamente, con solo 50 GB de RAM, todavía tiene que lidiar con otros problemas:
- ¿Cuánto tiempo de CPU perderá bash en el control del trabajo? Probablemente no mucho, pero con cientos de trabajos, podría ser significativo.
- ¿Cuánto ancho de banda de red va a necesitar esto? Solo abrir todas esas conexiones puede inundar su red durante un par de minutos, dependiendo de su ancho de banda y latencia.
- Probablemente no haya pensado en muchas otras cosas.
Cuando se alcanza ese límite, ¿esperará para comenzar la próxima iteración o la caja se estrellará?
Depende de qué límite se alcanza. Si se trata de memoria, algo morirá en el sistema (más específicamente, el núcleo lo matará en un intento de liberar memoria) o el sistema en sí puede fallar (no es inusual configurar sistemas para que se bloqueen intencionalmente cuando se está quedando sin memoria). Si es tiempo de CPU, continuará sin problemas, será imposible hacer mucho más en el sistema. Sin embargo, si se trata de la red, podría bloquear otros sistemas o servicios.
Lo que realmente necesita aquí es no ejecutar todos los trabajos al mismo tiempo. En su lugar, divídalos en lotes y ejecute todos los trabajos dentro de un lote al mismo tiempo, déjelos terminar y luego comience el siguiente lote. Para esto se puede usar GNU Parallel ( https://www.gnu.org/software/parallel/ ), pero es menos que ideal a esa escala en un entorno de producción (si lo utiliza, no se ponga demasiado agresivo, como dije, podría inundar la red y afectar los sistemas que de otro modo no estaría tocando). Realmente recomendaría buscar una herramienta de orquestación de red adecuada como Ansible ( https://www.ansible.com/), ya que eso no solo resolverá sus problemas de concurrencia (Ansible procesa por lotes como mencioné anteriormente de forma automática), sino que también le brinda muchas otras características útiles para trabajar (como la ejecución idempotente de tareas, buenos informes de estado e integración nativa con una gran cantidad de otras herramientas).
parallel
uso de alrededor de 50 trabajos simultáneos. Es un gran medio entre el paralelismo de 1 y 700. La otra cosa buena es que no tiene lotes. Una sola conexión bloqueada solo se bloqueará sola, no ninguna de las otras. El principal inconveniente es la gestión de errores. Ninguno de estos enfoques basados en shell manejará con gracia los errores. Tendrá que verificar manualmente el éxito usted mismo y hacer sus propios reintentos.