Mengapa orang merekomendasikan opsi -j3 untuk make ketika memiliki CPU dual-core?


18

Di Gentoo Linux, dimungkinkan untuk mengatur MAKEOPTSvariabel /etc/portage/make.confuntuk memberi tahu makeberapa banyak pekerjaan yang harus dijalankan secara paralel saat membangun paket. Karena saya memiliki CPU dual-core, saya naif memilih untuk menggunakan -j2opsi: satu pekerjaan per inti, sehingga keduanya memiliki sesuatu untuk dilakukan. "Masalahnya" adalah ada banyak referensi yang memberi tahu pengguna memiliki CPU dual-core untuk mengatur -j3opsi. Beberapa dari mereka adalah:

Sebagai contoh, buku pegangan Gentoo mengatakan:

Pilihan yang baik adalah jumlah CPU (atau inti CPU) di sistem Anda ditambah satu, tetapi pedoman ini tidak selalu sempurna.

Tapi apa alasan untuk aturan "CPU + 1"? Kenapa harus kerja ekstra?

Halaman manual make.conf (5) bahkan mengatakan:

Pengaturan yang disarankan adalah antara CPU + 1 dan 2 * CPU + 1.

Saya juga membaca bagian 5.4 (Eksekusi Paralel) di makehalaman info dan makepenjelasan halaman manual untuk -jopsi ini, tetapi sepertinya tidak ada jawaban di sana.



Jawaban:


13

Tidak ada aturan sederhana yang selalu berhasil. Orang-orang mungkin merekomendasikan sosok tertentu karena mereka bereksperimen dengan kompilasi tertentu pada mesin tertentu dan ini adalah pengaturan terbaik, atau karena mereka mengikuti beberapa alasan yang mungkin atau mungkin tidak memiliki hubungan dengan kenyataan.

Jika Anda diberkati dengan banyak RAM, maka faktor pembatas dalam kompilasi yang lama adalah waktu CPU. Maka satu tugas per CPU, ditambah satu tugas yang tertunda untuk blok I / O sesekali, adalah pengaturan yang baik. Itu membuatnya -j3untuk CPU dual-core (atau lebih tepatnya, untuk mesin dual-CPU - jika masing-masing core adalah hyperthreaded, itu akan menjadi 4 CPU, jadi -j5).

Jika Anda memiliki RAM yang sangat sedikit, maka faktor pembatasnya adalah Anda tidak dapat memiliki banyak pekerjaan bersamaan, atau mereka akan terus saling menukar. Misalnya, jika Anda tidak dapat dengan nyaman memasukkan dua instance kompiler dalam memori, make -j2mungkin sudah lebih lambat dari itu make. Karena ini tergantung pada berapa banyak proses kompiler yang dapat Anda masukkan dalam RAM sekaligus, tidak ada cara untuk mendapatkan gambaran umum.

Di antaranya, mungkin bermanfaat jika memiliki lebih banyak pekerjaan. Jika setiap proses kompiler kecil, tetapi build secara keseluruhan menyentuh banyak data, maka disk I / O mungkin menjadi faktor pemblokiran. Dalam hal ini, Anda akan menginginkan beberapa pekerjaan per CPU sekaligus, sehingga selalu ada satu pekerjaan menggunakan setiap CPU sementara yang lain menunggu I / O. Sekali lagi, ini sangat tergantung pada pekerjaan yang dibangun dan pada RAM yang tersedia, di sini pada apa yang tersedia untuk cache data (ada yang optimal setelah memiliki terlalu banyak pekerjaan mencemari cache terlalu banyak).


Saya tidak tahu bahwa jika core CPU adalah hyperhreaded, maka masing-masing dihitung sebagai dua. Bagaimanapun, sepertinya CPU saya tidak mendukung Hyper Threading.
Francesco Turco

Saya menerima jawaban ini. Lagi pula saya memilih untuk tetap dengan -j2pada sistem saya. Ini karena saya mencoba menginstal kedua gccdan firefoxdengan pengaturan dari -j1atas -j5(untuk total 10 perintah emerge), dan tampaknya sementara -j2pasti lebih cepat daripada -j1, tiga pengaturan lainnya setara dengan -j2.
Francesco Turco

7

Saya kira ini agak heuristik - memungkinkan makeuntuk memulai CPUs + 1proses adalah untuk memastikan bahwa:

  1. tidak akan ada kesenjangan antara proses pekerja yang baru saja selesai dan pekerja belum berjalan - agak seperti antrian run pra-pengisian.
  2. tidak akan ada terlalu banyak proses bersaing untuk membawa overhead yang terlihat dengan pre-filling run-queue.

Tapi, sekali lagi, itu heuristik dan buku pegangan FreeBSD masih merekomendasikan make -j4 untuk satu CPU.


5

Secara umum, ada alasan untuk memulai lebih banyak pekerjaan daripada jumlah core. Untuk kompilasi C menggunakan gcc, jika -pipe tidak didefinisikan dalam opsi gcc, ia melakukan aksinya (preprocessing, run pertama, optimisasi dan assembly) secara berurutan menggunakan file-file sementara; -pipa mengubah ini menggunakan pipa antara subproses. (Menambahkan -pipe adalah default misalnya untuk FreeBSD tetapi tidak tradisional di Linux.) Jadi, jika Anda memiliki 2 core dan memungkinkan 2 pekerjaan secara paralel, mereka akan menghabiskan waktu di disk I / O. Rekomendasi untuk menambah 1 pekerjaan tampaknya terkait dengan spesifikasi ini. Tetapi untuk mendapatkan jawaban akhir, Anda harus menemukan siapa dan kapan menambahkan rekomendasi ini dan bertanya padanya :) atau bertanya di milis Gentoo devels.


2

Pada dasarnya angka itu adalah apa yang penulis sebut akal sehat. Paling-paling, ini tebakan yang bagus. Sejauh yang saya tahu proses make yang muncul ketika Anda mengetik makesudah dihitung sehingga -j3Anda bisa berakhir dengan proses utama menunggu, sementara dua lainnya sedang menyusun.

Namun, saat saya menggunakan Gentoo, aturan praktisnya adalah <#cpus>*2 + 1.

Semuanya bergantung pada apa yang dikatakan jejak ayam, daun teh, atau bola ajaib Anda tentang disk I / O yang perlu dilakukan dan penjadwalan kernel linux Anda saat ini. [mulai inti posting ini] Dari pengalaman pribadi saya ( -jtidak spesifik untuk Gentoo), semuanya antara #cpus + 1 dan #cpus * 2 +1 menghasilkan hasil yang bagus [akhiri inti posting ini] dan rata-rata Anda tidak akan mencatat perbedaan. Prosesor dan kernel cukup bagus akhir-akhir ini.

TETAPI semua perubahan ini ketika: a) Anda benar-benar menggunakan lebih dari satu kotak untuk mengkompilasi (du'h) atau b) mengembangkan kode Anda sendiri

-jAtribut yang lebih tinggi lebih cenderung menunjukkan dependensi yang sebelumnya tidak diketahui.

Dan di samping catatan: jangan pergi dengan jumlah core, tetapi dengan jumlah stream bersamaan CPU ambil. (Hypertheading!)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.