Azimjon Abdurasulov

Bazel 18: Performance tuning va Remote Execution: profil, critical path, worker'lar, xotira va RBE

📦 Bazel iOS — Mukammal Qo‘llanma & Amaliyot

Bazel 18: Performance tuning va Remote Execution: profil, critical path, worker'lar, xotira va RBE

Holat: 2026-yil oktabr. Ushbu darsda biz Bazel tizimini oxirgi tomchisigacha tezlashtirishni (Performance Tuning) o'rganamiz: --profile yordamida Chrome Trace va Perfetto orqali millisoniyalik tahlil, eng xatarli bo'yinbog' — Critical Path (Kritik yo'l) diagnostikasi, xotirada doimiy yashovchi Persistent Workerlar, JVM xotira boshqaruvi va eng cho'qqi bosqich — Remote Execution (RBE): barcha actionlarni noutbukingizda emas, bulutdagi yuzlab parallel serverlarda yugurtirish. Kod misollari Bazel 9.3.0, rules_swift 4.2.1 va Xcode 27.1'da tekshirilgan.

Bu darsdan keyin siz: har qanday sekinlashgan build jarayonini profil qilib, qaysi Swift fayl yoki modul bo'yinbog' bo'layotganini aniqlay olasiz, noutbukingiz qizib ketmasligi uchun persistent worker'larni yoqasiz va yuzlab bulut serverlarini ulash orqali build vaqtini daqiqalardan soniyalarga tushirasiz.

  • --profile=trace.json flagi orqali har bir Action vaqtini Perfetto / Chrome Tracing'da vizual ko'rishni o'rganasiz.
  • Critical Path nima ekanini va nega ko'p yadroli kuchli Mac ham ba'zan sekin ishlashini matematik tushunasiz.
  • Persistent Workerlar quvvatini yoqasiz: swiftc har safar yangidan yuklanmasdan, xotirada doimiy qolib 2–3 barobar tezroq ishlaydi.
  • Remote Cache va Remote Execution (RBE) o'rtasidagi tub farqni bilib olasiz.
  • Kompaniyangizda RBE fermasini (BuildBuddy, EngFlow) qanday ulashni va macOS arxitekturasining nozik jihatlarini o'rganasiz.

