İnsanlar neden çift çekirdekli CPU'ya sahip olmak için -j3 seçeneğini önermektedir?


18

Gentoo Linux'ta, paketleri oluştururken kaç işin paralel çalışması gerektiğini söylemek için MAKEOPTSdeğişkeni ayarlamak mümkündür . Çift çekirdekli bir CPU'm olduğundan, bu seçeneği saf bir şekilde kullanmayı seçtim : çekirdek başına bir iş, bu yüzden her ikisinin de bir şeyleri var. "Sorun", kullanıcılara seçeneği ayarlamak için çift çekirdekli bir CPU'ya sahip olduğunu söyleyen birçok referans var . Onlardan bazıları:/etc/portage/make.confmake-j2-j3

Örneğin, Gentoo el kitabı şunları söylüyor:

İyi bir seçim, sisteminizdeki CPU (veya CPU çekirdeği) sayısı artı birdir, ancak bu kılavuz her zaman mükemmel değildir.

Peki "CPU + 1" kuralı için gerekçe nedir? Neden ekstra iş?

Make.conf (5) kılavuz sayfası şunları söylüyor:

Önerilen ayarlar CPU + 1 ve 2 * CPU + 1 arasındadır.

Ayrıca seçenek için makebilgi sayfasındaki 5.4 bölümü (Paralel Yürütme) ve makekılavuz sayfası açıklamasını da okudum -j, ancak orada cevap yok gibi görünüyor.



Yanıtlar:


13

Her zaman işe yarayan basit bir kural yoktur. İnsanlar belirli bir rakamı önerebilir, çünkü belirli bir makinede belirli bir derlemeyi denemişlerdir ve bu en iyi ayardır ya da gerçeklikle bir ilişkisi olan ya da olmayan bir akıl yürütme izledikleri için.

Çok fazla RAM ile kutsanmışsanız, uzun bir derlemedeki sınırlayıcı faktör CPU zamanı olacaktır. Daha sonra CPU başına bir görev ve bu ara sıra G / Ç blokları için bekleyen bir görev iyi bir ayardır. Bu, onu -j3çift ​​çekirdekli bir CPU (veya daha doğrusu, çift CPU makinesi için) yapar - her çekirdek hiper iş parçacıklıysa, bu 4 CPU olacaktır -j5).

Çok az RAM'iniz varsa, sınırlayıcı bir faktör aynı anda çok fazla işiniz olamayabilir veya yoksa birbirlerini değiştirmeye devam ederler. Örneğin, belleğe iki derleyici örneğini rahatça sığdıramıyorsanız make -j2, zaten daha yavaş olabilir make. Bu, RAM'e aynı anda kaç derleyici işleminin sığabileceğine bağlı olduğundan, genel bir rakam elde etmenin bir yolu yoktur.

Arasında daha fazla iş bulmak faydalı olabilir. Her derleyici işlemi küçükse, ancak bir bütün olarak derleme çok fazla veriye dokunuyorsa, disk G / Ç'si engelleme faktörü olabilir. Bu durumda, bir seferde CPU başına birkaç iş isteyeceksiniz, böylece diğerleri her zaman I / O'yu beklerken her CPU'yu kullanan bir iş olacaktır. Yine, bu, derleme işine ve kullanılabilir RAM'e çok bağlıdır, burada veri önbelleği için mevcut olan şeylere bağlıdır (çok fazla işin olması önbelleği çok fazla kirletir.


CPU çekirdekleri hiper iş parçacıklıysa, her birinin iki olarak sayıldığını bilmiyordum. Her neyse, işte görünüyor benim CPU Hyper Threading desteklemez.
Francesco Turco

Bu cevabı kabul ettim. Her neyse -j2, sistemime bağlı kalmayı seçtim . Hem gelişmekte çalıştı Bunun nedeni gccve firefoxgelen ayarlarla -j1için yukarı -j5(10 komutları ortaya olmak üzere toplam) ve süre görünüyor -j2kesinlikle daha hızlı olduğu -j1diğer üç ayar eşit seviyede yer alıyor, -j2.
Francesco Turco

7

Sanırım bu biraz sezgisel - süreçlerin makebaşlatılmasına izin CPUs + 1vermek şunlardan emin olmaktır:

  1. henüz bitmiş bir işçi süreci ile henüz henüz çalıştırılmamış bir işçi arasında bir boşluk olmazdı - biraz da ön dolum çalıştırma kuyruğu gibi.
  2. bu çalışma kuyruğu ön dolgusu ile göze çarpan bir ek yük getirecek çok fazla rekabetçi süreç olmazdı.

Ancak, yine, bu sezgisel ve FreeBSD'nin el kitabı hala tek bir CPU için tavsiye ediyor make -j4 .


5

Genel olarak, çekirdek sayısından daha fazla iş başlatmak için nedenler vardır. Gcc kullanarak C derlemesi için -pipe gcc seçeneklerinde tanımlanmamışsa, eylemlerini (önişleme, ilk çalıştırma, optimizasyonlar ve montaj) geçici dosyalar kullanarak sırayla yapar; -pipe bunu alt süreçler arasındaki boruları kullanarak değiştirir. (-Pipe eklemek varsayılan olarak FreeBSD için varsayılan olmakla birlikte, Linux'ta geleneksel değildir.) Bu nedenle, 2 çekirdeğiniz varsa ve paralel olarak 2 işe izin verirseniz, disk G / Ç'de biraz zaman harcarlar. 1 iş ekleme önerisi bu spesifikasyonlarla ilgili görünmektedir. Ancak son cevabı almak için bu öneriyi kim ve ne zaman eklediğini bulmalı ve ona sormalısın :) ya da Gentoo devels'in posta listesinde sormalısın.


2

Temel olarak bu sayı, yazarların sağduyu olarak adlandırdığı sayıdır. En iyi ihtimalle, iyi bir tahmin. Bildiğim kadarıyla, yazarken ortaya çıkan yapım süreci makezaten sayılmış, böylece -j3diğer iki derleme yaparken, ana süreç bekleyen sonuçlanabilir.

Ancak, ben Gentoo kullandığımda başparmak kuralı oldu <#cpus>*2 + 1.

Tüm tavuk izleri, çay yaprakları veya sihirli 8 topun, gerçekleşmesi gereken disk I / O ve mevcut linux çekirdeğinizin zamanlaması hakkında söylediklerine bağlı. [bu -jyazının çekirdeğine başlayın] Kişisel deneyimimden ( Gentoo'ya özgü değil), #cpus + 1 ve #cpus * 2 +1 arasındaki her şey iyi sonuçlar verir [bu yazının çekirdeğini sonlandır] ve ortalama olarak farkları neredeyse hiç not edemezsiniz. İşlemciler ve çekirdekler bugünlerde oldukça iyi.

ANCAK tüm bu değişiklikler şu durumlarda: a) derlemek için birden fazla kutu kullanıyorsanız (du'h) veya b) kendi kodunuzu geliştiriyorsanız

Daha yüksek bir -jözniteliğin daha önce bilinmeyen bağımlılıkları göstermesi daha olasıdır.

Ve bir yan not: çekirdeklerin sayısına göre gitmeyin, ancak CPU'ların aldığı eşzamanlı akışların sayısına göre. (Hypertheading!)

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.