Linux bağlam değiştirme sıklığı nasıl değiştirilir?


17

Linux (linaro, ubuntu, debian) bağlam değiştirme sıklığını değiştirmek nasıl mümkün olabilir?

Daha verimli bir sistem için daha az yanıt veren bir sistemde işlem yapmak için uygunum.

EDIT1: Ben mümkün olduğunca hızlı çalıştırmak istediğiniz bir ana işlem var (saniyede en fazla saat döngüleri), bu yüzden bağlam-geçiş frekansını azaltmayı düşündüm (= zaman dilimini arttırmak). Soru, bunun nasıl yapılacağıdır ve önemli bir etkisi olacaktır. Bağlam anahtarının maliyetini hesaplayabilir miyim? Yani, zaman dilimini iki kat artırdığımı tahmin edebilir miyim, umduğum ana süreç için performans kazancım% olarak ne olacak?


1
Bu ayarın etkisinin minimum olmasını ve yalnızca CPU çekirdeklerinden daha fazla işleminiz varsa alakalı olmasını beklerim. Belirli bir CPU için başka görev beklemiyorsa, kısa süreli bir görev anahtarı zamanlayıcısının ayarlanmasına bile gerek yoktur, çünkü başka bir görevi çalıştırılabilir hale getirebilecek her şey bir sistem çağrısı veya bir donanım kesintisi olacaktır. CPU'yu çekirdeğe döndürür.
Simon Richter

Burada sapkın olduğum için üzgünüm, ancak birisi bu soru bağlamında 'bağlam değiştirme sıklığının' ne anlama geldiğini açıklayabilir mi?
user1717828

@sourcejedi EDIT1'imi gör - Bağlam değiştirme sıklığını azalttığımda verim artışını% olarak tahmin edebilir miyim?
Nadav B

@NadavB Cevabımı buna göre düzenledim. Optimizasyon sırasında belirli ölçümler en iyisidir. Kara kutu gibi davranmanız gerekmez, örneğin CPU'nuz iyi ise önbellek hatalarını ölçmek için perf kullanabilirsiniz. AIUI, çeşitli CPU önbellek özledim türleri (TLB özledim dahil) bağlam anahtarlamanın en önemli bireysel maliyetleridir.
sourcejedi

Yanıtlar:


17

Göreviniz belirli bir CPU'da zaman isteyen tek işlemse, görevler arasında bağlam anahtarı olmayacaktır :-). Ancak CPU hala kesintiye uğrayabilir, bu da içeriğe çekirdeğe ve geriye dönüşe neden olabilir. Ve olası nedenlerden biri, bu CPU'da çalıştırılacak başka bir görev olup olmadığını kontrol eden ön hazırlık zamanlayıcısıdır ...

Linux , bunu yapmak için bir neden olmadığında işlemci üzerinde herhangi bir ön hazırlık zamanlayıcı kesintisi üretmekten kaçınabilir. Bkz CONFIG_NO_HZ_FULL. Bu özelliği kullanmak için, çekirdek oluşturulduğunda etkinleştirilmeli ve bir önyükleme seçeneği kullanılarak etkinleştirilmelidir.

Varsayılan olarak, hiçbir CPU adaptif keneler CPU olmayacaktır. "Nohz_full =" önyükleme parametresi, uyarlamalı keneler CPU'larını belirtir. Örneğin, "nohz_full = 1,6-8" CPU 1, 6, 7 ve 8'in uyarlamalı keneler CPU olması gerektiğini söylüyor. Tüm CPU'ları adaptif-kene CPU olarak işaretlemenizin yasak olduğunu unutmayın [...]

LWN.net, uyarlanabilir keneler CPU'lar için "Ingo Molnar'a göre, CPU zamanının% 1'i kadar tasarruf edilecek" diyor. Çekirdek belgede bunun altı farklı maliyeti olduğu belirtiliyor ve ayrıca "BİLİNEN SORUNLAR" listesi de var.

Bu kazanç, özellikle bu cevapta atıfta bulunulan gibi, birden fazla görev arasındaki bağlam anahtarlarının sıklığını azaltma potansiyel verim kazanımlarına kıyasla nispeten küçüktür: Linux CPU zamanlayıcısı tarafından kullanılan zaman dilimlerinin uzunluğu nasıl değiştirilir?

Küçük baskı: bu ölçümler tarih öncesi Spectre, Meltdown, KPTI ve x86 ASID desteği :-( Ve sanırım biraz daha eski donanımlar için de geçerli. çekirdek sürümünüzde ve donanımınızda değişti ... PTI, çekirdeği çok sık çağıran yazılımlar dışında, asıl örnek veritabanları olan ASID tarafından hafifletilecekti. .

Molnar'ın orijinal RFC yamasındaki umudu, zamanla "çoğu Linux dağıtımı tarafından etkinleştirilecek" idi. Fedora 28'in NO_HZ_FULLdestekle oluşturulmuş varsayılan bir çekirdek sağladığını fark ettim . Ancak Debian 9 bunu yapmaz.


Daha yakın zamanlarda, Linux v4.17 kaldırır bir artık 1 Hz Saat ilerleme gelen nohz_fullCPU'lar . Verim üzerindeki etkinin oldukça küçük olduğunu hayal ediyorum :-), ancak NO_HZ_FULLbir CPU'da birden fazla çalıştırılabilir süreç olduğunda faydaların durumunu izlemeye çalışıyorum -

0 Hz'e ulaştığımızda, periyodik kene varsayımını nr_running> = 2'den de kaldırabiliriz, ayrıca meşgul görevleri yalnızca sched_latency kısıtlamalarının yapmamızı gerektirdiği sıklıkta keserek - nr_running'a bağlı olarak her 4-40 ms'de bir .

Bu v2.6.25-rc1, 8f4d37ec073c, "sched: yüksek çözünürlüklü preemption tick" , ayrı, daha kesin bir kene kullanarak pre-emption zaten başladı biraz kafa karıştırıcı . Aynı LWN.net makalesinde bu yorum aracılığıyla bulundu: https://lwn.net/Articles/549754/ ).


kernel.sched_rr_timeslice_ms ne olacak?
Nadav B

1
@NadavB gerçek zamanlı sched_rr görevleri kullanıyorsanız, bunu söyleyin. Bu uzman bir konu. Eğer değilseniz, o zaman hayır :-).
sourcejedi
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.