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:
- Arabellek boyutunu iz için yeterince büyük bir değere ayarlayın:
echo 96000 > /sys/kernel/tracing/buffer_size_kb
- İzlemeyi etkinleştir:
echo 1 > /sys/kernel/tracing/tracing_on
- Testinizi çalıştırın, ardından izlemeyi devre dışı bırakın:
echo 0 > /sys/kernel/tracing/tracing_on
- İ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:
- 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.
- Sistem izlemenizi
- Catapult görselleştirmesinde göreli zaman damgasını bulun.
- İ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.- İlgili zaman damgasını (milisaniye cinsinden) değere
parent_ts
(saniye cinsinden). - Yeni zaman damgasını arayın.
- İlgili zaman damgasını (milisaniye cinsinden) değere
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:
- Varsa CONFIG_STRICT_MEMORY_RWX öğesini kaldırın. 3.18 veya daha yeni ve arm64 ise orada yok.
- Şunu ekleyin: CONFIG_DYNAMIC_FTRACE=y, CONFIG_FUNCTION_TRACER=y, CONFIG_IRQSOFF_TRACER=y, CONFIG_FUNCTION_PROFILER=y ve CONFIG_PREEMPT_TRACER=y
- Yeni çekirdeği yeniden derleyin ve başlatın.
- Kullanılabilir izleyicileri kontrol etmek için aşağıdaki komutu çalıştırın:
cat /sys/kernel/tracing/available_tracers
- Komutun
function
,irqsoff
vepreemptoff
vepreemptirqsoff
. - 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:
- İzlemeyi etkinleştir:
echo 1 > /proc/sys/kernel/lock_stat
- Testinizi çalıştırın.
- İzlemeyi devre dışı bırak:
echo 0 > /proc/sys/kernel/lock_stat
- İ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;