SORU
24 AĞUSTOS 2012, Cuma


Bağlam çok daha yavaş yeni linux çekirdekleri içinde geçer

Ubuntu 10.04 BU bizim sunucuları üzerinde işletim sistemi BU Ubuntu 12.04 yükseltmek için arıyoruz. Ne yazık ki, çalıştırılabilir olmuş bir iş parçacığı çalıştırmak için gecikme süresi önemli ölçüde 3.2 çekirdek için 2.6 kernel arttı gibi görünüyor. Aslında alıyorsanız gecikme sayıları inanmak zor.

Bana bu test hakkında daha spesifik olalım. İki iş parçacığı çalışan bir program var. İlk iş parçacığı geçerli saati (kene RDTSC kullanarak) alır ve sonra bir durum ikinci kez değişken sinyaller. İkinci iş parçacığı durumu değişken bekler ve sinyal geldiğinde uyanır. O zaman şimdiki zaman (kene RDTSC kullanarak) alır. İlk konu ikinci konuya zaman ve saat arasındaki farkı ve konsolun üzerinde hesaplanan görüntülenir. Bundan sonra ikinci iş parçacığı durumu değişken bir kez daha bekler. Tekrar ikinci bir geçtikten sonra ilk iş parçacığı tarafından sinyal olacak.

Yani, özetledurum değişkeni üzerinden iletişim iş parçacığı için iş parçacığıölçüm bir kez ikinci bir sonucu olarak.

Kernel 2.6.32, bu gecikme bir yerde makul olan 2.8-3.5 bizi düzeninden oluşur. Çekirdek 3.2.0, bu gecikme 40-100 bize göre ... yükselmiştir. İki bilgisayar arasında donanımsal farklar hariç. Aynı donanım ({Westmere-EP} çift yuva X5687 işlemci hiper iş parçacığı, limit ve C durumları ile 3.6 GHz de çalışan kapalı) üzerinde çalışır. Test uygulama değişiklikleri benzeşme iş parçacığı çalıştırmak için onlara bağımsız fiziksel çekirdek aynı soket (yani, ilk iş parçacığı kaçak Core 0 ve ikinci iş parçacığı çalıştırmak Çekirdek 1), yok sıçrayan konuları çekirdekli veya sıçrayan/iletişim arasında yuva.

Tek fark arasındaki iki ana bir çalışan Ubuntu 10.04 LT ile kernel 2.6.32-28 (hızlı içerik anahtar kutusu) ve diğer çalışan en son Ubuntu 12.04 LT ile kernel 3.2.0-23 (yavaş bağlam anahtar kutusu). Tüm BIOS ayarları ve donanım aynıdır.

Ne kadar uzun bir iş parçacığı çalıştırmak için planlanmış olması gereken bu saçma için hesap yavaşlatacak çekirdek içerisinde herhangi bir değişiklik oldu mu?

Güncelleme: Eğer host ve linux üzerine inşa test etmek istiyorsanız, inceleme için posted the code to pastebin var. Derleme:

g   -O3 -o test_latency test_latency.cpp -lpthread

(En az çift çekirdekli bir kutu olduğunu varsayarsak) çalıştırın:

./test_latency 0 1 # Thread 1 on Core 0 and Thread 2 on Core 1

Güncelleme 2: Çok çekirdek parametreleri, çekirdek değişiklikleri mesajlar ve kişisel araştırma ile arama yaptıktan sonra, sorunun ne olduğunu anladım ve bu soruya bir cevap olarak çözüm attılar.

CEVAP
24 AĞUSTOS 2012, Cuma


Bu çözümkötü iş parçacığı performans sorunu uyanson çekirdekleri vardır acpi_idle sürücü daha önceleri kullanılan intel_idle cpuidle sürücü için geçiş yapmak için. Ne yazık ki, intel_idle sürücü C-devletler . kullanıcı BIOS yapılandırma yok sayıyor ^em>kendi ayarlamak için dans eder. Diğer bir deyişle, olsa bile tamamen devre dışı bırakmak için C Birleşik Devletleri bilgisayarınızın (ya da sunucunun) BIOS, sürücü yine de zorla onlara dönemlerde kısa hareketsizlik, hangi hemen hemen her zaman oluyor tabii bir çekirdek tüketen sentetik kriter (örneğin, stres) çalışıyor. C devlet geçişler, diğer yararlı bilgi işlemci frekansları ile ilgili ile birlikte, en uyumlu donanım üzerinde 49* *harika Google kullanarak izleyebilirsiniz.

Cpuidle sürücü şu anda kurulumunda aktif olduğunu görmek için, sadece aşağıdaki gibi: /sys/devices/system/cpu cpuidle bölümünde current_driver dosyasını kedi

cat /sys/devices/system/cpu/cpuidle/current_driver

Eğer modern Linux OS en düşük bağlam değiştirme gecikmesi mümkün olmasını istiyorsanız, aşağıdaki kernel parametreleri bu güç tasarruf özelliği devre dışı bırakmak ekleyin:

