Mungkinkah ke-700 instance tersebut dapat berjalan secara bersamaan?
Itu tergantung pada apa yang Anda maksudkan secara bersamaan. Jika kita pilih-pilih, maka tidak, mereka tidak bisa kecuali Anda memiliki 700 utas eksekusi pada sistem Anda yang dapat Anda manfaatkan (jadi mungkin tidak). Secara realistis, ya, mereka mungkin bisa, asalkan Anda memiliki cukup RAM dan / atau ruang swap pada sistem. UNIX dan beragam anak-anak sangat pandai mengelola tingkat konkurensi yang sangat besar, itulah sebabnya mereka sangat populer untuk penggunaan HPC skala besar.
Seberapa jauh saya bisa sampai server saya mencapai batasnya?
Ini tidak mungkin untuk menjawab secara konkret tanpa info lebih lanjut. Cukup banyak, Anda perlu memiliki cukup memori untuk bertemu:
- Seluruh persyaratan run-time memory dari satu pekerjaan, kali 700.
- Persyaratan memori bash untuk mengelola banyak pekerjaan itu (bash tidak mengerikan tentang hal ini, tetapi kontrol pekerjaan tidak sepenuhnya efisien dalam memori).
- Persyaratan memori lain pada sistem.
Dengan asumsi Anda memenuhi itu (sekali lagi, dengan hanya 50GB RAM, Anda masih harus berurusan dengan masalah lain:
- Berapa banyak waktu CPU yang akan terbuang oleh bash pada kontrol pekerjaan? Mungkin tidak banyak, tetapi dengan ratusan pekerjaan, itu bisa jadi signifikan.
- Berapa banyak bandwidth jaringan yang dibutuhkan? Hanya dengan membuka semua koneksi itu dapat membanjiri jaringan Anda selama beberapa menit tergantung pada bandwidth dan latensi Anda.
- Banyak hal lain yang mungkin belum saya pikirkan.
Ketika batas itu tercapai, apakah hanya menunggu untuk memulai iterasi berikutnya dari foo atau kotak akan crash?
Itu tergantung pada batas apa yang kena. Jika memori, sesuatu akan mati pada sistem (lebih khusus, terbunuh oleh kernel dalam upaya untuk membebaskan memori) atau sistem itu sendiri dapat crash (itu tidak biasa untuk mengkonfigurasi sistem untuk sengaja crash ketika kehabisan memori). Jika waktu CPU, itu hanya akan terus tanpa masalah, itu tidak mungkin untuk melakukan banyak hal lain pada sistem. Jika itu meskipun jaringan, Anda mungkin crash lainnya sistem atau jasa.
Apa yang benar - benar Anda butuhkan di sini bukan untuk menjalankan semua pekerjaan pada saat yang sama. Alih-alih, bagi menjadi beberapa kelompok, dan jalankan semua pekerjaan dalam satu batch pada saat yang bersamaan, biarkan selesai, kemudian mulai batch berikutnya. GNU Parallel ( https://www.gnu.org/software/parallel/ ) dapat digunakan untuk ini, tetapi kurang ideal pada skala itu dalam lingkungan produksi (jika Anda menggunakannya, jangan terlalu agresif, seperti yang saya katakan, Anda mungkin membanjiri jaringan dan memengaruhi sistem yang tidak akan Anda sentuh). Saya benar-benar akan merekomendasikan melihat ke alat orkestrasi jaringan yang tepat seperti Ansible ( https://www.ansible.com/), karena itu tidak hanya akan menyelesaikan masalah konkurensi Anda (Anonim tidak batching seperti yang saya sebutkan di atas secara otomatis), tetapi juga memberi Anda banyak fitur berguna lainnya untuk bekerja dengan (seperti pelaksanaan tugas idempoten, laporan status yang bagus, dan integrasi asli dengan sejumlah besar alat lainnya).
parallel
, menggunakan sekitar 50 pekerjaan bersamaan. Ini adalah media yang bagus antara paralelisme 1 dan 700. Yang menyenangkan lainnya adalah batchless. Satu koneksi yang terhenti hanya akan terhenti dengan sendirinya, bukan yang lain. Kelemahan utama adalah manajemen kesalahan. Tidak satu pun dari pendekatan berbasis shell ini yang dapat menangani kesalahan dengan anggun. Anda harus memeriksa sendiri keberhasilannya secara manual, dan lakukan percobaan sendiri.