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.
Sorunu göster: HDR fotoğraf + dönen vizö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:
- İş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
- Burada olduğunu onayladıktan sonra bunu ftrace filtresi olarak kullanın:
echo ion_client_destroy > /sys/kernel/tracing/set_ftrace_filter
- İşlev profil aracını açın:
echo function > /sys/kernel/tracing/current_tracer
- Bir filtre işlevi çağrıldığında yığın izlemeyi (stack trace) etkinleştirin:
echo func_stack_trace > /sys/kernel/tracing/trace_options
- Arabellek boyutunu artırın:
echo 64000 > /sys/kernel/tracing/buffer_size_kb
- İzlemeyi aç:
echo 1 > /sys/kernel/tracing/trace_on
- Testi çalıştırın ve izini alın:
cat /sys/kernel/tracing/trace > /data/local/tmp/trace
- Ç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.”
Sorunu göster: SCHED_FIFO olmayan çekirdekler maksimum yükte olduğunda SCHED_FIFO konumunda duraklıyor
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:
- İ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;