Performance Engineering – Tổng kết toàn bộ chương
Bức tranh tổng thể
Performance Optimization là một quy trình có thứ tự — không nên tối ưu mọi thứ cùng lúc.
Performance Engineering
│
▼
Identify Performance Problem
│
▼
Measure Performance Metrics
│
▼
Improve Serial Latency
│
▼
Improve Throughput
│
▼
Optimize Concurrency
│
▼
Apply Caching
Hãy đi theo đúng trình tự. Chỉ khi hoàn thành tốt từng bước trước, bước tiếp theo mới mang lại hiệu quả thực sự.
Bước 1 – Xác định Performance Bottleneck
Trước khi tối ưu phải biết: hệ thống đang chậm ở đâu?
Hãy nhìn vào Request Queue:
Client Requests
│
▼
Load Balancer Queue
│
▼
Web Application
│
Thread Queue
│
▼
Database
Queue bắt đầu dài ở đâu → đó chính là bottleneck.
Queue Growing → Find Bottleneck → Optimize There
Không nên tối ưu những nơi không phải điểm nghẽn.
Bước 2 – Đo Performance
4 chỉ số quan trọng cần theo dõi:
Latency: Thời gian hoàn thành một request.
Throughput:
5000 request / 1 second → Throughput = 5000 RPS
Resource Saturation:
CPU ████████░░
Memory ██████░░░░
Disk █████████░
Network ████░░░░░░
Tài nguyên gần 100% → đã bão hòa.
Tail Latency — không chỉ nhìn Average mà phải nhìn P95, P99, P999:
Average: 20 ms
P99: 800 ms ← hệ thống vẫn có vấn đề
Bước 3 – Khi Saturation xảy ra
Nếu xác định được CPU 100% → giải pháp đơn giản nhất:
More Hardware → Scale Out / Scale Up / Thêm RAM / Thêm CPU / Thêm Disk
Bước 4 – Tối ưu Latency
Latency chủ yếu đến từ 4 tài nguyên:
Latency
┌────────┼────────┬────────┐
▼ ▼ ▼ ▼
CPU Memory Disk Network
Phân tích và tối ưu từng nguồn: CPU Latency, Memory Latency, Disk Latency, Network Latency.
Bước 5 – Luôn tối ưu Serial Request trước
Đừng tối ưu Concurrent Request ngay — tối ưu từng request trước.
Step 1: Single Request → Measure Latency → Optimize
Step 2: Concurrent Requests → Measure Throughput → Optimize
Vì sao? Nếu một request đã mất 500 ms thì 100 request song song vẫn chậm — Concurrency không cứu được latency.
Bước 6 – Dùng Cache
Nguyên tắc vàng:
Frequently Read + Rarely Updated → Cache
Client → Cache → (Cache Hit) → Return
→ (Cache Miss) → Database → Return
Cache Hit → không cần Database → Latency giảm rất nhiều.
Bước 7 – Tăng Throughput qua Concurrency
Mục tiêu: giảm Serialization, tăng Parallelism.
❌ Serial ✔ Parallel
Request Request ──────────────►
↓ Request ──────────────►
Request Request ──────────────►
↓
Request
Bước 8 – Giảm Lock Contention
Lock Splitting
Before: One Big Lock → All Threads Wait
After: Lock A / Lock B / Lock C → Parallel
Lock Striping
Hash → Stripe 1 / Stripe 2 / Stripe 3
(mỗi Stripe có Lock riêng)
Compare And Swap (CAS)
Không dùng Lock → Atomic Instruction → Concurrency cao hơn.
Bước 9 – Chọn đúng Lock Strategy
| Lock Strategy | Phù hợp khi | Luồng |
|---|---|---|
| Optimistic Lock | Low Contention | Read → Modify → Commit → Conflict? |
| Pessimistic Lock | High Contention | Lock → Modify → Unlock |
Deadlock — nếu thấy log Deadlock Found:
Thread 1 Wait Thread 2
Thread 2 Wait Thread 1
→ Không thread nào chạy → Throughput = 0
Đây là dấu hiệu mất hiệu năng nghiêm trọng, phải xử lý ngay.
Tổng kết
PERFORMANCE
│
┌────────────────────┼────────────────────┐
▼ ▼ ▼
Identify Problem Measure Metrics Optimize Resources
│ │ │
▼ ▼ ▼
Queue Analysis Latency/TPS/P99 CPU/RAM/Disk/Network
│
▼
Caching
│
▼
Concurrency
│
┌──────────────────────────────────┼──────────────────────────────────┐
▼ ▼ ▼
Lock Contention Lock Strategy Deadlock
│ │
▼ ▼
Splitting / Striping / CAS Optimistic / Pessimistic
Những bài học quan trọng
| Chủ đề | Ý chính |
|---|---|
| Xác định Bottleneck | Tìm nơi queue bắt đầu tăng trước khi tối ưu |
| Performance Metrics | Luôn theo dõi Latency, Throughput, Saturation và Tail Latency |
| Resource Optimization | CPU, Memory, Disk và Network là bốn nguồn gây latency chính |
| Caching | Chỉ cache dữ liệu đọc nhiều, ít thay đổi để giảm latency |
| Serial trước, Concurrent sau | Tối ưu từng request trước, rồi mới tăng throughput bằng concurrency |
| Locking | Giảm lock contention bằng Lock Splitting, Lock Striping và CAS |
| Lock Strategy | Optimistic Lock khi contention thấp, Pessimistic Lock khi contention cao |
| Deadlock | Theo dõi log deadlock — dấu hiệu mất hiệu năng nghiêm trọng |
Performance Engineering không phải là tập hợp các mẹo tối ưu riêng lẻ, mà là một quy trình có thứ tự:
- Xác định bottleneck bằng cách quan sát queue.
- Đo lường bằng Latency, Throughput, Saturation và Tail Latency.
- Tối ưu latency của từng request trước khi nghĩ đến concurrency.
- Giảm số lần truy cập tài nguyên chậm bằng caching.
- Tăng throughput bằng cách giảm serialization, tối ưu locking và tránh deadlock.