# 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 Worker**lar, 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 Worker**lar 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](#profile-vosita)
2. [Perfetto va Chrome Tracing orqali trace tahlili](#perfetto)
3. [Critical Path (Kritik yo'l) bo'yinbog'i va uni yechish](#critical-path)
4. [Swift Persistent Worker'lar: Xotiradagi kompilyator](#persistent-workers)
5. [Bazel JVM va xotira boshqaruvi: Garbage Collection tuning](#jvm-memory)
6. [Remote Cache vs Remote Execution (RBE)](#rbe-farqi)
7. [RBE qanday ishlaydi: Bulutdagi yuzlab yadrolar](#rbe-ishlash)
8. [Apple platformasida RBE qiyinchiliklari va yechimlari](#apple-rbe)
9. [Amaliy mashqlar](#mashqlar)
10. [O'zingizni tekshiring](#checklist)
11. [Xulosa](#xulosa)
12. [Manbalar](#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:

```bash
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](/lessons/images/bazel/bazel_18_rbe_execution.svg)

---

## 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](https://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:
```text
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:

```bash
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!

`.bazelrc`da yoqish:

```ini
# 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:

```ini
# 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:

| Xususiyat | Remote Cache | Remote Execution (RBE) |
|:---|:---|:---|
| **Kompilyatsiya qayerda bo'ladi?** | Sizning mahalliy Mac kompyuteringizda | Bulutdagi maxsus serverlarda |
| **Mac protsessoriga yuklama** | 100% yuklanadi (noutbuk qiziydi) | 5% (faqat buyruq uzatadi) |
| **Parallelizm darajasi** | Sizning Mac yadrolari bilan cheklangan (8–16) | 200–500 ta bulut yadrolari parallel! |
| **Internet tezligi talabi** | O'rtacha | Juda yuqori (har bir action uzatiladi) |
| **Narxi** | Arzon (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 `ld`ni Mac mini fermasida yugurtirish.

---

## Amaliy mashqlar {#mashqlar}

1. **O'z loyihangiz trace profilini oling.** O'tgan darslardagi loyihalardan birida:
   ```bash
   bazel build --profile=my_trace.json //...
   ```
   qiling va `ui.perfetto.dev`da ochib, eng uzoq davom etgan 3 ta Action nomini toping.
2. **Persistent Worker'larni sinang.** `.bazelrc`da `--strategy=SwiftCompile=worker` qo'shib, kichik fayl o'zgargandagi build vaqtini solishtiring.
3. ⭐ **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}

- Build vaqtini kamaytirish — bu shunchaki "kuchliroq kompyuter sotib olish" emas, balki **grafik arxitekturasi va profillash san'atidir**.
- Critical path'ni to'g'ri tahlil qilish orqali siz loyihangizning eng sekin joylarini aniqlaysiz.
- Keyingi darsda biz mavjud an'anaviy Xcode loyihalarini yoki SPM paketlarini bosqichma-bosqich Bazel'ga qanday ko'chirishni (Migratsiya) o'rganamiz!
- **Keyingi dars:** [Bazel 19: Xcode/SPM loyihasidan Bazel'ga migratsiya: strategiya, bosqichma-bosqich o'tish va real hikoyalar](/ios-lessons/bazel-19-migratsiya)

---

## Manbalar {#manbalar}

1. [Bazel Documentation — Profiling and Performance](https://bazel.build/advanced/performance/json-trace-profile) — Rasmiy JSON trace profil qo'llanmasi.
2. [Perfetto UI](https://ui.perfetto.dev/) — Google'ning ochiq kodli performance tahlil vositasi.
3. [BuildBuddy — Remote Execution for iOS](https://www.buildbuddy.io/) — Enterprise RBE yechimlari va arxitekturasi.
