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.


İş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.”


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: