Ftrace kullan

ftrace, Google Apps Kasası'nda neler olup bittiğini anlamaya Linux çekirdeği. Aşağıdaki bölümlerde temel ftrace işlevleri ve atrace (çekirdek etkinliklerini yakalar) ve dinamik ftrace ile birlikte kullanın.

Şurada bulunmayan gelişmiş ftrace işleviyle ilgili ayrıntılar için: aşağıdaki adreste bulunan ftrace dokümanlarına bakın: <kernel tree>/Documentation/trace/ftrace.txt.

Atrace ile çekirdek etkinliklerini yakalama

atrace (frameworks/native/cmds/atrace), verileri yakalamak için ftrace'i kullanır çekirdek etkinlikleridir. Bunun için, systrace.py (veya Catapult) adb kullanır olanak tanır. atrace şunları yapar:

  • Bir özellik ayarlayarak kullanıcı modu izlemeyi ayarlar (debug.atrace.tags.enableflags).
  • Uygun ftrace sysfs düğümleri. Ancak ftrace daha fazla özelliği desteklediğinden bazı sysfs düğümlerini siz daha sonra atrace'i kullanabilirsiniz.

Önyükleme zamanı izleme hariç, özelliğini uygun değere ayarlayın. Mülk bir bit maskesi ve bu, iyi bir şey uygun başlığa bakmaktan başka doğru değerleri belirlemenin bir yoludur. (Bu sayı Android sürümleri arasında değişebilir).

Ftrace etkinliklerini etkinleştir

Ftrace sysfs düğümleri /sys/kernel/tracing konumunda ve izleniyor etkinlikler /sys/kernel/tracing/events kategorilerine ayrılır.

Etkinlikleri kategori bazında etkinleştirmek için şunu kullanın:

echo 1 > /sys/kernel/tracing/events/irq/enable

Etkinlikleri etkinlik bazında etkinleştirmek için şunu kullanın:

echo 1 > /sys/kernel/tracing/events/sched/sched_wakeup/enable

Syfs düğümlerine yazarak ek etkinlikler etkinleştirildiyse, bunlar azaltılamaz. Ortak bir kalıp Qualcomm cihaz görünümü için kgsl (GPU) ve mdss (görüntülü reklam ardışık düzeni) izleme noktaları, ardından atrace veya sistem izleme:

adb shell "echo 1 > /sys/kernel/tracing/events/mdss/enable"
adb shell "echo 1 > /sys/kernel/tracing/events/kgsl/enable"
./systrace.py sched freq idle am wm gfx view binder_driver irq workq ss sync -t 10 -b 96000 -o full_trace.html

Ftrace'i, iz veya sis izleme olmadan da kullanabilirsiniz. yalnızca çekirdekten oluşan izleri istediğinizde (veya video hazırlamaya vakit ayırıp kullanıcı modu izleme özelliğini elle değiştirebilirsiniz). Sadece ftrace'i çalıştırmak için:

  1. Arabellek boyutunu iz için yeterince büyük bir değere ayarlayın:
    echo 96000 > /sys/kernel/tracing/buffer_size_kb
    
  2. İzlemeyi etkinleştir:
    echo 1 > /sys/kernel/tracing/tracing_on
    
  3. Testinizi çalıştırın, ardından izlemeyi devre dışı bırakın:
    echo 0 > /sys/kernel/tracing/tracing_on
    
  4. İzi aktarın:
    cat /sys/kernel/tracing/trace > /data/local/tmp/trace_output
    

trace_Exit, izlemeyi metin biçiminde verir. Bunu görselleştirmek için Mancınık, alın Catapult deposunu ziyaret edin ve trace2html'yi çalıştırın:

catapult/tracing/bin/trace2html ~/path/to/trace_file

Varsayılan olarak bu, trace_file.html değerini aynı dizin.

Etkinlikleri ilişkilendirme

Catapult görselleştirmesine ve ftrace'e bakmak genellikle günlüğe aynı anda kaydeder; Örneğin, bazı ftrace etkinlikleri (özellikle tedarikçiye özgü Catapult tarafından görselleştirilmez. Ancak Catapult'un zaman damgaları izlemedeki ilk etkinlikle veya belirli bir zaman damgasına göre atrace tarafından döküm alınırken, ham ftrace zaman damgaları belirli bir mutlak saat kaynağı olarak ayarlar.