Ubuntu 12.04, /etc/default/grub 14 *giriş ekleyerek ve ardından* 16 *çalıştırarak bunu yapabilirsiniz. Boot eklemek için parametreleri:

intel_idle.max_cstate=0 processor.max_cstate=0 idle=poll

Burada üç Önyükleme Seçenekleri ne hakkında ilginç ayrıntılar:

Sıfır intel_idle.max_cstate ayar acpi_idle cpuidle sürücüsü (en az seçeneği belgelere başına) dönmek, ya da tamamen devre dışı bırakır. Kutudan tamamen (yani, current_driver dosya none bir çıktı üretir görüntüleme) devre dışı bırakılır. Bu durumda ikinci önyükleme seçeneği, processor.max_cstate=0 gereksizdir. Ancak, belgelere intel_idle sürücü için sıfır max_cstate ayarı acpi_idle sürücü için OS dönmek gerektiğini belirtir. Bu nedenle, her ihtimale karşı ikinci önyükleme seçeneği koydum.

processor.max_cstate seçeneği sıfır acpi_idle sürücü için maksimum C devleti, umarım da devre dışı olarak ayarlar. intel_idle.max_cstate=0 tamamen donanım tüm cpuidle şoförü bana mevcut çalıyor çünkü bu test, bir sistemi yok. Ancak, eğer yükleme yapar geri intel_idle acpi_idle ile sadece ilk boot seçeneği, lütfen bana bildirin eğer ikinci seçeneği, processor.max_cstate ne oldu belgelenmiş yapmak açıklamalarda, böylece ben güncelleme bu cevap.

Son olarak, üç parametre, idle=poll son gerçek güç domuzu. Çok daha fazla güç tüketimi pahasına gecikme son kalan biraz kaldırın, gerçekten gerekli sadece o kadar olacak C1/C1E, devre dışı bırakır. Çoğu için bu C1* gecikme o kadar büyük değildir beri overkill olacaktır. Benim test uygulaması donanım ben asıl soruya açıklanan çalışan kullanarak, gecikme süresi 3 ila 9 ABD bizden gitti. Bu kesinlikle son derece gecikme duyarlı uygulamalar için önemli bir azalma (örneğin, finansal işlem, yüksek hassasiyet/izleme, yüksek frekans telemetri. veri toplama, vb...), ama masaüstü büyük çoğunluğu için katlanılan elektrik çarptı değerinde olmayabilir apps. Emin olmanın tek yolu performans Uygulama Geliştirme vs güç tüketimi gerçek artış/donanım ısı profili ve dezavantajlarını tartmak için.

Güncelleme:

idle=* çeşitli parametreler ile ek test ettikten sonra, eğer donanımınız destekliyorsa mwait 34 *ayar çok daha iyi bir fikir olduğunu keşfettiler. MWAIT/MONITOR yönergeleri kullanımı CPU herhangi bir fark gecikme süresi parçacığı ardından ekledi olmadan C1E girmek için izin verir gibi görünüyor. idle=mwait ile soğutucu CPU sıcaklık idle=poll ile karşılaştırıldığında), daha az güç kullanımı ve yoklama boş bir döngünün mükemmel düşük gecikmeleri korur. Bu nedenle, düşük CPU için Önyükleme parametreleri iplik uyan gecikme güncelleştirilmiş tavsiye ettiğim set bu bulgulara dayanarak

intel_idle.max_cstate=0 processor.max_cstate=0 idle=mwait

Kullanım idle=mwait yerine idle=poll da yardımıyla başlama Turbo Boost (yardımcı İŞLEMCİ kal aşağıda onun TDP [Termal Tasarım Gücü]) ve hiper iş parçacığı için hangi MWAİT ideal mekanizması için değil tüketen bir bütün fiziksel çekirdekli ise aynı anda kaçınarak yüksek C Birleşik Devletleri). Çekimlere devam edecek, ancak test, kanıtlanmış olması gerekir.

Güncelleme 2:

mwait boşta seçeneği removed from newer 3.x kernels (güncelleme için Kullanıcı ck_ sayesinde) olmuştur. Bize iki seçenek bırakıyor:

idle=halt - mwait ama donanım ile bu durumda olduğundan emin olmak için test olarak çalışması Gerekir. HLT öğretimi devletin ipucu 0 MWAIT neredeyse eşdeğerdir. Sorun kesme bir bellek yazma (veya kesme) MWAİT bu durumu elde etmek için kullanılabilir iken HLT bir durumu elde etmek için gerekli olduğu gerçeği yatıyor. Linux Çekirdeği boşta döngüsü içinde kullandığına bağlı olarak, bu MWAİT potansiyel olarak daha verimli hale getirebilir. Dediğim gibi,/profil testi ve eğer gecikme ihtiyaçlarını karşılar

ve

idle=poll - yüksek performans seçeneği, güç ve ısı pahasına.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jabari Johnson

    Jabari Johns

    18 Ocak 2008
  • midomansour

    midomansour

    19 EYLÜL 2009
  • My Name Is Jeff

    My Name Is J

    26 ŞUBAT 2008