Apakah `make -j` (tanpa argumen) berbahaya? [Tutup]

13

Sebelumnya hari ini ketika membangun sesuatu, saya memutuskan untuk menjalankan makesebagai

$ make -j

mungkin karena kebiasaan dengan program lain seperti cabalmana -jdefault 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/syslogmenceritakan kisah yang berbeda; pembunuh Oom tertinggal beberapa pstempat pembuangan yang curiga dikemas dengan c++dan cc1plusproses!

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 -jdan 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 -jsama berbahayanya dengan saya? Jika demikian, mengapa ada di sana, dan apa yang dapat dilakukan untuk membuktikannya dengan orang bodoh?

Exp HP
sumber
Catatan: Pada pertanyaan terakhir, saya mempertimbangkan untuk menambahkan alias make="make -j4"untuk menghilangkan kebutuhan untuk menambahkan -jNargumen, tapi saya masih belum memikirkan semua konsekuensi yang mungkin terjadi ...
Exp HP
1
Untuk batasan global silakan gunakan makefasilitas sendiri dan lakukan export 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 final make -j128sebelum merilis kernel.
Bananguin

Jawaban:

6

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 -jproyek kecil sangat masuk akal. Dalam proyek lain, menggunakan -jtanpa 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 makeuntuk make -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:

  1. Pelajari cara menggunakan alat Anda.

Perhatikan juga, bahwa -jflag ke BSD make memang memerlukan argumen, dan flag ini adalah non-standar (standar Unix POSIX tidak menyebutkannya).

Kusalananda
sumber
4

Anda juga dapat membatasi penggunaan -l:

-l [load], --load-average [= load] Menentukan bahwa tidak ada pekerjaan baru (perintah) yang harus dimulai jika ada pekerjaan lain yang sedang berjalan dan rata-rata beban setidaknya memuat (angka titik-mengambang). Tanpa argumen, menghapus batas pemuatan sebelumnya.

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.

Zitrax
sumber