Mundarija

  1. Kompilyatsiya qayerda sekinlashyapti: --profile vositasi
  2. Perfetto va Chrome Tracing orqali trace tahlili
  3. Critical Path (Kritik yo'l) bo'yinbog'i va uni yechish
  4. Swift Persistent Worker'lar: Xotiradagi kompilyator
  5. Bazel JVM va xotira boshqaruvi: Garbage Collection tuning
  6. Remote Cache vs Remote Execution (RBE)
  7. RBE qanday ishlaydi: Bulutdagi yuzlab yadrolar
  8. Apple platformasida RBE qiyinchiliklari va yechimlari
  9. Amaliy mashqlar
  10. O'zingizni tekshiring
  11. Xulosa
  12. Manbalar

1. Kompilyatsiya qayerda sekinlashyapti: --profile vositasi {#profile-vosita}

Build 45 soniya davom etyapti. Lekin aynan nima sekin ishlayapti?

  • Swiftc bitta qiyin tipni (type inference) tekshirishga 12 soniya sarflayaptimi?
  • Asset Catalog resurslari siqilyaptimi?
  • Linker sekin ishlayaptimi yoki diskka yozish jarayonimi?

Bazel'da taxmin qilishga hojat yo'q. Bazel har bir mikro-operatsiyani o'lchaydigan o'rnatilgan profaylerga ega:

bazel build --profile=build_trace.json //App:SuperApp

Ushbu buyruq tugagach, ildiz papkada build_trace.json fayli hosil bo'ladi. U barcha yadrolar, iplar (threads) va Action'lar qachon boshlanib, qachon tugaganini aniq vaqt belgisi bilan saqlaydi.

Performance Tuning va Remote Execution (RBE) arxitekturasi


2. Perfetto va Chrome Tracing orqali trace tahlili {#perfetto}

Hosil bo'lgan build_trace.json faylini ochish uchun:

  1. Google Chrome brauzerida **ui.perfetto.dev** saytini oching (yoki chrome://tracing).
  2. Open trace file tugmasini bosib, build_trace.json faylini yuklang.

Sizning ko'z o'ngingizda geymerlar va tizim muhandislariga tanish bo'lgan interaktiv vaqt lentasi (Timeline) paydo bo'ladi:

  • Gorizontal o'q: Vaqt (0.0s dan 45.0s gacha).
  • Vertikal qatorlar: Sizning M4 Pro protsessoringizning har bir yadrosi (Thread 1, Thread 2 ... Thread 12).
  • Har bir blok ustiga bossangiz, aynan qaysi Swift fayl qancha millisoniya vaqt olgani, qaysi flaglar bilan chaqirilgani ko'rinadi!

3. Critical Path (Kritik yo'l) bo'yinbog'i va uni yechish {#critical-path}

Trace faylini ochganingizda eng ko'p uchraydigan manzara: Boshida 12 ta yadro 100% quvvatda ishlaydi (yashil chiziqlar to'liq). Keyin esa to'satdan 11 ta yadro bo'sh qolib, faqat bitta yadroda bitta uzun qizil blok 15 soniya davom etadi.

Bu hodisa Critical Path (Kritik yo'l) deb ataladi:

Kritik yo'l — bu dependencylar grafigidagi eng uzun ketma-ket zanjir. Sizda 12 ta emas, hatto 1,000 ta protsessor yadrosi bo'lsa ham, umumiy build vaqti hech qachon kritik yo'ldan qisqaroq bo'la olmaydi!

Misol:

Core (5s) ──► Network (8s) ──► Storage (7s) ──► AppLink (6s) = 26 soniya!

Bu zanjir parallel qurila olmaydi, chunki har biri oldingisining natijasini kutishi shart.

Yechim: Dependency Graph Flattening (Grafikni yassilash)

  • Storage moduli Network moduliga bog'liq bo'lmasligi kerak.
  • Ularni umumiy protokollar (Core) orqali parallel qilib qo'yish kerak.
  • Natijada Network va Storage bir vaqtning o'zida parallel quriladi va kritik yo'l 26 soniyadan 19 soniyaga qisqaradi!

Bazel konsolda kritik yo'lni to'g'ridan-to'g'ri chop eta oladi:

bazel build --profile=trace.json //App:SuperApp
# Konsolda avtomatik chiqadi:
# Critical Path: 14.2s (action: SwiftCompile //Core:Core)

4. Swift Persistent Worker'lar: Xotiradagi kompilyator {#persistent-workers}

Har safar bitta kichik fayl o'zgarganda nima sodir bo'ladi? An'anaviy tizimda operatsion tizim:

  1. Yangi jarayon (process) ochadi.
  2. swiftc binarini diskdan xotiraga yuklaydi.
  3. Swift standart kutubxonalarini parse qiladi.
  4. Kodni kompilyatsiya qiladi va jarayonni yopadi.

Bu jarayonning o'zi 0.5–1.0 soniya "overhead" (qo'shimcha xarajat) oladi!

Bazel'da Persistent Workers (Doimiy ishchilar) mexanizmi bor: Bazel fonda swiftc kompilyatorini doimiy xotirada (daemon rejimida) ushlab turadi. Yangi action kelganda, u yangi jarayon ochmasdan, xotiradagi tayyor kompilyatorga IPC orqali topshiriq beradi!

.bazelrcda yoqish:

# Swift kompilyatsiyasini persistent worker orqali bajarish
build --strategy=SwiftCompile=worker
build --worker_max_instances=8
build --worker_quit_after_build=false

Natija: kichik incremental o'zgarishlar vaqti 0.8 soniyadan 0.2 soniyaga tushadi!


5. Bazel JVM va xotira boshqaruvi: Garbage Collection tuning {#jvm-memory}

Bazel serverining o'zi Java (JVM) tilida yozilgan. Juda katta monorepolarda (10,000+ target) agar xotira kam berilsa, Java Garbage Collector (GC) har 5 soniyada tizimni to'xtatib qotirib qo'yishi mumkin.

Katta loyihalar uchun .bazelrc xotira tavsiyasi:

# Bazel serveriga 8GB xotira ajratish va tezkor GC tanlash
startup --host_jvm_args=-Xmx8g
startup --host_jvm_args=-XX:+UseG1GC
startup --host_jvm_args=-XX:MaxGCPauseMillis=100

Bu Bazel serveri xotira yetishmovchiligi tufayli qotib qolmasligini kafolatlaydi.


6. Remote Cache vs Remote Execution (RBE) {#rbe-farqi}

Ko'pchilik dasturchilar bu ikkisini adashtirishadi:

XususiyatRemote CacheRemote Execution (RBE)
Kompilyatsiya qayerda bo'ladi?Sizning mahalliy Mac kompyuteringizdaBulutdagi maxsus serverlarda
Mac protsessoriga yuklama100% yuklanadi (noutbuk qiziydi)5% (faqat buyruq uzatadi)
Parallelizm darajasiSizning Mac yadrolari bilan cheklangan (8–16)200–500 ta bulut yadrolari parallel!
Internet tezligi talabiO'rtachaJuda yuqori (har bir action uzatiladi)
NarxiArzon (oddiy S3/Nginx storage)Qimmatroq (CPU klasteri talab etiladi)

7. RBE qanday ishlaydi: Bulutdagi yuzlab yadrolar {#rbe-ishlash}

RBE ochilganda, sizning Mac kompyuteringiz endi kodni o'zi kompilyatsiya qilmaydi:

  1. Bazel har bir Action uchun kirish fayllarini va buyruqni paketlaydi.
  2. gRPC protokoli orqali bulutdagi RBE klasteriga (masalan, Google Cloud, AWS yoki BuildBuddy) uzatadi.
  3. Klasterdagi 150 ta server bir vaqtning o'zida har biri bittadan Swift modulni kompilyatsiya qiladi.
  4. Chiqish fayllari keshga yoziladi va sizning Mac'ingizga faqat tayyor yakuniy .app yuklab beriladi.

Natijada: 40 daqiqalik to'liq gigant monolit build 45 soniyada yakunlanadi!


8. Apple platformasida RBE qiyinchiliklari va yechimlari {#apple-rbe}

Backend olamida RBE oson: har qanday Linux serverda Docker ko'tariladi.

Lekin Apple platformasida bitta katta to'siq bor:

Apple EULA cheklovi: macOS va Xcode faqat Apple apparat ta'minotida (Mac mini, Mac Studio, Mac Pro) ishlashi qonuniy ruxsat etilgan! Siz Xcode'ni arzon Linux serverda ishga tushirolmaysiz.

Qanday yechimlar mavjud?

  1. Mac Cloud Fermasi: AWS EC2 Mac instances (mac2.metal M2 Pro) yoki MacStadium klasterlarida RBE serverlarini ko'tarish. (Spotify, Uber uslubi).
  2. Gibrid RBE: C++, Protobuf, Linting va Resurslar kabi platformadan mustaqil actionlarni arzon Linux klasterlarida, faqat swiftc va ldni Mac mini fermasida yugurtirish.

Amaliy mashqlar {#mashqlar}

  1. O'z loyihangiz trace profilini oling. O'tgan darslardagi loyihalardan birida:
bazel build --profile=my_trace.json //...

qiling va ui.perfetto.devda ochib, eng uzoq davom etgan 3 ta Action nomini toping.

  1. Persistent Worker'larni sinang. .bazelrcda --strategy=SwiftCompile=worker qo'shib, kichik fayl o'zgargandagi build vaqtini solishtiring.
  2. ⭐ Critical path qisqartirish tajribasi. Loyihangizda ikkita ketma-ket modulni toping va ularning bog'liqligini uzib, parallel holatga keltiring. Critical path vaqti necha soniyaga kamayganini o'lchang.

O'zingizni tekshiring {#checklist}

  • [ ] --profile=trace.json orqali hosil bo'lgan faylni Perfetto'da qanday o'qishni bilaman.
  • [ ] Critical Path nima ekanini va nima uchun u ko'proq yadro qo'shish bilan tezlashmasligini tushunaman.
  • [ ] Persistent Worker'lar swiftc yuklanish vaqtini qanday qilib yo'q qilishini bilaman.
  • [ ] Remote Cache va Remote Execution (RBE) farqini aniq tushuntirib bera olaman.
  • [ ] Nega Apple platformasida RBE tashkil qilish Linux'ga qaraganda qimmatroq va murakkabroq ekanini bilaman.

Xulosa {#xulosa}


Manbalar {#manbalar}

  1. Bazel Documentation — Profiling and Performance — Rasmiy JSON trace profil qo'llanmasi.
  2. Perfetto UI — Google'ning ochiq kodli performance tahlil vositasi.
  3. BuildBuddy — Remote Execution for iOS — Enterprise RBE yechimlari va arxitekturasi.

Markdown manba

iOS Lessons