Sebelumnya hari ini ketika membangun sesuatu, saya memutuskan untuk menjalankan make
sebagai
$ make -j
mungkin karena kebiasaan dengan program lain seperti cabal
mana -j
default untuk batas yang wajar.
Sekitar 20 detik kemudian, seluruh desktop saya terhenti . Saya mencari berbagai tanda aktivitas. Tidak ada penggemar yang berputar. Lampu HDD berwarna hijau solid, tapi saya tidak mendengar aktivitas disk. Hmmmmm Setelah 10 menit hening, saya akhirnya melihat respons terhadap penekanan tombol pertama yang saya buat berabad-abad yang lalu, dan saya juga mulai mendengar suara yang terlalu akrab dari hard disk. 20 menit kemudian dengan perlahan mencoba mengarungi jalan saya ke terminal pada mesin yang tidak responsif ini, saya menyerah dan menggunakan REISUB.
Pada awalnya, saya pikir aplikasi desktop yang tidak terkait pasti pelakunya, karena saya sudah lama memiliki batas memori yang ditempatkan pada sesi bash interaktif untuk mencegah saya menempatkan diri saya ke dalam situasi seperti ini! Tetapi /var/log/syslog
menceritakan kisah yang berbeda; pembunuh Oom tertinggal beberapa ps
tempat pembuangan yang curiga dikemas dengan c++
dan cc1plus
proses!
Berikut ini adalah analisis frekuensi dari salah satu dump tersebut:
Command Number of appearances
'sh' 322
'c++' 321
'cc1plus' 321
'chrome' 27
'make' 27
'bash' 3
all else combined 120
Jadi saya memeriksa halaman manual untuk GNU make: (penekanan ditambahkan)
-j [pekerjaan], --jobs [= pekerjaan] Menentukan jumlah pekerjaan (perintah) untuk dijalankan secara bersamaan. Jika ada lebih dari satu opsi -j, yang terakhir efektif. Jika opsi -j diberikan tanpa argumen, make tidak akan membatasi jumlah pekerjaan yang dapat dijalankan secara bersamaan.
Saya enggan untuk melihat apakah saya dapat mereproduksi masalah (Dokter, itu menyakitkan ketika saya melakukan ini ...) , tetapi hasil penyelidikan sejauh ini tampaknya menjadi home run: Jelas, make -j
dan ratusan proses yang dihasilkan harus memiliki menjadi penyebab hang dan disk meronta-ronta. Yang mengatakan, mencari di internet, saya tidak dapat menemukan banyak peringatan terhadapnya. Apakah saya langsung mengambil kesimpulan?
Apakah make -j
sama berbahayanya dengan saya? Jika demikian, mengapa ada di sana, dan apa yang dapat dilakukan untuk membuktikannya dengan orang bodoh?
sumber
alias make="make -j4"
untuk menghilangkan kebutuhan untuk menambahkan-jN
argumen, tapi saya masih belum memikirkan semua konsekuensi yang mungkin terjadi ...make
fasilitas sendiri dan lakukanexport MAKEFLAGS="-j 4"
. Untuk penyelidikan lebih lanjut saya sarankan membaca sebelum mengetik . PS: <jumlah core> + 2 telah melayani saya dengan baik selama hampir dua dekade sekarang. Kembali pada hari itu, Linus melakukan finalmake -j128
sebelum merilis kernel.Jawaban:
Ada alat yang memungkinkan Anda menembak diri sendiri dengan banyak cara imajinatif. Ini agar Anda dapat menggunakan imajinasi Anda untuk menyelesaikan masalah tanpa dibatasi oleh apa yang orang lain anggap "waras".
Menjalankan
make -j
proyek kecil sangat masuk akal. Dalam proyek lain, menggunakan-j
tanpa argumen akan melemahkan respons sistem secara serius. Dalam beberapa proyek, menggunakan build paralel, bahkan dengan-j2
, akan menghancurkan build sepenuhnya (file yang dibuat oleh proses make paralel tidak ada pada waktunya untuk yang lain dll.).Saya pribadi akan menghindari alias
make
untukmake -j4
(seperti yang Anda katakan Anda sedang mempertimbangkan, dalam komentar). Saya menemukan bahwa lebih baik untuk secara eksplisit memberi tahu mesin apa yang harus dilakukan, sehingga saya tahu apa yang akan dilakukan. Dalam beberapa hari, saya akan lupa tentang itu alias, dan bertanya-tanya mengapa empat proyek yang saya bangun di terminal terpisah membuat sistem saya tidak responsif.Adapun "berbahaya" ... Kata itu berarti hal yang berbeda dalam konteks yang berbeda. Ya, "berbahaya" karena dapat membuat sistem tidak responsif. Ya, ini "berbahaya" karena mungkin akan merusak proses pembangunan setengah jalan. Tapi tidak, itu tidak "berbahaya" dalam arti bahwa itu akan memformat ulang hard drive Anda atau mulai menghapus file acak.
Jadi, bagaimana cara idiot-proof itu?
Berikut panduan langkah demi langkah yang pasti:
Perhatikan juga, bahwa
-j
flag ke BSDmake
memang memerlukan argumen, dan flag ini adalah non-standar (standar Unix POSIX tidak menyebutkannya).sumber
Anda juga dapat membatasi penggunaan
-l
:Tapi catatan bahwa ia tampaknya tidak membantu untuk menjalankannya seperti ini:
make -j -l4
.Terlalu banyak pekerjaan yang dimulai sebelum rata-rata beban melebihi batas (berdasarkan pengalaman saya). Dengan demikian kombinasi dapat bekerja, mis
make -j8 -l4
.sumber