所有700个实例能否同时运行?
这取决于您同时表示的意思。如果我们很挑剔,那么不会,除非您可以在系统上使用700个执行线程(否则可能无法使用),否则它们就不会。但是实际上,是的,只要您在系统上有足够的RAM和/或交换空间,它们就可以。UNIX及其各种子类非常擅长管理大量的并发性,这就是为什么它们在大规模HPC使用中如此受欢迎的部分原因。
在服务器达到极限之前,我能走多远?
没有大量更多信息,这是无法具体回答的。几乎,您需要有足够的内存来满足:
- 一个作业的整个运行时内存需求乘以700。
- bash管理这么多作业的内存需求(bash对此并不可怕,但是作业控制并不是完全有效的内存)。
- 系统上的任何其他内存要求。
假设您遇到了这种情况(同样,只有50GB的RAM,您仍然需要处理其他问题:
- bash在作业控制上将浪费多少CPU时间?可能不多,但有数百个工作岗位,这可能意义重大。
- 这将需要多少网络带宽?仅打开所有这些连接可能会淹没您的网络几分钟,具体取决于您的带宽和延迟。
- 我可能没有想到的许多其他事情。
当达到该限制时,它是否会等待从foo开始下一次迭代,否则盒子会崩溃?
这取决于达到什么极限。如果是内存,则会在系统上死机(更具体地说,是为了释放内存而被内核杀死),或者系统本身可能崩溃(将系统配置为在内存不足时有意崩溃的情况并不少见)。如果是CPU时间,它将一直没有问题,就不可能在系统上做很多其他事情。如果是网络,则可能会使其他系统或服务崩溃。
您真正需要的是不要同时运行所有作业。而是将它们拆分为多个批次,并同时运行一个批次中的所有作业,让它们完成,然后开始下一个批次。GNU Parallel(https://www.gnu.org/software/parallel/)可以用于此目的,但是在生产环境中达到这个规模时,它并不理想(如果您愿意,不要太激进,就像我说的那样,您可能会淹没网络并影响系统,否则您将无法接触到)。我真的建议您研究像Ansible(https://www.ansible.com/),因为它不仅可以解决您的并发问题(Ansible会像我上面提到的那样自动进行批处理),而且还为您提供了许多其他有用的功能(例如任务的幂等执行,良好的状态报告以及与之的本机集成)大量其他工具)。
parallel
,使用了大约50个并发工作。这是介于1和700之间的并行度的绝佳媒介。另一个不错的是,它是无批次的。单个停止的连接只会停止自身,而不会停止其他任何连接。主要缺点是错误管理。这些基于shell的方法都无法正常处理错误。您必须自己手动检查是否成功,然后重试。