Bir Catapult etkinliğinden belirli bir ftrace etkinliğini bulmak için:

  1. Ham ftrace günlüğünü açın. Sistem izlemenin son sürümlerindeki izler: varsayılan olarak sıkıştırılmış:
    • Sistem izlemenizi --no-compress ile yakaladıysanız bu html dosyasına ekleyerek başlayın.
    • Değilse Catapult ağaç (tracing/bin/html2trace) simgesini tıklayın.
  2. Catapult görselleştirmesinde göreli zaman damgasını bulun.
  3. İzin başında şunu içeren bir satır bulun: tracing_mark_sync Şuna benzer bir görünümde olacaktır:
    <5134>-5134  (-----) [003] ...1    68.104349: tracing_mark_write: trace_event_clock_sync: parent_ts=68.104286
    

    Bu satır yoksa (veya ftrace'i iz olmadan kullandıysanız) zamanlamalar, ftrace günlüğündeki ilk olaya göre belirlenir.
    1. İlgili zaman damgasını (milisaniye cinsinden) değere parent_ts (saniye cinsinden).
    2. Yeni zaman damgasını arayın.

Bu adımlar sizi etkinliğe (veya en azından çok yakınına) götürecektir.

Dinamik ftrace kullan

Sistem izleme ve standart ftrace yetersiz olduğunda, dinamik ftrace. Dinamik yüzler yeniden yazmayı içerir ve dolayısıyla üretimde kullanılamaz. ekleyebilirsiniz. Ancak oyundaki her bir zorlu performans hatası 2015 ve 2016 yıllarının sonunda dinamik ftrace kullanıldı. Özellikle de Yığın izleme (stack trace) sağladığından kesintisiz uykularda hata ayıklamak için güçlü bir çözümdür. ekleyebilirsiniz. Ayrıca, kesintiler ve geçici kesintiler devre dışı olan bölümlerde hata ayıklayabilirsiniz. kanıtlamak için çok faydalı olabilir.

Dinamik ftrace'i açmak için çekirdeğinizin tanım yapılandırmasını düzenleyin:

  1. Varsa CONFIG_STRICT_MEMORY_RWX öğesini kaldırın. 3.18 veya daha yeni ve arm64 ise orada yok.
  2. Şunu ekleyin: CONFIG_DYNAMIC_FTRACE=y, CONFIG_FUNCTION_TRACER=y, CONFIG_IRQSOFF_TRACER=y, CONFIG_FUNCTION_PROFILER=y ve CONFIG_PREEMPT_TRACER=y
  3. Yeni çekirdeği yeniden derleyin ve başlatın.
  4. Kullanılabilir izleyicileri kontrol etmek için aşağıdaki komutu çalıştırın:
    cat /sys/kernel/tracing/available_tracers
    
  5. Komutun function, irqsoff ve preemptoff ve preemptirqsoff.
  6. Dinamik ftrace'in çalıştığından emin olmak için aşağıdaki komutu çalıştırın:
    cat /sys/kernel/tracing/available_filter_functions | grep <a function you care about>
    

Bu adımları tamamladıktan sonra, dinamik ftrace (fonksiyon profil aracı), irqsoff profil aracı ve önleme amaçlı profil aracı kullanılabilir. Kesinlikle kullanmadan önce bu konularla ilgili ftrace dokümanlarını okumanızı öneririz çünkü bunlar güçlü ama karmaşık. irqsoff ve öncelikli olarak sürücülerin, kesinti veya önleme amaçlı olarak ayrıldığını doğrulamak için kullanışlıdır. çok uzun süre kapatıldı.

İşlev profil aracı, performans sorunları için en iyi seçenektir ve genellikle bir işlevin nerede çağrıldığını bulmak için kullanılır.

Bu sorunda, Pixel XL kullanarak HDR+ fotoğraf çekin, ardından hemen vizörün döndürülmesi her defasında stabiliteye neden oldu. Fonksiyon profil aracını kullanarak bir saatten kısa sürede hata ayıklaması gerekir. Örneği devam ettirecek olursak, izlemelerin ZIP dosyasını indirin (ayrıca bu bölümde bahsedilen diğer izleri içeriyorsa), dosyanın sıkıştırmasını açın ve trace_30898724.html dosyasını tarayıcınızda kaydedin.

İz, kamera sunucusu işlemindeki engellenen iş parçacıklarını gösterir. ion_client_destroy adlı cihazda kesintisiz uyku. Bu, pahalı ancak çok nadir olarak çağrılmalıdır çünkü iyon istemcileri pek çok tahsisi kapsayabilir. Başta suç, Google Ads'deki Altıgen Halide (bunun her müşteri için yeni bir müşteri iyon ayırma ve ayırma serbest bırakıldığında istemci yok edilir. Bu da çok pahalıydı). Tüm altıgen için tek iyon istemciye geçme tahsisler durumu iyileştirdi ancak sıkıntı düzeltilmedi.

Şu anda ion_client_destroy adlı kişiyi kimin aradığını öğrenmemiz gerekiyor. işlev profili oluşturucuyu kullanabilirsiniz:

  1. İşlevler bazen derleyici tarafından yeniden adlandırıldığından, ion_client_destroy, şunları kullanarak ulaşır:
    cat /sys/kernel/tracing/available_filter_functions | grep ion_client_destroy
    
  2. Burada olduğunu onayladıktan sonra bunu ftrace filtresi olarak kullanın:
    echo ion_client_destroy > /sys/kernel/tracing/set_ftrace_filter
    
  3. İşlev profil aracını açın:
    echo function > /sys/kernel/tracing/current_tracer
    
  4. Bir filtre işlevi çağrıldığında yığın izlemeyi (stack trace) etkinleştirin:
    echo func_stack_trace > /sys/kernel/tracing/trace_options
    
  5. Arabellek boyutunu artırın:
    echo 64000 > /sys/kernel/tracing/buffer_size_kb
    
  6. İzlemeyi aç:
    echo 1 > /sys/kernel/tracing/trace_on
    
  7. Testi çalıştırın ve izini alın:
    cat /sys/kernel/tracing/trace > /data/local/tmp/trace
    
  8. Çok sayıda yığın izlemeyi (stack trace) görmek için izleme sayfasını görüntüleyin:
        cameraserver-643   [003] ...1    94.192991: ion_client_destroy <-ion_release
        cameraserver-643   [003] ...1    94.192997: <stack trace>
     => ftrace_ops_no_ops
     => ftrace_graph_call
     => ion_client_destroy
     => ion_release
     => __fput
     => ____fput
     => task_work_run
     => do_notify_resume
     => work_pending
     

İyon sürücüsünün incelenmesi sonucunda, ion_client_destroy, bir kullanıcı alanı işlevi tarafından spam'e gönderiliyor /dev/ion öğesine bir fd olarak gönderilir, rastgele çekirdek sürücüsü değildir. \"/dev/ion\" için Android kod tabanı, birçok tedarikçi firmanın Altıgen sürücüyle aynı şeyi yapıyor ve telefonu açıp kapanıyor /dev/ion (yeni bir iyon istemcisi oluşturma ve kaldırma) yeni bir iyon ayrılması gerekiyor. Bunları kullan sürecin ömrü boyunca tek bir iyon istemcinin olması hatayı düzeltti.


İşlev profil aracındaki veriler yeterince spesifik değilse ftrace trace noktalarından yararlanmanız gerekir. ftrace etkinlikleri şurada etkinleştirilebilir: her zamanki gibi çalışır ve izleriniz arasına eklenirler. Belirli bir uykuda zaman zaman kesintisiz bir şekilde uyuyabiliyorsanız hata ayıklamak istediğiniz fonksiyon: ftrace filtresini istediğiniz fonksiyona ayarlayın, izleme noktalarını etkinleştirin, iz alın. Sonuçta elde edilen izlemeyi şununla ayrıştırabilirsiniz: trace2html, istediğiniz etkinliği bulun ve ardından yakındaki yığın izlemeleri (stack trace) edinin bu geri bildirimlere örnektir.

Lockstat'ı kullan

Bazen yüz tanıma tek başına yeterli olmaz ve birtakım değişiklikler çekirdek kilidi anlaşmazlığı olabilir. Denemeye değer bir çekirdek seçeneği daha var: CONFIG_LOCK_STAT Oldukça kapsamlı olduğundan bu, Android cihazlarda çalışmak daha zordur çünkü daha büyük bir çekirdeğe sahip olması gerekir.

Ancak, Lockstat, hata ayıklamayı bu da pek çok uygulama için yararlı bir özelliktir. Herkes üzerinde çalışırken bu seçeneğin çalışmasını sağlamanın bir yolunu bulmalıdır. çünkü bir kere "LOCK_STAT hizmetini yalnızca ben etkinleştirebilseydim bunu onaylayabilir veya çürütebilirdim sorunu beş gün yerine beş dakika içinde gösterdik.”

Bu sorunda, tüm çekirdekler maksimum değerdeyken SCHED_FIFO iş parçacığı durdu SCHED_FIFO olmayan iş parçacıklarıyla yüklenir. Önemli miktarda kilit gösteren izler vardı bir fd'yle ilgili çekişme var, ancak kullanımdaki fd'yi kolayca belirleyemedik. Örnekteki adımları takip etmek için ZIP dosyasını iz dosyasını (bu belgede atıfta bulunulan diğer izleri de içerir) bölümünde), dosyanın sıkıştırmasını açın ve trace_30905547.html dosyasını tarayıcınızda açın.

