2012-12-26 14 views
6

İşletim sistemi RHEL 6 (2.6.32). Bir çekirdek oluşturdum ve üzerinde yoğun bir iş parçacığı çalıştırıyorum./proc/{thread-id}/status, her saniyede bir gönüllü olmayan içerik anahtarını gösterir.Niçin gönüllü olmayan bir içerik anahtarı saniyede?

Söz konusu iş parçacığı bir SCHED_NORMAL iş parçacığıdır ve bunu değiştirmek istemiyorum.

Bu sayıda gönüllü olmayan bağlam anahtarını nasıl azaltabilirim? Bu,/proc/sys/kernel'deki herhangi bir zamanlama parametresine bağlıdır mu?

EDIT: Bazı yanıtlar alternatif yaklaşımlar önerir. Bu rotaya gitmeden önce, ilk, neden çalışma saatleri boyunca bile tam olarak gönüllü olmayan bir bağlam anahtarını alıyorum. Örneğin, bu CFS tarafından neden oldu mu? Eğer öyleyse, hangi parametreler ve nasıl?

EDIT2: Daha fazla açıklama - ilk soru I bir cevap istiyorum şunlardır: niçin tek anahtarı her yarım ya da iki saniye, diyelim ki, yerine saniyede bir gönüllü olmayan içerik anahtarı alıyorum?

+1

Neden umursarsınız? Saniyede 100 bağlam düğmesi bile modern bir sistemde gürültüdür. –

+1

Gecikmenin premium ve evreni bağlamda olduğu finansal uygulaması, (veya daha fazla) kayıp bir fırsat olabilir. Sistem ayar parametrelerinin, yalıtılmış çekirdeklerde yoğun işlem gerektiren işlemcilerin gönüllü olmayan bağlam değiştirme oranını belirlediğini anlamak isterim. –

+0

Büyük olasılıkla bir kilit, normal disk G/Ç veya sayfa hatası üzerinde engelleme. –

cevap

12

Bu bir tahmindir, ancak eğitimli bir modeldir - yalıtılmış bir CPU kullandığınızdan, programlayıcı kendi başına bir istisna dışında kendi göreviniz dışında herhangi bir görevi zamanlamamaktadır - çekirdeğindeki vmstat kodu tek bir çalışmayı zamanlayan bir zamanlayıcıya sahiptir Bellek kullanım istatistiklerini hesaplamak için saniyede bir her CPU'daki sıra öğesi ve bu, gördüğünüz her saniyede zamanlanan bir programdır.

İş kuyruğu kodu, çekirdek% 100 boştaysa ancak tek bir görev çalıştırıyorsa çalışma kuyruğu çekirdeği iş parçacığı zamanlamak için yeterince akıllıdır.

Bunu, ftrace kullanarak doğrulayabilirsiniz.Sched_switch izleyicisi, saniyede bir kez (veya değer, en yakın jiffie olaylarına yuvarlanır ve zamanlayıcı, cpu boşta kaldığında sayılmaz, bu zamanlamayı çarpılamayabilir) öğenin/CPU_NUMBER olayının olduğunu gösterir. (ya da eski çekirdekler için keventd), bunun sebebi neredeyse% 100'dür. Bu, gerçek zamanlı olarak vmstat_update işlevinin, zamanlayıcıyı olaylar dizisi iş parçacığının çalıştığı her saniye bir iş kuyruğu kuyruğuna sıralamak için ayarlamasıdır.

Vmstatın zamanlayıcısını ayarlayacağı döngü yapılandırılabilir olduğunu unutmayın - vm.stat_interval sysctl topuzu üzerinden başka bir değere ayarlayabilirsiniz. Bu değeri arttırmak, daha az doğru olan bellek kullanım istatistiklerinin maliyeti ile bu tür kesintilerin daha düşük bir oranını verecektir.

Yalıtılmış CPU iş yüklerine here tüm kesinti kaynakları ile bir wiki'yi koruyorum. Ayrıca, bir vmstat iş kuyruğu ile diğeri arasında herhangi bir değişiklik olmaması durumunda, iş kuyruğu öğesinin programlanmaması için vmstat alma işlerinde de bir yama var - örneğin, CPU'daki tek göreviniz herhangi bir dinamik bellek kullanmıyorsa olur tahsisler. Yine de size fayda sağlayacağından emin değilsiniz - iş yükünüze bağlıdır.

0

Kodun kendisini en iyi duruma getirmeyi denemenizi öneririm, böylece bir CPU üzerinde çalışırken azami çıktıyı elde edersiniz. Her neyse
, bu faydalı olur ancak denemek zaten vermek ve bize bildirin emin değilim:
Temelde sadece FIFO sonra süreci vermek olmaya zamanlama kuralını ayarlandığında yok edeceğiz Ne

maksimum öncelik mümkün.

#include<sched.h> 
struct sched_param sp = sched_get_priority_max(SCHED_FIFO); 
int ret; 

ret = sched_setscheduler(0, SCHED_FIFO, &sp); 
if (ret == -1) { 
    perror("sched_setscheduler"); 
    return 1; 
} 

sizin işlem yapan herhangi engelleme beyanı olacak CPU Çikarmak zamanlayıcı neden EN UYGUN olduğunu lütfen unutmayın.

Source
Man page
DÜZENLEME:
Maalesef sadece pthread etiketi fark; Size özel CPU üzerindeki saniyede bir kesme çok fazla hala http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_setschedparam.3.html

+0

Tam olarak neden gönüllü olmayan bir bağlamı görebildiğimi söyleyebilir miyim? –

+0

Emin değilim, ancak zamanlayıcı RR algoritması kullanıyor olabilir ve işleminizin zaman dilimi bitti, bu yüzden tekrar gönderilir ve daha sonra tekrar CPU'ya geri dönersiniz. – Fingolfin

0

, o zaman gerçekten hiç normal bir zamanlayıcı geçmesi değil gerekir: kavram hala çok bu adam sayfasını kontrol bekletmeler. Gerçek zamanlı ve eşzamanlı öncelik seviyelerini önerebilirim; bu süreç, sürecinizi her zamanki önleyici mekanizmalardan daha güvenilir bir şekilde planlayabilir mi?