⚡ Các kỹ thuật giảm CPU Latency

Sau khi hiểu về Context Switching, bài này trình bày các kỹ thuật giúp giảm CPU Latency bằng cách giảm số lần Context Switching và giữ cho CPU tập trung xử lý business logic thay vì phải chờ I/O.

5 nhóm giải pháp chính:

  1. Efficient Algorithms & Efficient Queries
  2. Batch I/O & Async I/O
  3. Single-threaded Event Loop
  4. Thread Pool Optimization
  5. Process Isolation (Virtual Environment)

Diagram tổng quan

                     CPU Latency Optimization
                               │
      ┌────────────────────────┼─────────────────────────┐
      │                        │                         │
      ▼                        ▼                         ▼
 Efficient Code         Reduce Context Switch      Process Isolation
      │                        │                         │
      │                ┌───────┼─────────┐               │
      │                ▼       ▼         ▼               │
      │            Batch I/O Async I/O Single Thread      │
      │                              │                   │
      │                              ▼                   ▼
      │                      Thread Pool Tuning   Virtual Environment
      └──────────────────────────────┼──────────────────────────┘
                                     ▼
                             Better CPU Utilization

1) Efficient Algorithm & Efficient Query

Bad:  O(n²)     → Many CPU Instructions → High CPU Latency
Good: O(n log n) → Less CPU Work        → Lower CPU Latency

Code phải tối ưu, SQL Query cũng phải tối ưu — vì Query cuối cùng cũng được DB Engine chuyển thành thuật toán xử lý dữ liệu.


2) Batch I/O

Mỗi lần gọi DB riêng lẻ đều tốn: Network + Context Switch + CPU Wait.

❌ Không tốt — gọi DB từng lần:

App → DB Call → DB Call → DB Call → DB Call

✅ Tốt hơn — gom lại thành một batch:

Bad                        Good

Request → DB               Batch Request
Request → DB               │
Request → DB               ▼
                        Database
                           │
                           ▼
                      Return All Data

Lợi ích: giảm không chỉ Network Latency mà còn giảm CPU Context Switching.


3) Async I/O

Nếu Main Thread trực tiếp ghi log hoặc đọc disk → CPU bị block.

❌ Sync:

Main Thread → Business Logic → Write Log → Disk → Business Logic

✅ Async:

              Main Thread
                   │
                   ▼
            Business Logic
                   │
            Send Log Message
                   │
                   ▼
               Async Queue
                   │
                   ▼
             Logger Thread
                   │
                   ▼
                 Disk I/O

Main Thread không bao giờ chờ Disk → giảm Context Switching cho Main Thread.


4) Single-threaded Event Loop

Mô hình của JavaScript Engine, Node.js, NGINX, VoltDB.

Ý tưởng cốt lõi: Main Thread chỉ xử lý business logic, mọi I/O đều được delegate sang Async Worker Thread.

                    Main Thread
                         │
      ┌──────────────────┼─────────────────┐
      │                  │                 │
      ▼                  ▼                 ▼
 Business Logic     Business Logic    Business Logic
      │                  │                 │
      ▼                  ▼                 ▼
 Async I/O         Async I/O        Async I/O
      │                  │                 │
      ▼                  ▼                 ▼
 Worker 1          Worker 2         Worker 3
      │                  │                 │
      └──────────────────┬─────────────────┘
                         ▼
                   Return Result
                         │
                         ▼
                   Main Thread

Main Thread không bao giờ block → luôn xử lý Request A → B → C → D liên tục.

Worker Thread chỉ làm: Disk, Network, Database.

Kết quả: CPU gần như luôn được dùng cho business logic → ít Context Switching → Throughput cao.


5) Thread Pool Size

Lỗi phổ biến: tạo quá nhiều thread so với số CPU Core.

❌ Không tốt:

2 CPU Core + 200 Threads
      │
      ▼
OS phải Context Switch liên tục

✅ Tốt hơn:

2 CPU Core + 10 Threads → Ít Context Switch hơn

Thread Pool phải phụ thuộc vào:

  • CPU-intensive hay I/O-intensive?
  • Số CPU Core thực tế
  • Đặc thù của ứng dụng

Không có công thức cố định — cần đo và điều chỉnh.


6) Process Isolation — Virtual Environment

Nếu nhiều process chạy chung trên một máy mà không có cô lập, một process chiếm CPU quá lâu sẽ gây Starvation cho các process còn lại.

❌ Không cô lập:

           CPU
            │
      ┌─────┼─────┐
      ▼     ▼     ▼
     A      B      C
     │
  A chiếm toàn bộ CPU

✅ Có Virtual Environment (VM / Container):

Machine
├── Container A  →  CPU 25%
├── Container B  →  CPU 25%
├── Container C  →  CPU 25%
└── Container D  →  CPU 25%

Mỗi process có CPU quota và Memory quota → không thể chiếm toàn bộ tài nguyên → các process không ảnh hưởng lẫn nhau.


Luồng tối ưu CPU

                 Client Request
                       │
                       ▼
                 Main Thread
                       │
             Business Logic Only
                       │
        ┌──────────────┼──────────────┐
        ▼              ▼              ▼
     DB Call      File I/O       Network I/O
        │              │              │
        ▼              ▼              ▼
    Async Worker  Async Worker  Async Worker
        │              │              │
        └──────────────┼──────────────┘
                       ▼
                 Return Result
                       │
                       ▼
                 Main Thread

Tổng kết

                  CPU Latency Optimization
                           │
      ┌────────────────────┼─────────────────────┐
      │                    │                     │
      ▼                    ▼                     ▼
 Efficient Code     Reduce Context Switch   Resource Isolation
      │                    │                     │
      ▼                    ▼                     ▼
Better Algorithm     Batch I/O          Virtual Environment
Better Query         Async I/O          CPU Quota
                     Single Thread
                     Thread Pool Tuning
                           │
                           ▼
                  Fewer Context Switches
                           │
                           ▼
                  Better CPU Utilization
                           │
                           ▼
                 Lower CPU Latency
Kỹ thuật Mục tiêu
Efficient Algorithms & Queries Giảm số lượng phép tính CPU và tối ưu cách database xử lý truy vấn
Batch I/O Gom nhiều thao tác I/O thành một lần để giảm Network Latency và Context Switching
Async I/O Chuyển các tác vụ I/O sang thread khác, giúp Main Thread không bị block
Single-threaded Event Loop Main Thread chỉ xử lý business logic; I/O giao cho async worker (Node.js, NGINX, VoltDB)
Thread Pool Optimization Không tạo quá nhiều thread; chọn kích thước phù hợp với số CPU Core và loại workload để tránh Context Switching quá mức
Virtual Environment / Process Isolation Chạy process trong môi trường cô lập với CPU & Memory quota để tránh tranh chấp tài nguyên và CPU starvation