Di Gentoo Linux, dimungkinkan untuk mengatur MAKEOPTS
variabel /etc/portage/make.conf
untuk memberi tahu make
berapa banyak pekerjaan yang harus dijalankan secara paralel saat membangun paket. Karena saya memiliki CPU dual-core, saya naif memilih untuk menggunakan -j2
opsi: 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 -j3
opsi. Beberapa dari mereka adalah:
- Buku panduan Gentoo
- Wiki Gentoo
- halaman manual make.conf (5)
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 make
halaman info dan make
penjelasan halaman manual untuk -j
opsi ini, tetapi sepertinya tidak ada jawaban di sana.
Jawaban:
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
-j3
untuk 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 -j2
mungkin sudah lebih lambat dari itumake
. 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).
sumber
-j2
pada sistem saya. Ini karena saya mencoba menginstal keduagcc
danfirefox
dengan pengaturan dari-j1
atas-j5
(untuk total 10 perintah emerge), dan tampaknya sementara-j2
pasti lebih cepat daripada-j1
, tiga pengaturan lainnya setara dengan-j2
.Saya kira ini agak heuristik - memungkinkan
make
untuk memulaiCPUs + 1
proses adalah untuk memastikan bahwa:Tapi, sekali lagi, itu heuristik dan buku pegangan FreeBSD masih merekomendasikan
make -j4
untuk satu CPU.sumber
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.
sumber
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
make
sudah dihitung sehingga-j3
Anda 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 (
-j
tidak 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
-j
Atribut 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!)
sumber