GNU/Linux >> Belajar Linux >  >> Linux

Apa yang dapat menyebabkan make hang saat mengompilasi pada banyak core?

Saya tidak memiliki jawaban untuk masalah yang tepat ini, tetapi saya dapat mencoba memberi Anda petunjuk tentang apa yang mungkin terjadi:Ketergantungan yang hilang di Makefiles.

Contoh:

target: a.bytecode b.bytecode
    link a.bytecode b.bytecode -o target

a.bytecode: a.source
    compile a.source -o a.bytecode

b.bytecode: b.source
    compile b.source a.bytecode -o a.bytecode

Jika Anda memanggil make target semuanya akan dikompilasi dengan benar. Kompilasi a.source dilakukan (secara sewenang-wenang, tetapi secara deterministik) terlebih dahulu. Kemudian kompilasi b.source dilakukan.

Tetapi jika Anda make -j2 target keduanya compile perintah akan dijalankan secara paralel. Dan Anda akan benar-benar menyadari bahwa dependensi Makefile Anda rusak. Kompilasi kedua mengasumsikan a.bytecode sudah dikompilasi, tetapi tidak muncul di dependensi. Sehingga kemungkinan besar akan terjadi kesalahan. Baris ketergantungan yang benar untuk b.bytecode seharusnya:

b.bytecode: b.source a.bytecode

Untuk kembali ke masalah Anda, jika Anda tidak beruntung, mungkin ada perintah yang menggantung di loop CPU 100%, karena ketergantungan yang hilang. Mungkin itulah yang terjadi di sini, dependensi yang hilang tidak dapat diungkapkan oleh build berurutan, tetapi telah diungkapkan oleh build paralel Anda.


Saya tidak tahu sudah berapa lama Anda memiliki mesin tersebut, tetapi rekomendasi pertama saya adalah mencoba tes memori dan memverifikasi bahwa memori berfungsi dengan baik. Saya tahu sering kali bukan memori yang menjadi masalah, tetapi jika ya, yang terbaik adalah menghilangkannya sebagai penyebab terlebih dahulu sebelum mencoba melacak kemungkinan masalah lainnya.


Saya menyadari ini adalah pertanyaan lama, tetapi masih muncul di bagian atas hasil penelusuran, jadi inilah solusi saya:

GNU make memiliki mekanisme server kerja untuk memastikan make dan turunan rekursifnya tidak menggunakan lebih dari jumlah core yang ditentukan:http://make.mad-scientist.net/papers/jobserver-implementation/

Itu bergantung pada pipa yang digunakan bersama oleh semua proses. Setiap proses yang ingin memotong anak tambahan harus terlebih dahulu mengkonsumsi token dari pipa, lalu melepaskannya setelah selesai. Jika proses turunan tidak mengembalikan token yang digunakannya, make while hang tingkat atas akan menunggu selamanya untuk dikembalikan.

https://bugzilla.redhat.com/show_bug.cgi?id=654822

Saya mengalami kesalahan ini saat membuat binutils dengan GNU make di kotak Solaris saya, di mana "sed" bukan GNU sed. Mengotak-atik PATH untuk membuat sed==gsed diprioritaskan daripada sistem sed memperbaiki masalah. Saya tidak tahu mengapa sed mengonsumsi token dari pipa.


Linux
  1. Linux – Apa yang Dapat Membuat Linux Tidak Responsif Selama Beberapa Menit Saat Menjelajahi Situs Web Tertentu?

  2. Apa yang saya gunakan di linux untuk membuat program python dapat dieksekusi

  3. Apa cara yang benar untuk membuat aplikasi PyQt saya berhenti saat dimatikan dari konsol (Ctrl-C)?

  1. Apa yang terjadi ketika sebuah benang bercabang?

  2. Apa yang menyebabkan semua baris ini menyatakan -x … ketika saya membuka terminal?

  3. Cara paling aman untuk mempartisi linux?

  1. Apa itu perangkat loop saat memasang?

  2. Apa yang harus dilakukan ketika desktop Linux membeku?

  3. Apa yang dapat menyebabkan 'kesalahan akal' saat menyetel enkripsi LTO?