Bir kullanıcının, yalnızca tarama sırasında tıkanıklık yaşamasına sebep olan düşük öncelikli iş parçacığı ftrace borusuna yazmaya başlar ve ardından . Böyle bir senaryoda bir dizi son derece düşük öncelikli ileti dizilerinin ftrace işaretçisi ile birlikte gösterilen yüksek öncelikli iş parçacıkları, tamamen yüklenmiş bir cihazı simüle eder.

Hata ayıklamak için ftrace'i kullanamadığımız için LOCK_STAT çalışan ve ardından uygulamadan diğer tüm izleme özelliğini kapatın. Sonuçlarda kilit gösterildi Bu çekişme, asılsızlıktan kaynaklanıyordu. Çünkü hiçbir çekişme kilit izini çıkarır.


Bir çekirdeği yapılandırma seçeneğiyle başlatabiliyorsanız kilit izleme, ftrace:

  1. İzlemeyi etkinleştir:
    echo 1 > /proc/sys/kernel/lock_stat
    
  2. Testinizi çalıştırın.
  3. İzlemeyi devre dışı bırak:
    echo 0 > /proc/sys/kernel/lock_stat
    
  4. İzinizi aktarın:
    cat /proc/lock_stat > /data/local/tmp/lock_stat
    

Elde edilen çıkışı yorumlama konusunda yardım almak için Lockstat belgelerine bakın <kernel>/Documentation/locking/lockstat.txt adresinde bulabilirsiniz.

Tedarikçi firma izleme noktalarını kullanma

İlk olarak yukarı akış izleme noktalarını kullanın ancak bazen tedarikçi izleme noktalarını kullanmanız gerekir:

  { "gfx",        "Graphics",         ATRACE_TAG_GRAPHICS, {
        { OPT,      "events/mdss/enable" },
        { OPT,      "events/sde/enable" },
        { OPT,      "events/mali_systrace/enable" },
    } },

İzleme noktaları, HAL hizmeti tarafından genişletilebilir. Böylece, cihaza özel izleme ekleyebilirsiniz puan/kategori. İzleme noktaları perfetto, atrace/systrace ve cihaz üzerindeki sistemle entegredir bir izleme uygulamasıdır.

İzleme noktalarını/kategorileri uygulamaya yönelik API'ler şunlardır:

  • listCategory()generates (vec<TracingCategory> kategorileri);
  • enabledCategory(vec<string> category) öğesi (Durum durumu) oluşturur;
  • disabledAllCategory() öğesini (Durum durumu) oluşturur;
ziyaret edin. Daha fazla bilgi için HAL tanımına ve AOSP: