Ses gecikmesine katkıda bulunan faktörler

Bu sayfada çıkış gecikmesine katkıda bulunan faktörlere odaklanılmaktadır ancak giriş gecikmesi için de benzer bir tartışma geçerlidir.

Analog devrelerin önemli bir katkıda bulunmadığı varsayıldığında, ses gecikmesine yüzey düzeyinde en çok katkıda bulunanlar şunlardır:

  • Uygulama
  • Ardışık düzendeki toplam arabellek sayısı
  • Her bir arabelleğin kare cinsinden boyutu
  • Uygulama işlemciden sonra ek gecikme (ör. DSP'den)

Yukarıdaki katkıda bulunanlar listesi ne kadar doğru olursa olsun yanıltıcı da olabilir. Bunun nedeni, arabellek sayısı ve arabellek boyutunun neden olmaktan çok etki olmasıdır. Genellikle, belirli bir arabellek şeması uygulanıp test edilir ancak test sırasında "tıklama" veya "patlama" şeklinde bir ses eksikliği ya da taşması duyulur. Sistem tasarımcısı, bu durumu telafi etmek için arabellek boyutlarını veya arabellek sayılarını artırır. Bu, istenmeyen gecikmelerin artması gibi yan etkileri olsa da istenilen sonucu verir. Arabellek boyutları hakkında daha fazla bilgi için Ses gecikmesi: Arabellek boyutları videosunu izleyin.

Daha iyi bir yaklaşım, yetersiz ve fazla harcamaların nedenlerini anlayıp bunları düzeltmektir. Bu sayede, sesli artefaktlar ortadan kaldırılır ve daha küçük veya daha az arabelleğe izin verilerek gecikme azaltılabilir.

Deneyimlerimize göre, bütçe aşımlarının ve bütçe aşımlarının en yaygın nedenleri şunlardır:

  • Linux CFS (Tamamen Adil Planlayıcı)
  • SCHED_FIFO planlamasıyla yüksek öncelikli iş parçacıkları
  • öncelik ters çevirme
  • uzun planlama gecikmesi
  • uzun süreli kesinti işleyicileri
  • uzun kesinti devre dışı bırakma süresi
  • güç yönetimi
  • güvenlik çekirdekleri

Linux CFS ve SCHED_FIFO planlaması

Linux CFS, ortak bir CPU kaynağını paylaşan rekabet halindeki iş yükleri için adil olacak şekilde tasarlanmıştır. Bu adalet, iş parçacığı başına bir nice parametresi ile temsil edilir. nice değeri -19 (en az uygun veya en fazla CPU zamanı ayrılmış) ile 20 (en uygun veya en az CPU zamanı ayrılmış) arasında değişir. Genel olarak, belirli bir nice değerine sahip tüm iş parçacıkları yaklaşık olarak eşit CPU süresi alır ve nice değeri sayısal olarak daha düşük olan iş parçacıkları daha fazla CPU süresi almayı beklemelidir. Ancak CFS, yalnızca nispeten uzun gözlem dönemlerinde "adil"dir. CFS, kısa süreli gözlem aralıkları boyunca CPU kaynağını beklenmedik şekillerde ayırabilir. Örneğin, CPU'yu sayısal olarak düşük nicelik değerine sahip bir iş parçacığından, sayısal olarak yüksek nicelik değerine sahip bir iş parçacığına geçirebilir. Ses söz konusu olduğunda bu durum, sesin eksik veya fazla yayınlanmasına neden olabilir.

Bunun için en iyi çözüm, yüksek performanslı ses iş parçacıkları için CFS'den kaçınmaktır. Android 4.1'den itibaren bu tür mesaj dizileri, CFS tarafından uygulanan SCHED_NORMAL (SCHED_OTHER olarak da bilinir) planlama politikası yerine SCHED_FIFO planlama politikasını kullanır.

SCHED_FIFO öncelikleri

Yüksek performanslı ses ileti dizileri artık SCHED_FIFO kullansa da daha yüksek öncelikli diğer SCHED_FIFO ileti dizilerinden etkilenmeye devam eder. Bunlar genellikle çekirdek çalışan iş parçacıklarıdır ancak SCHED_FIFO politikasına sahip birkaç ses dışı kullanıcı iş parçacığı da olabilir. Kullanılabilir SCHED_FIFO öncelikleri 1 ile 99 arasındadır. Ses ileti dizileri 2 veya 3 öncelikli olarak çalışır. Bu durumda, 1. öncelik düşük öncelikli ileti dizileri için, 4 ile 99 arasındaki öncelikler ise yüksek öncelikli ileti dizileri için kullanılabilir. Mümkün olduğunda 1. önceliği kullanmanızı ve 4 ile 99 arasındaki öncelikleri, sınırlı bir süre içinde tamamlanacağı garanti edilen, ses iş parçacıklarının süresinden daha kısa bir süreyle yürütülen ve ses iş parçacıklarının planlamasını etkilemediği bilinen iş parçacıkları için ayırmanızı öneririz.

Oran monoton planlama

Sabit önceliklerin atanması teorisi hakkında daha fazla bilgi için Rate-monotonic scheduling (RMS) başlıklı Wikipedia makalesine bakın. Sabit önceliklerin, algılanan "önem"e göre değil, kesinlikle döneme göre atanması önemli bir noktadır. Daha kısa dönemlere ait ileti dizilerine daha yüksek öncelikler atanır. Periyodik olmayan iş parçacıkları, maksimum yürütme sıklığı ve yürütme başına maksimum hesaplama kullanılarak periyodik iş parçacığı olarak modellenebilir. Periyodik olmayan bir iş parçacığı, periyodik iş parçacığı olarak modellenemiyorsa (örneğin, sınırsız sıklıkta veya yürütme başına sınırsız hesaplama ile yürütülebiliyorsa) sabit bir öncelik atanmaz. Bu, gerçek periyodik iş parçacıklarının planlanmasıyla uyumlu olmaz.

Öncelik ters çevirme

Öncelik ters çevirme, gerçek zamanlı sistemlerin klasik bir hata modudur. Bu modda, daha yüksek öncelikli bir görev, daha düşük öncelikli bir görevin mutex (ortak durum tarafından korunan) gibi bir kaynağı serbest bırakmasını beklerken sınırsız bir süre boyunca engellenir. Bu sorunu azaltmaya yönelik teknikler için "Öncelik tersine çevirme sorununu önleme" makalesine bakın.

Planlama gecikmesi

Planlama gecikmesi, bir iş parçacığının çalışmaya hazır hale gelmesi ile iş parçacığının bir CPU'da gerçekten çalışabilmesi için ortaya çıkan bağlam değiştirme işleminin tamamlanması arasındaki süredir. Gecikme ne kadar kısa olursa o kadar iyidir. İki milisaniyeden uzun gecikmeler sesle ilgili sorunlara neden olur. Uzun planlama gecikmesi, büyük olasılıkla bir CPU'yu başlatma veya kapatma, güvenlik çekirdeği ile normal çekirdek arasında geçiş yapma, tam güçten düşük güce geçme veya CPU saat frekansını ve voltajını ayarlama gibi mod geçişleri sırasında ortaya çıkar.

Kesintiler

Birçok tasarımda CPU 0 tüm harici kesintileri işler. Bu nedenle, uzun süre çalışan bir kesme işleyici, özellikle ses doğrudan bellek erişimi (DMA) tamamlanma kesmelerini olmak üzere diğer kesmeleri geciktirebilir. Kesme işleyicileri, hızlı bir şekilde bitecek ve uzun süreli işleri bir iş dizisine (tercihen önceliği 1 olan bir CFS iş dizisi veya SCHED_FIFO iş dizisi) erteleyecek şekilde tasarlayın.

Benzer şekilde, CPU 0'da kesintileri uzun süre devre dışı bırakmak da ses kesintilerinin işlenmesini geciktirecektir. Uzun kesinti devre dışı bırakma süreleri genellikle bir çekirdek spin kilidi beklenirken gerçekleşir. Sınırlandırıldıklarından emin olmak için bu spin kilitlerini inceleyin.

Güç, performans ve termal yönetim

Güç yönetimi, performansı optimize ederken güç tüketimini izleme ve azaltma çalışmalarını kapsayan geniş bir terimdir. Termal yönetim ve bilgisayar soğutma benzer olsa da aşırı ısıdan kaynaklanan hasarı önlemek için ısıyı ölçmeyi ve kontrol etmeyi amaçlar. Linux çekirdeğinde, CPU yöneticisi düşük düzey politikadan sorumludur. Kullanıcı modu ise üst düzey politikayı yapılandırır. Kullanılan teknikler şunlardır:

  • dinamik voltaj ölçeklendirme
  • dinamik sıklık ölçeklendirmesi
  • Dinamik çekirdek etkinleştirme
  • Küme değiştirme
  • güç denetimi
  • hotplug (sıcak değiştirme)
  • çeşitli uyku modları (duraklatma, durdurma, boşta kalma, askıya alma vb.)
  • işlem taşıma
  • işlemci yakın ilgi alanı

Bazı yönetim işlemleri, "çalışmanın durmasına" veya uygulama işleyici tarafından yararlı bir çalışmanın yapılmadığı zamanlara neden olabilir. Bu çalışma kesintileri sesi etkileyebilir. Bu nedenle, bu tür yönetimler ses etkinken kabul edilebilir en kötü duruma göre tasarlanmalıdır. Elbette, termal kaçak söz konusu olduğunda kalıcı hasarlardan kaçınmak sesten daha önemlidir.

Güvenlik çekirdekleri

Dijital hak yönetimi (DRM) için bir güvenlik çekirdeği, ana işletim sistemi çekirdeği ve uygulama kodu için kullanılanlarla aynı uygulama işlemcisi çekirdeklerinde çalışabilir. Bir çekirdekte güvenlik çekirdeği işleminin etkin olduğu her zaman, normalde bu çekirdekte çalışacak olan normal çalışmanın durdurulmasına neden olur. Özellikle ses çalışmaları bu kapsamdadır. Güvenlik çekirdeğinin doğası gereği, iç davranışı daha üst düzey katmanlardan anlaşılamaz. Bu nedenle, güvenlik çekirdeğinin neden olduğu performans anormallikleri özellikle zararlı olur. Örneğin, güvenlik çekirdeği işlemleri genellikle bağlam değiştirme izlerinde görünmez. Buna "karanlık zaman" diyoruz. Bu, geçen ancak gözlemlenemeyen zamandır. Güvenlik çekirdekleri, ses etkinken kabul edilebilir en kötü durumda çalışmanın durdurulması için tasarlanmalıdır.