Minimizing Disk Latency
💾 Các kỹ thuật giảm Disk Latency
Disk I/O là một trong những thao tác chậm nhất của hệ thống, vì vậy mục tiêu là giảm số lần truy cập đĩa hoặc làm cho việc truy cập đĩa hiệu quả hơn.
Bài này chia thành 4 nhóm giải pháp chính:
- Tối ưu Logging
- Tối ưu Web Content
- Tối ưu Database Disk Access
- Tối ưu Hardware Storage
Diagram tổng quan
Disk Latency Optimization
│
┌─────────────────────────┼──────────────────────────┐
│ │ │
▼ ▼ ▼
Logging Web Content Database Access
│ │ │
▼ ▼ ▼
Async Logging Reverse Proxy Cache Cache / Index / Query
Batch Logging Memory Cache Denormalization
│ │ │
└─────────────────────────┼──────────────────────────┘
▼
Fewer Disk Reads & Writes
│
▼
Lower Disk Latency
1) Sequential I/O nhanh hơn Random I/O
Đây là khái niệm quan trọng nhất trong bài.
Sequential Write — disk chỉ cần di chuyển đầu đọc một lần:
+------------------------------------------------------+
| Block1 | Block2 | Block3 | Block4 | Block5 | Block6 |
+------------------------------------------------------+
↑
Ghi liên tục → Rất nhanh
Random Write — disk phải liên tục tìm vị trí:
Write → Block2
Write → Block6
Write → Block1
Write → Block5
→ Latency tăng rất nhiều
Logging là trường hợp đặc biệt — log luôn ghi nối tiếp nhau (INFO... INFO... INFO...), đó là Sequential Write, không phải Random Write. Vì vậy logging không chậm như nhiều người nghĩ.
2) Batch Logging
❌ Ghi từng log ngay lập tức → CPU liên tục chuyển đổi giữa compute và write disk → nhiều Context Switch.
✅ Gom log rồi ghi một lần:
Bad Good
CPU CPU
│ │
▼ ▼
Compute Compute
│
▼ Compute
Log
│ Compute
▼
Compute │
│ ▼
▼ One Large Log Write
Log
Ít Context Switch → Disk ghi nhiều dữ liệu trong một lần → hiệu quả hơn.
3) Asynchronous Logging
Main Thread
│
▼
Business Logic
│
▼
Push Log Message
│
Queue / Buffer
│
▼
Logger Thread
│
▼
Write Disk
Main Thread chỉ đẩy log vào Queue rồi tiếp tục xử lý request — không bị block.
Trade-off:
| Ưu điểm | Nhược điểm |
|---|---|
| CPU không chờ Disk | Nếu app crash, log trong queue chưa kịp ghi disk |
| Throughput cao, Response nhanh | Có thể mất vài log cuối |
4) Web Content Caching — Reverse Proxy
❌ Không có cache → mỗi request đều đọc Disk:
Browser → Web Server → Disk → main.js
→ Disk → style.css
→ Disk → logo.png
✅ Có Reverse Proxy Cache (Nginx / Varnish):
Browser
│
▼
Reverse Proxy
│ │
Cache Hit Cache Miss
│ │
▼ ▼
Memory Disk
│
▼
Return File
Reverse Proxy còn tách biệt static và dynamic request:
Browser
│
┌──────────┴──────────┐
▼ ▼
Static Request Dynamic Request
│ │
▼ ▼
Reverse Proxy Web Application
│ │
▼ ▼
Memory Cache Database / Service
Web App không phải phục vụ CSS/JS/Images → chỉ tập trung xử lý business logic.
5) Page Cache & Zero Copy
Page Cache: OS tự động giữ file đã đọc trong RAM. Lần sau không cần đọc Disk lại.
Lần 1: Disk → OS Page Cache (RAM)
Lần 2: Application → Page Cache → Không cần Disk
Zero Copy: Bỏ qua bước copy dữ liệu qua User Space:
Thông thường: Disk → Kernel → User Space → Kernel → Network
Zero Copy: Disk → Kernel → Network
→ Ít copy hơn → CPU ít làm việc hơn → Network nhanh hơn.
6) Cache dữ liệu Database
Request
│
▼
Service
│
Cache Hit?
│ │
Yes No
│ │
▼ ▼
Redis/Memory Database
│
▼
Disk
Dữ liệu đọc nhiều (hot data) phục vụ từ Redis/Memory → không truy cập Database và Disk.
7) Index
❌ Không có Index → Full Table Scan qua 100 triệu dòng.
✅ Có Index → Jump thẳng đến vị trí cần đọc:
No Index Index
Table Scan B-Tree
1, 2, 3, ... 1,000,000 │
Pointer → Correct Row
Lợi ích: Ít đọc Disk, ít Scan, Query nhanh hơn.
8) Query Optimization
SELECT *→ chỉ dùngSELECT namenếu chỉ cần tên- JOIN 10 bảng → refactor còn 2 bảng nếu đủ dùng
Mục tiêu: đọc ít dữ liệu hơn → ít Disk I/O hơn.
9) Denormalization (chỉ khi cần)
Normalize trước, chỉ denormalize khi load test cho thấy Disk I/O là bottleneck.
Normalize Denormalize
Customer + Order + Address Customer + Address (1 bảng)
→ JOIN nhiều bảng → Một lần đọc
→ Nhiều Disk I/O → Ít Disk I/O
| Normalize | Denormalize |
|---|---|
| Ít dữ liệu | Nhiều dữ liệu |
| JOIN nhiều | Đọc nhanh |
| Ít Disk Write | Ít Disk Read |
10) SSD / High IOPS / RAID
SSD — không có mechanical seek, Random I/O nhanh hơn HDD rất nhiều:
HDD: Moving Head → Mechanical Seek → Slow
SSD: Flash Memory → No Moving Part → Fast
High IOPS — số lượng I/O operations xử lý được mỗi giây. Disk với 100,000 IOPS xử lý nhiều request đồng thời hơn Disk 10,000 IOPS.
RAID — phân tán dữ liệu trên nhiều ổ đĩa, đọc song song:
RAID
┌──────┬──────┬──────┐
│Disk1 │Disk2 │Disk3 │
└──────┴──────┴──────┘
│
▼
Parallel Read → Throughput tăng
Tổng kết
Disk Latency Optimization
│
┌────────────────────┼─────────────────────┐
│ │ │
▼ ▼ ▼
Logging Web Content Database & Storage
│ │ │
▼ ▼ ▼
Sequential I/O Reverse Proxy Cache
Batch Logging Memory Cache Index
Async Logging Page Cache Query Optimization
Zero Copy Denormalization
SSD / High IOPS / RAID
│
▼
Fewer Disk Reads & Writes
│
▼
Lower Disk Latency
│
▼
Faster System Performance
| Kỹ thuật | Mục tiêu |
|---|---|
| Sequential Logging | Ghi log tuần tự để tận dụng Sequential I/O, nhanh hơn Random I/O |
| Batch Logging | Gom nhiều log thành một lần ghi để giảm context switch và số lần truy cập disk |
| Asynchronous Logging | Tách việc ghi log sang thread khác để không chặn luồng xử lý chính |
| Reverse Proxy + Web Cache | Lưu static files trong RAM, giảm đọc từ disk và giảm tải cho web server |
| Page Cache & Zero Copy | Tận dụng cache của hệ điều hành và giảm số lần copy dữ liệu khi truyền file |
| Database Cache | Phục vụ dữ liệu đọc nhiều từ memory thay vì truy cập database và disk |
| Index & Query Optimization | Giảm Full Table Scan, đọc ít dữ liệu hơn và giảm Disk I/O |
| Denormalization (có chọn lọc) | Chỉ áp dụng khi load test cho thấy Disk I/O là bottleneck để giảm số lần JOIN và truy cập đĩa |
| SSD / High IOPS / RAID | Nâng cấp hạ tầng lưu trữ để giảm latency và tăng khả năng xử lý I/O song song |