Tất cả 700 trường hợp có thể chạy đồng thời?
Điều đó phụ thuộc vào những gì bạn có nghĩa là đồng thời. Nếu chúng ta kén chọn, thì không, họ không thể trừ khi bạn có 700 luồng thực thi trên hệ thống của mình, bạn có thể sử dụng (có lẽ là không). Trên thực tế, vâng, có lẽ họ có thể, miễn là bạn có đủ RAM và / hoặc trao đổi không gian trên hệ thống. UNIX và nhiều trẻ em khác nhau rất giỏi trong việc quản lý mức độ đồng thời rất lớn, đó là một phần lý do tại sao chúng rất phổ biến để sử dụng HPC quy mô lớn.
Tôi có thể đi bao xa cho đến khi máy chủ của tôi đạt đến giới hạn?
Điều này là không thể trả lời cụ thể mà không có nhiều thông tin hơn. Khá nhiều, bạn cần có đủ bộ nhớ để đáp ứng:
- Toàn bộ yêu cầu bộ nhớ thời gian chạy của một công việc, gấp 700 lần.
- Các yêu cầu về bộ nhớ của bash để quản lý nhiều công việc đó (bash không kinh khủng về điều này, nhưng kiểm soát công việc không chính xác là hiệu quả bộ nhớ).
- Bất kỳ yêu cầu bộ nhớ khác trên hệ thống.
Giả sử bạn đáp ứng điều đó (một lần nữa, chỉ với 50GB RAM, bạn vẫn chưa giải quyết được các vấn đề khác:
- Bao nhiêu thời gian CPU sẽ bị lãng phí bởi bash về kiểm soát công việc? Có lẽ không nhiều, nhưng với hàng trăm công việc, nó có thể là đáng kể.
- Cần bao nhiêu băng thông mạng? Chỉ cần mở tất cả các kết nối đó có thể tràn ngập mạng của bạn trong vài phút tùy thuộc vào băng thông và độ trễ của bạn.
- Nhiều thứ khác có lẽ tôi chưa từng nghĩ tới.
Khi đạt đến giới hạn đó, nó sẽ đợi để bắt đầu lần lặp tiếp theo tắt foo hay hộp sẽ sụp đổ?
Nó phụ thuộc vào giới hạn nào được đạt. Nếu là bộ nhớ, một cái gì đó sẽ chết trên hệ thống (cụ thể hơn là bị kernel giết chết trong nỗ lực giải phóng bộ nhớ) hoặc chính hệ thống có thể gặp sự cố (không có gì bất thường khi cấu hình các hệ thống cố tình gặp sự cố khi hết bộ nhớ). Nếu đó là thời gian CPU, nó sẽ tiếp tục hoạt động mà không gặp vấn đề gì, sẽ không thể làm gì khác trên hệ thống. Nếu đó là mạng, bạn có thể gặp sự cố với các hệ thống hoặc dịch vụ khác.
Điều bạn thực sự cần ở đây không phải là điều hành tất cả các công việc cùng một lúc. Thay vào đó, hãy chia chúng thành các đợt và chạy tất cả các công việc trong một đợt cùng một lúc, để chúng kết thúc, sau đó bắt đầu đợt tiếp theo. GNU Parallel ( https://www.gnu.org/software/abul/ ) có thể được sử dụng cho việc này, nhưng nó không lý tưởng ở quy mô đó trong môi trường sản xuất (nếu bạn đi theo nó, đừng quá tích cực, như tôi đã nói, bạn có thể tràn vào mạng và ảnh hưởng đến các hệ thống mà bạn không thể chạm vào). Tôi thực sự khuyên bạn nên xem xét một công cụ điều phối mạng thích hợp như Ansible ( https://www.ansible.com/), vì điều đó sẽ không chỉ giải quyết các vấn đề tương tranh của bạn (Ansible thực hiện theo đợt như tôi đã đề cập ở trên), mà còn cung cấp cho bạn rất nhiều tính năng hữu ích khác để làm việc (như thực thi các nhiệm vụ, báo cáo trạng thái đẹp và tích hợp riêng với một số lượng rất lớn các công cụ khác).
parallel
, sử dụng khoảng 50 công việc đồng thời. Đó là một phương tiện tuyệt vời giữa song song 1 và 700. Một điều tuyệt vời khác là không có lô. Một kết nối bị đình trệ duy nhất sẽ chỉ bị đình trệ, không phải bất kỳ kết nối nào khác. Nhược điểm chính là quản lý lỗi. Không có cách tiếp cận dựa trên vỏ nào sẽ xử lý lỗi một cách duyên dáng. Bạn sẽ phải tự kiểm tra thành công và tự mình thử lại.