Ürün Haberleri

Android Performansını Artırma: Çekirdek için AutoFDO ile Tanışın

Okuma süresi: 4 dk.
Charles Munger'ın profilini görüntüle
Yabin Cui Yazılım Mühendisi

Biz Android LLVM araç zinciri ekibiyiz. En önemli önceliklerimizden biri, LLVM ekosistemindeki optimizasyon teknikleri aracılığıyla Android performansını iyileştirmektir. Android'i daha hızlı, daha sorunsuz ve daha verimli hale getirmenin yollarını sürekli olarak araştırıyoruz. Optimizasyon çalışmalarımızın çoğu kullanıcı alanında gerçekleşse de çekirdek, sistemin kalbi olmaya devam ediyor. Bugün, kullanıcılara önemli performans avantajları sağlamak için Otomatik Geri Bildirime Dayalı Optimizasyon'u (AutoFDO) Android çekirdeğine nasıl getirdiğimizi paylaşmaktan heyecan duyuyoruz.

AutoFDO nedir?

Standart bir yazılım derlemesi sırasında derleyici, statik kod ipuçlarına göre bir işlevin satır içine alınıp alınmayacağı ve bir koşulun hangi dalının alınacağı gibi binlerce küçük karar verir.Bu sezgisel yöntemler faydalı olsa da gerçek hayatta telefon kullanımı sırasında kod yürütmeyi her zaman doğru şekilde tahmin etmez.

AutoFDO, derleyiciye rehberlik etmek için gerçek hayattaki yürütme kalıplarını kullanarak bu durumu değiştirir. Bu kalıplar, kodun gerçek kullanım sırasında izlediği en yaygın talimat yürütme yollarını temsil eder ve CPU'nun dallanma geçmişi kaydedilerek yakalanır. Bu veriler filo cihazlarından toplanabilir ancak çekirdek için en popüler 100 uygulamayı çalıştırmak gibi temsili iş yüklerini kullanarak laboratuvar ortamında sentezlenir. Bu verileri yakalamak için örnekleme profili oluşturucu kullanırız. Bu sayede kodun hangi bölümlerinin "etkin" (sık kullanılan) ve hangilerinin "etkin olmayan" olduğunu belirleriz. Çekirdeği bu profillerle yeniden oluşturduğumuzda derleyici, gerçek Android iş yüklerine göre uyarlanmış çok daha akıllı optimizasyon kararları verebilir.

Bu optimizasyonun etkisini anlamak için aşağıdaki önemli bilgileri göz önünde bulundurun:

  • Android'de çekirdek, CPU süresinin yaklaşık% 40'ını oluşturur.
  • Kullanıcı alanındaki yerel yürütülebilir dosyaları ve kitaplıkları optimize etmek için AutoFDO'yu kullanıyoruz. Bu sayede soğuk uygulama başlatma süresinde yaklaşık% 4 iyileşme ve başlatma süresinde% 1 azalma elde ediyoruz.

Gerçek Dünyada Performans Başarıları

Kontrollü laboratuvar ortamlarındaki profillerden yararlanarak önemli Android metriklerinde etkileyici iyileştirmeler elde ettik. Bu profiller, uygulama tarama ve başlatma kullanılarak toplanmış ve Pixel cihazlarda 6.1, 6.6 ve 6.12 çekirdekleri genelinde ölçülmüştür.

En belirgin iyileştirmeler aşağıda listelenmiştir. Bu çekirdek sürümlerinin AutoFDO profilleriyle ilgili ayrıntıları, android16-6.12 ve android15-6.6 çekirdekleri için ilgili Android çekirdek depolarında bulabilirsiniz.

boosting_2.png

Bunlar sadece teorik rakamlar değil. Bu sayede son kullanıcı daha hızlı bir arayüz, daha hızlı uygulama geçişi, daha uzun pil ömrü ve genel olarak daha duyarlı bir cihaz deneyimi yaşar.

