Ara sıra CPU çekirdeği domuzunu bulun


11

Orta hızlı ARMv7 işlemcide çalışan bir 2.6.35 PREEMPT çekirdeğim var. Her 100 - 125 saniyede bir, çekirdeğin yetersiz seslerden kaçınmak için sesle ilgili bazı sürücüleri yeterince hızlı bir şekilde işlememesine neden olur. Destek genellikle 15-30 ms arasındadır, ancak çok daha uzun olabilir. Muhafaza işleminin tamamen çekirdek içinde olup olmadığı veya gerçek zamanlı öncelikli (SCHED_RR, 2) çalışan bir kullanıcı işleminin zamanlamasıyla ilgili olup olmadığı açık değildir.

Benim tahminim, preempt ile hoş olmayan bir (en az bir) sürücü var.

Çeşitli zaman raporlarının nasıl yorumlanacağından emin olmasam da, kullanıcı sürecinden bazı strace çıktı hem normal hem de anormal davranışların bazı yönlerini göstermektedir?

Normal durum:

     0.000518 anket ([{fd = 10, olaylar = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3415) = 1 
     0.010202 anket ([{fd = 10, olaylar = POLLIN | POLLERR | POLLNVAL}, {fd = 6, olaylar = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3404) = 1 
     0.000585 anket ([{fd = 10, olaylar = POLLIN | POLLERR | POLLNVAL}, {fd = 6, olaylar = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3404) = 1 
     0.000302 anket ([{fd = 10, olaylar = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3404) = 1 
     0.010706 anket ([{fd = 10, olaylar = POLLIN | POLLERR | POLLNVAL}, {fd = 6, olaylar = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3393) = 1 
     0.000480 anket ([{fd = 10, olaylar = POLLIN | POLLERR | POLLNVAL}, {fd = 6, olaylar = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3392) = 1 

Fd6'daki çıktı için yoklamada hiçbir engelleme olmaz ve yalnızca fd10 girdi için sorgulandığında, yaklaşık 10 ms'lik bir blok oluşur. Bu, hem sistem çağrısının süresinin raporunda hem de sistem çağrıları arasındaki aralıkta (bunlar tutarlıdır) yansıtılır.

Arıza durumu (uç örnek):

     0.000305 anket ([{fd = 10, olaylar = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3543) = 1 
     0.010730 anket ([{fd = 10, etkinlikler = POLLIN | POLLERR | POLLNVAL}, {fd = 6, etkinlikler = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3533) = 1 
     0.000475 anket ([{fd = 10, olaylar = POLLIN | POLLERR | POLLNVAL}, {fd = 6, olaylar = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3532) = 1 
     0.000329 anket ([{fd = 10, olaylar = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3532) = 1 
     0.953349 anket ([{fd = 10, olaylar = POLLIN | POLLERR | POLLNVAL}, {fd = 6, olaylar = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT | POLLERR}], 2, 2578) = 1 

Bu durumda, ikinci son çağrı 10ms (normal) olarak kaydedilmiş olsa da, son çağrıdan 953ms önce olduğuna dikkat edin.

Suçluyu izlemek için hangi araçları kullanabilirim?


2
İlginç soru için bonus puan. Nasıl cevap vereceğinden emin değilim ama CPU kullanımına nasıl geri döneceğime dair bir sorum var (örneğin iowait'teki ani artışların aksine)?
Bratchley

1
İlk tahmin, büyük bir NAND flaşında JFFS2 veya YAFFS kullanıyorsanız, özellikle de kayıt yapıyorsanız. Flash'a yazan her şeyi devre dışı bırakın ve yardımcı olup olmadığını görün. İşlem tablonuz nasıl görünüyor? Çekirdeği oluşturmak için bir araç zinciriniz varsa ftrace'ı son çare olarak kullanabilirsiniz.
Jonathan Ben-Avraham

sar -bu yapabilirim .. linux.die.net/man/1/sar
Grizly

Kullanılan flaş var; takılı ext4 dosya sistemine sahip bir SD kart. Ve buna gerçekten de bu sorunların olası bir kaynağı (ama neden, tam olarak?) Ama muhtemelen tek sorun değil.
Ağustos'ta awy

Yanıtlar:


1

perfsizin için yararlı olabilir. Linux çekirdeği yardımcı programlarının bir parçasıdır.

Örneğin:

perf record -R -a -g fp -e cycles -e syscalls:sys_enter_poll -e syscalls:sys_exit_poll
#Just ctrl+c if you are done, and view ith
perf script 

Tüm sistem çağrısı giriş / çıkış sürelerini ve parametrelerini (strace gibi) gösterecek, sistem çağrısını çağıran ikilinin adını sağlayacak ve her CPU'nun çağrı kitini bir miktar frekansta (çekirdek sembolleri dahil) örnekleyecektir. Böylece sistem çağrısı sırasında hangi kodun yürütüldüğünü görebilirsiniz. Çok işlemcili bir sistemde cpu kimliğine dikkat etmeniz gerekir (örn. [001]).


Platform için mükemmel bir şekilde inşa edilmeye bakacağım - ipucu için teşekkürler.
Ağustos'ta awy

0

Belki atopproblemine biraz ışık tutabilir.

Önceden çıkmış işlemleri gösterebilir ve CPU , Bellek , Disk ve kullanımını gösterebilir .

Etkileşimli çalıştırabilir, bir metin dosyasına yazmasına veya sarönceden tanımlanmış bir aralıkta olduğu gibi çalışmasına izin verebilir ve daha sonra adım adım ilerleyebileceğiniz bir ikili geçmiş dosyası oluşturabilirsiniz.

Bulmak zor her türlü hogs bulmak için kullanın :-)

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.