RPS/XPS trong Linux Network Stack

1. Tổng quan

Trong Linux network stack, cơ chế xử lý ngắt và luồng dữ liệu network được tối ưu hóa bằng nhiều kỹ thuật. Bên cạnh IRQ affinity (chỉ định core nào xử lý ngắt phần cứng), Linux còn cung cấp hai cơ chế quan trọng: RPS (Receive Packet Steering) và XPS (Transmit Packet Steering).

  • RPS giúp phân phối gói tin nhận (RX) từ một ngắt phần cứng sang nhiều CPU khác để xử lý SoftIRQ.
  • XPS giúp chọn CPU thích hợp để xử lý gói tin truyền (TX) từ ứng dụng xuống NIC.

Hai cơ chế này cho phép hệ thống cân bằng tải giữa các CPU, tránh tình trạng một core bị nghẽn cổ chai khi băng thông cao.

2. Cơ chế hoạt động

2.1. Receive Packet Steering (RPS)

  • Khi NIC nhận gói tin, một Hard IRQ được tạo ra trên một CPU được chỉ định (theo IRQ affinity).
  • Thay vì để SoftIRQ (NET_RX) luôn chạy trên cùng CPU đó, RPS có thể phân phối gói tin sang CPU khác dựa trên hash (ví dụ: 5-tuple của flow).
  • File config: /sys/class/net/<iface>/queues/rx-*/rps_cpus
  • Ví dụ: echo f0 > /sys/class/net/eth0/queues/rx-0/rps_cpus Nghĩa là gói tin RX ở queue 0 có thể xử lý SoftIRQ trên CPU4–7.

Sơ đồ:

NIC → IRQ trên CPU0 → RPS → SoftIRQ RX có thể chạy ở CPU4,5,6,7

2.2. Transmit Packet Steering (XPS)

  • Khi ứng dụng gửi gói tin, kernel phải chọn TX queue của NIC và CPU nào sẽ chịu trách nhiệm.
  • XPS cho phép ánh xạ CPU ứng dụng sang TX queue cụ thể, giúp tăng locality (CPU app = CPU xử lý TX).
  • File config: /sys/class/net/<iface>/queues/tx-*/xps_cpus
  • Ví dụ: echo 0f > /sys/class/net/eth0/queues/tx-0/xps_cpus Nghĩa là TX queue 0 được phép dùng CPU0–3.

3. Tại sao IRQ RX thường nhiều hơn TX?

Mặc dù về mặt dữ liệu, node gửi bao nhiêu thì node nhận cũng nhận bấy nhiêu byte, nhưng số lượng IRQ và chi phí CPU lại không đối xứng:

  • IRQ TX được giảm thiểu
    • Khi gửi gói, ứng dụng copy data vào TX ring của NIC.
    • NIC xử lý và chỉ báo IRQ khi cần dọn dẹp descriptor hoặc khi một batch lớn hoàn tất.
    • Kỹ thuật này gọi là Tx interrupt moderation → giúp giảm số lượng IRQ TX.
  • IRQ RX chi tiết hơn
    • Mỗi gói đến cần báo IRQ để kernel lấy data ra khỏi NIC ring buffer.
    • SoftIRQ (NET_RX) chạy cho từng loạt gói, xử lý TCP/IP stack, copy vào socket.
    • Chi phí CPU RX cao hơn TX vì còn nhiều lớp xử lý.
  • Ví dụ trong Ceph
    • Node A gửi 100MB dữ liệu replica cho Node B.
    • TX node A: ít IRQ, nhiều data xử lý trong phần cứng, CPU chủ yếu lo file system + network stack gửi đi.
    • RX node B: nhiều IRQ RX, SoftIRQ chạy dồn, xử lý network stack nặng → %si cao trên CPU.
    • Kết quả: TX và RX về byte cân bằng, nhưng về IRQ và CPU thì RX nặng hơn nhiều.

Sơ đồ dòng dữ liệu trong Ceph (ví dụ replication)

   Client / OSD A (gửi)                   Network                     OSD B (nhận)
   --------------------         -------------------------     ---------------------------
   User process (Ceph OSD) ---> TX path (kernel stack) --->   NIC nhận packet
                                |                            |
                                |                            v
                                |                        Hard IRQ (RX)
                                |                            |
                                |                            v
                                |                        SoftIRQ (NET_RX)
                                |                            |
                                |                      TCP/IP stack xử lý
                                |                            |
                                v                            v
                         TX ring buffer             Socket buffer / Ceph process
                         (NIC hardware)             (user space)