İşleyiş şekli: Ardışık düzen

Dağıtım stratejimiz, profillerin alakalı kalmasını ve performansın istikrarlı olmasını sağlamak için gelişmiş bir ardışık düzen içerir.

boosting_3.png

1. adım: Profil koleksiyonu

Kullanıcı alanı ikili dosyalarının profilini çıkarmak için şirket içi test filomuzu kullanırken Genel Çekirdek Resmi (GKI) için kontrollü bir laboratuvar ortamına geçtik. Profil oluşturma işleminin cihaz sürüm döngüsünden ayrılması, dağıtılan çekirdek sürümlerinden bağımsız olarak esnek ve anında güncellemeler yapılmasını sağlar. Testler, laboratuvar tabanlı bu verilerin gerçek filolardan elde edilenlere benzer performans artışları sağladığını doğruluyor.

  • Araçlar ve Ortam: Test cihazlarına en son çekirdek görüntüsünü yükler ve talimat yürütme akışlarını yakalamak için simpleperf'ü kullanırız. Bu işlem, dal geçmişini kaydetmek için donanım özelliklerini kullanır. Özellikle Pixel cihazlarda  ARM Embedded Trace Extension (ETE) ve ARM Trace Buffer Extension (TRBE) kullanılır.
  • İş yükleri: Android Uygulama Uyumluluğu Test Paketi'ndeki (C-Suite) en popüler 100 uygulamayı kullanarak temsili bir iş yükü oluştururuz. En doğru verileri elde etmek için şunlara odaklanırız:
    • Uygulama Başlatma: En belirgin kullanıcı gecikmeleri için optimizasyon yapma
    • Yapay Zeka Destekli Uygulama Tarama: Sürekli ve gelişen kullanıcı etkileşimlerini simüle etme
    • Sistem genelinde izleme: Yalnızca ön planda çalışan uygulama etkinliklerini değil, aynı zamanda kritik arka plan iş yüklerini ve süreçler arası iletişimleri de yakalar.
  • Doğrulama: Bu sentezlenmiş iş yükü, dahili filomuzdan toplanan yürütme kalıplarıyla % 85 benzerlik gösterir.
  • Hedeflenen Veriler: Bu testleri yeterince tekrarlayarak en popüler uygulamalarla gerçek dünyadaki kullanıcı etkileşimini doğru şekilde temsil eden yüksek doğruluklu yürütme kalıpları elde ederiz. Ayrıca bu genişletilebilir çerçeve, kapsamımızı genişletmek için ek iş yüklerini ve karşılaştırmaları sorunsuz bir şekilde entegre etmemize olanak tanır.

2. adım: Profil işleme

Ham izleme verilerini temiz, etkili ve derleyiciye hazır hale getirmek için sonradan işleriz.

  • Toplama: Birden fazla test çalıştırmasından ve cihazdan elde edilen verileri tek bir sistem görünümünde birleştiririz.
  • Dönüştürme: Ham izleri AutoFDO profil biçimine dönüştürür ve gerektiğinde istenmeyen simgeleri filtreleriz.
  • Profil kırpma: "Soğuk" işlevlere ait verileri kaldırmak için profilleri kırparak standart optimizasyonu kullanmalarına olanak tanırız. Bu sayede, nadiren kullanılan kodlarda gerileme önlenir ve ikili program boyutunda gereksiz artışlar engellenir.

3. adım: Profil testi

Profiller, dağıtımdan önce sıkı bir doğrulama sürecinden geçer. Bu sayede, kararlılık riski olmadan tutarlı performans artışları sağlanır.

  • Profil ve ikili program analizi: Yeni profilin içeriğini (etkin işlevler, örnek sayıları ve profil boyutu dahil) önceki sürümlerle titizlikle karşılaştırırız. Profili, yeni bir çekirdek görüntüsü oluşturmak için de kullanırız. Metin bölümünde yapılan değişikliklerin beklentilerle tutarlı olduğundan emin olmak için ikili programları analiz ederiz.
  • Performans doğrulama: Yeni çekirdek imajında hedeflenen karşılaştırmaları çalıştırırız. Bu, önceki referanslar tarafından belirlenen performans iyileştirmelerinin korunduğunu doğrular.

