"Make -j" (argüman olmadan) tehlikeli midir? [kapalı]


13

Bir şey oluştururken Bugün erken saatlerde, ben aday olmaya karar makeolarak

$ make -j

belki varsayılan olarak makul bir sınıra cabalnerede gibi diğer programlarla alışkanlık -j.

Yaklaşık 20 saniye sonra tüm masaüstüm durdu . Çeşitli aktivite belirtileri arıyorum. Hiç fan dönmüyor. HDD ışığı sabit yeşil renktedir, ancak disk etkinliği duymuyorum. Hmmmmm. 10 dakikalık sessizlikten sonra, nihayet yıllar önce yaptığım ilk tuşa bir yanıt görüyorum ve ayrıca disk çökmesinin çok tanıdık sesini duymaya başladım. 20 dakika sonra yavaş yavaş bu tepkisiz makinede bir terminale doğru ilerlemeye çalışarak, REISUB'u kullandım ve kullandım.


İlk başta, ilgisiz bir masaüstü uygulamasının suçlu olması gerektiğini düşündüm, çünkü uzun zamandır kendimi tam olarak bu tür bir duruma sokmamı önlemek için interaktif bash oturumlarına bellek sınırları koydum! Ama /var/log/syslogfarklı bir hikaye anlatıyor; geride OOM katil bazı psdökümlerini şüpheyle edilir paketlenmiş ile c++ve cc1plussüreçler!

İşte bu dökümlerden birinin frekans analizi:

Command          Number of appearances
'sh'                    322
'c++'                   321
'cc1plus'               321
'chrome'                 27
'make'                   27
'bash'                    3
all else combined       120

Bu yüzden GNU markası için man sayfasını kontrol ediyorum: (vurgu eklendi)

-j [jobs], --jobs [= jobs] Aynı anda çalıştırılacak işlerin (komutların) sayısını belirtir. Birden fazla -j seçeneği varsa, son seçenek etkilidir. -J seçeneği bağımsız değişken olmadan verilirse, make aynı anda çalışabilecek iş sayısını sınırlamaz.


Ben sorunu yeniden görmek için isteksiz değilim (ben ne zaman bu acı, Doktor bu ...) , ama soruşturmanın sonuçları şu ana kadar bir home run gibi görünüyor: Açıkçası, make -jve elde edilen süreçlerin yüzlerce olmalıdır been hang ve disk dayağa neden olur. Bununla birlikte, internette arama yaparken, ona karşı çok fazla uyarı bulamıyorum. Sonuçlara mı atlıyorum?

make -jbana görünüyor kadar tehlikeli? Eğer öyleyse, neden orada var ve aptalca kanıtlamak için ne yapılabilir?


Not: Son soruda, argüman ekleme ihtiyacınıalias make="make -j4" ortadan kaldırmak için bir eklemeyi düşünüyorum , ancak yine de olası tüm sonuçları düşünmedim ...-jN
Exp HP

1
Küresel sınırlar için lütfen makekendi tesislerini kullanın ve yapın export MAKEFLAGS="-j 4". Daha fazla araştırma için yazmadan önce okumayı tavsiye ederim . Not: <çekirdek sayısı> + 2 bana neredeyse yirmi yıldır iyi hizmet etti. Gün içinde, Linus bir çekirdek yayınlamadan önce bir final yaptı . make -j128
Bananguin

Yanıtlar:


6

Kendinizi ayağınıza birçok yaratıcı yolla vurmanızı sağlayan araçlar var. Bu, başka birinin "aklı başında" olduğunu düşündüğü şeylerle kısıtlanmadan sorunları çözmek için hayal gücünüzü kullanabilmeniz içindir.

Koşu make -jküçük bir proje üzerinde mükemmel makul. Diğer projelerde, -jargüman olmadan kullanmak, sistem tepkisini ciddi şekilde sakatlayacaktır. Bazı projelerde, paralel derlemeler kullanıldığında bile -j2, derleme tamamen bozulur (paralel bir oluşturma işlemi tarafından oluşturulan dosyalar başka bir zaman için orada değildir vb.).

Ben şahsen yumuşatma önleyeceğini makeiçin make -j4(yorumlarınızla, Düşündüğünüz demek gibi). Ben açıkça ederim o kadar, ne yapacağını makineyi söylemek daha iyi olduğunu bulmak biliyorum o ne yapacağını. Birkaç gün içinde, bu takma adı unutmuş olacağım ve ayrı terminallerde inşa ettiğim dört projenin neden sistemimi yanıt vermiyor olduğunu merak edeceğim.

"Tehlikeli" gelince ... Kelime, farklı bağlamlarda farklı şeyler ifade eder. Evet, "tehlikeli" çünkü sistemi yanıt vermeyebilir. Evet, "tehlikelidir" çünkü derleme sürecinin yarısına kadar çökebilir. Ancak hayır, sabit sürücünüzü yeniden biçimlendirmesi veya rastgele dosyaları silmeye başlaması anlamında "tehlikeli" değildir.

Peki, bunu nasıl aptalca kanıtlamalı?

Adım adım bir emin adım kılavuzu:

  1. Araçlarınızı kullanmayı öğrenin.

Bildirim, o da var -jBSD için bayrak make yok bir argüman gerektirir ve bu bayrak standart dışı olduğu (Unix POSIX standardı söz etmez).


4

Ayrıca aşağıdakileri kullanarak markayı sınırlayabilirsiniz -l:

-l [load], --load-average [= load] Çalışan başka işler varsa ve yük ortalaması en az yük (kayan nokta sayısı) ise yeni işlerin (komutların) başlatılmaması gerektiğini belirtir. Bağımsız değişken olmadan, önceki bir yükleme sınırını kaldırır.

Ama böyle çalıştırmak için yardım görünmüyor not olun: make -j -l4.

Yük ortalaması sınırın üzerine çıkmadan önce çok fazla iş başlatıldı (deneyimlerime dayanarak). Böylece bir kombinasyon çalışabilir, örn make -j8 -l4.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.