GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara menentukan jumlah maksimum yang akan dilewati untuk opsi make -j?

nproc memberikan jumlah inti/utas CPU yang tersedia, mis. 8 pada CPU quad-core yang mendukung SMT dua arah.

Jumlah tugas yang dapat Anda jalankan secara paralel dengan make menggunakan -j opsi bergantung pada sejumlah faktor:

  • jumlah memori yang tersedia
  • jumlah memori yang digunakan oleh setiap make pekerjaan
  • sejauh mana make pekerjaan terikat I/O- atau CPU

make -j$(nproc) adalah tempat yang layak untuk memulai, tetapi Anda biasanya dapat menggunakan nilai yang lebih tinggi, selama Anda tidak menghabiskan memori yang tersedia dan mulai meronta-ronta.

Untuk build yang sangat cepat, jika Anda memiliki cukup memori, saya sarankan menggunakan tmpfs , dengan begitu sebagian besar pekerjaan akan terikat dengan CPU dan make -j$(nproc) akan bekerja secepat mungkin.


Cara yang paling mudah adalah dengan menggunakan nproc seperti itu:

make -j`nproc`

Perintah nproc akan mengembalikan jumlah inti pada mesin Anda. Dengan membungkusnya dengan kutu, nproc perintah akan dijalankan terlebih dahulu, kembalikan nomor dan nomor itu akan diteruskan ke make .

Anda mungkin memiliki beberapa pengalaman anekdot di mana melakukan penghitungan inti + 1 menghasilkan waktu kompilasi yang lebih cepat. Ini lebih berkaitan dengan faktor-faktor seperti penundaan I/O, penundaan sumber daya lainnya, dan ketersediaan kendala sumber daya lainnya.

Untuk melakukannya dengan nproc+1 , coba ini:

make -j$((`nproc`+1))

Sayangnya, bahkan bagian yang berbeda dari bangunan yang sama mungkin optimal dengan nilai faktor j yang bertentangan, tergantung pada apa yang sedang dibangun, bagaimana, sumber daya sistem mana yang menjadi penghambat saat itu, apa lagi yang terjadi pada mesin pembuat, apa yang terjadi di jaringan (jika menggunakan teknik build terdistribusi), status/lokasi/kinerja dari banyak sistem caching yang terlibat dalam build, dll.

Mengkompilasi 100 file C kecil mungkin lebih cepat daripada mengkompilasi satu file besar, atau sebaliknya. Membuat kode kecil yang sangat berbelit-belit bisa lebih lambat daripada membuat kode langsung/linear dalam jumlah besar.

Bahkan konteks build itu penting - menggunakan faktor j yang dioptimalkan untuk build di server khusus yang disetel dengan baik untuk build eksklusif yang tidak tumpang tindih dapat menghasilkan hasil yang sangat mengecewakan bila digunakan oleh pengembang yang membangun secara paralel di server bersama yang sama (masing-masing build tersebut mungkin membutuhkan lebih banyak waktu dari semuanya digabungkan jika diserialisasi) atau di server dengan konfigurasi perangkat keras yang berbeda atau divirtualisasi.

Ada juga aspek kebenaran spesifikasi build. Build yang sangat kompleks mungkin memiliki race condition yang menyebabkan kegagalan build intermiten dengan tingkat kejadian yang dapat sangat bervariasi dengan peningkatan atau penurunan faktor j.

Saya bisa terus dan terus. Intinya adalah Anda harus benar-benar mengevaluasi Anda bangun dalam konteks Anda yang Anda ingin faktor j dioptimalkan. Komentar @Jeff Schaller berlaku:ulangi sampai Anda menemukan yang paling cocok. Secara pribadi saya akan mulai dari nproc nilai, coba ke atas dulu dan ke bawah hanya jika upaya ke atas menunjukkan degradasi langsung.

Mungkin merupakan ide yang baik untuk terlebih dahulu mengukur beberapa build identik dalam konteks yang seharusnya identik hanya untuk mendapatkan gambaran tentang variabilitas pengukuran Anda - jika terlalu tinggi dapat membahayakan seluruh upaya pengoptimalan Anda (variabilitas 20% akan sepenuhnya melampaui peningkatan 10%/ pembacaan degradasi dalam pencarian faktor j).

Terakhir, IMHO lebih baik menggunakan server kerja (adaptif) jika didukung dan tersedia daripada faktor j tetap - secara konsisten memberikan kinerja pembangunan yang lebih baik di rentang konteks yang lebih luas.


Linux
  1. Bagaimana Menemukan Jumlah Garis Vertikal Yang Tersedia Di Terminal?

  2. Linux – Bagaimana Cara Menentukan Modul Yang Menodai Kernel?

  3. Bagaimana Cara Membuat Gpg-agent Lupakan Passphrase Secara Otomatis?

  1. Bagaimana Cara Membuat Ubuntu Terkunci?

  2. Bagaimana cara mendapatkan jumlah CPU di Linux menggunakan C?

  3. Bagaimana cara menemukan ukuran tumpukan maksimum?

  1. Cara Membuat Sudo Mengingat Kata Sandi Lebih Lama

  2. Bagaimana cara menentukan apakah sistem file peka terhadap huruf besar-kecil di .net?

  3. cara menentukan direktori target unzip