Sürekli güncellemeler

Kod zaman içinde doğal olarak "değişir". Bu nedenle, statik bir profil zamanla etkinliğini kaybeder. En yüksek performansı korumak için ardışık düzeni sürekli olarak çalıştırarak düzenli güncellemeler yapıyoruz:

  • Düzenli yenileme: Her GKI sürümünden önce Android çekirdeği LTS dallarındaki profilleri yenileyerek her derlemenin en son profil verilerini içermesini sağlarız.
  • Gelecekteki genişletme: Şu anda bu güncellemeleri android16-6.12 ve android15-6.6 dallarına sunuyoruz. Yakında çıkacak android17-6.18 gibi daha yeni GKI sürümlerine de destek vereceğiz.

Kararlılığı sağlama

Profile dayalı optimizasyonla ilgili yaygın sorulardan biri, kararlılık riskleri oluşturup oluşturmadığıdır. AutoFDO, kaynak kodun mantığını değiştirmek yerine öncelikle derleyici sezgisel yöntemlerini (ör. işlev satır içi ve kod düzeni) etkilediğinden çekirdeğin işlevsel bütünlüğünü korur. Bu teknoloji, yıllardır Android platform kitaplıkları, ChromeOS ve Google'ın kendi sunucu altyapısı için standart bir optimizasyon olarak kullanılarak ölçekte başarısını kanıtlamıştır.

Tutarlı davranışı daha da garanti altına almak için "varsayılan olarak muhafazakar" bir strateji uygularız. Yüksek kaliteli profillerimizde yakalanmayan işlevler, standart derleyici yöntemleri kullanılarak optimize edilir. Bu sayede, çekirdeğin "soğuk" veya nadiren yürütülen bölümleri standart bir derlemedeki gibi davranır. Böylece performans düşüşleri veya uç durumlarda beklenmedik davranışlar önlenir.

Gelecekte

Şu anda AutoFDO'yu android16-6.12 ve android15-6.6 dallarında dağıtıyoruz. Bu ilk lansmanın ötesinde, teknolojiyi daha da geliştirmek için umut vadeden birkaç yol görüyoruz:

  • Daha geniş kapsam: AutoFDO profillerini daha yeni GKI çekirdek sürümlerine ve mevcut aarch64 desteğinin ötesindeki ek derleme hedeflerine dağıtmayı planlıyoruz.
  • GKI modülü optimizasyonu: Optimizasyonumuz şu anda ana çekirdek ikili dosyasına (vmlinux) odaklanmaktadır. AutoFDO'nun GKI modüllerini kapsayacak şekilde genişletilmesi, çekirdek alt sisteminin daha büyük bir bölümünde performans avantajları sağlayabilir.
  • Tedarikçi modülü desteği: Sürücü Geliştirme Kiti (DDK) kullanılarak oluşturulan tedarikçi modülleri için AutoFDO'yu desteklemek istiyoruz. Derleme sistemimizde (Kleaf) ve profil oluşturma araçlarımızda (simpleperf) zaten mevcut olan destek sayesinde tedarikçiler, aynı optimizasyon tekniklerini kendi donanım sürücülerine uygulayabilir.
  • Daha Geniş Profil Kapsamı: Daha geniş bir Kritik Kullanıcı Yolculuğu (CUJ) yelpazesinden profil toplayarak bunları optimize etme potansiyeli vardır.

AutoFDO'yu Android çekirdeğine getirerek işletim sisteminin temelinin, cihazınızı her gün kullanma şeklinize göre optimize edilmesini sağlıyoruz.

Yazan:
Okumaya devam et