Diễn giải sơ đồ như sau:

  • Node gửi (OSD A)
    • Ceph OSD process sinh ra data → kernel stack xử lý.
    • Data được đẩy vào TX ring buffer của NIC.
    • NIC gửi data đi, IRQ TX rất ít (batching, coalescing).
  • Network
    • Dữ liệu đi qua switch/router → sang node khác.
  • Node nhận (OSD B)
    • NIC nhận packet, ghi vào RX ring buffer.
    • Hard IRQ RX kích hoạt ngay để báo CPU.
    • Kernel chạy SoftIRQ (NET_RX) để xử lý TCP/IP stack, phân tách flow, copy vào socket buffer.
    • Cuối cùng Ceph OSD process đọc data từ socket.

Vậy tại sao IRQ RX nhiều hơn TX?

  • TX: phần lớn do NIC tự lo, chỉ báo IRQ khi cần.
  • RX: mỗi packet đến phải kích hoạt IRQ và SoftIRQ để đưa gói tin lên kernel → tần suất nhiều hơn, CPU load cao hơn.
  • Trong Ceph replication:
    • Node A (gửi) → IRQ TX ít.
    • Node B (nhận) → IRQ RX + SoftIRQ nhiều, %si cao.

4. Khi nào nên bật RPS/XPS

  • Single queue NIC, nhiều CPU:
    • Nếu NIC không hỗ trợ multiqueue hoặc ít queue, RPS giúp phân phối load RX ra nhiều CPU.
  • Ứng dụng network đa luồng:
    • XPS giúp mỗi thread gửi dữ liệu được map vào TX queue tương ứng với CPU đang chạy thread đó.
  • Hệ thống ảo hóa (VM):
    • Thường NIC ảo có ít queue, bật RPS để tránh nghẽn một CPU.

5. Ví dụ thực tế

5.1. Kiểm tra trạng thái RPS/XPS

grep . /sys/class/net/ens160/queues/rx-*/rps_cpus
grep . /sys/class/net/ens160/queues/tx-*/xps_cpus
  • 0 = tắt.
  • ff = bật trên toàn bộ CPU0–7.

5.2. Bật RPS cho CPU2–3

echo c > /sys/class/net/ens160/queues/rx-0/rps_cpus

(c = 1100b = CPU2 + CPU3)

5.3. Tắt toàn bộ RPS/XPS

for f in /sys/class/net/ens160/queues/rx-*/rps_cpus; do echo 0 > $f; done
for f in /sys/class/net/ens160/queues/tx-*/xps_cpus; do echo 0 > $f; done
sysctl -w net.core.rps_sock_flow_entries=0

Kiểm tra global RPS flow entries.

sysctl net.core.rps_sock_flow_entries

Nếu 0 → RPS gần như tắt.

Nếu >0 → RPS có thể hoạt động, kết hợp với các rps_cpus.

6. Bảng so sánh nhanh

Cơ chếÁp dụng ở đâuĐiều khiển cái gìGhi chú
IRQ affinityHard IRQ từ thiết bịCPU nào được phép nhận ngắt phần cứngẢnh hưởng trực tiếp đến Hard IRQ và mặc định cả SoftIRQ nếu không có RPS
RPSRX SoftIRQ (NET_RX)CPU nào xử lý gói tin nhậnGiúp dàn đều load RX khi ít queue, nhưng tạo thêm overhead
XPSTX queue lựa chọnCPU nào xử lý gói tin gửiCải thiện locality giữa app và TX queue, giảm contention

7. Lời khuyên

  • Trên hệ thống có NIC multiqueue đầy đủ (SR-IOV, virtio, card 10/25/40G…), ưu tiên dùng IRQ affinity + queue pinning, hạn chế bật RPS vì nó tạo thêm overhead.
  • Trên NIC ít queue hoặc VM NIC ảo, RPS/XPS có thể cải thiện throughput và phân tán load CPU.
  • Luôn kiểm tra bằng /proc/interruptsmpstat -P ALL 1 để xác nhận load được phân bổ như mong muốn.

8. Kết luận

RPS và XPS là hai công cụ quan trọng trong Linux để cân bằng tải xử lý mạng giữa nhiều CPU.

  • RPS điều phối SoftIRQ RX sang CPU khác.
  • XPS ánh xạ CPU ứng dụng với TX queue.
    Trong thực tế, số lượng IRQ RX thường nhiều hơn TX vì TX được batching và giảm ngắt, trong khi RX phải báo thường xuyên hơn. Điều này giải thích tại sao trong workload như Ceph, node nhận dữ liệu thường có load CPU cao hơn node gửi, dù lượng dữ liệu truyền nhận là như nhau.

Bài viết gần đây

spot_img

Related Stories

Leave A Reply

Please enter your comment!
Please enter your name here

Đăng ký nhận thông tin bài viết qua email