Hệ thống độ trễ thấp (low latency)

Chủ đề Dành cho thành viên
Bài đọc thử: 1/3 · còn 2 bài miễn phí · Xem gói thành viên

Bài toán

Ở sàn giao dịch và công ty market making, mỗi giao dịch làm thay đổi thị trường cho giao dịch sau, và ai phản ứng chậm hơn thì thua. Yêu cầu không chỉ là latency trung bình thấp mà latency ổn định ở đuôi, ở thang micro giây tới nanosecond, kể cả trong những đợt dồn hàng trăm giao dịch trong một micro giây LMAX 2011. Ở thang đó, những thứ thường bị bỏ qua thành chi phí chính:

  • Phối hợp giữa các thread: lock, hàng đợi, chuyển ngữ cảnh vào kernel làm mất cache.
  • Bộ nhớ: GC pause, cấp phát trên đường nóng, trượt TLB, dịch địa chỉ.
  • Nhánh và cache CPU: nhánh phụ thuộc dữ liệu thị trường gần như ngẫu nhiên, CPU đoán sai.
  • Đo lường: profiler lấy mẫu mỗi 250 µs không thấy được sự kiện dài vài trăm nanosecond.

Trang này gom cách các công ty giao dịch thiết kế và đo đường nóng. Latency ở hệ web thông thường (cache, fan-out, batching) ở Cache và invalidation, Batching và khấu hao round-trip; GC và đổi runtime nói chung ở Đổi ngôn ngữ và runtime; hạ tầng nghiên cứu phía sau chiến lược ở Hạ tầng nghiên cứu định lượng (dữ liệu thị trường, feature, backtest).

Diễn tiến theo thời gian

  • 2011 · LMAX: (theo LMAX qua lời kể của Martin Fowler) loại bỏ DB giao dịch trung tâm theo kinh nghiệm Betfair; prototype actor model/SEDA cho thấy CPU tốn nhiều thời gian quản lý hàng đợi hơn chạy logic. Kết quả: toàn bộ logic nghiệp vụ trên một thread trong RAM, 6 triệu lệnh/giây; độ bền bằng event sourcing (snapshot đêm, ba bản xử lý song song, chuyển trong micro giây); I/O quanh nó qua Disruptor, ring buffer không lock theo nguyên tắc một vị trí bộ nhớ chỉ một core ghi ("mechanical sympathy"). Theo LMAX, viết test hiệu năng có ý nghĩa khó hơn viết code production. LMAX 2011
  • 2015 · Jane Street: thay vì pool mọi object, sửa GC của OCaml cùng tác giả của nó: aging, incremental hơn, tách major slice khỏi minor GC, kế toán công việc làm mượt, để ứng dụng tự lên lịch GC vào lúc rảnh. Tail latency giảm 3 lần trên một ứng dụng production gần như chưa tune. Jane Street 2015
  • 2019→2026 · Jane Street: engine feature Flex Model tạo mọi cấu trúc dữ liệu lúc khởi động, đường nóng chỉ đọc/ghi bộ nhớ cấp sẵn, [@zero_alloc] do compiler kiểm và test fail nếu cấp phát; bỏ cutoff vì nhánh phụ thuộc dữ liệu thị trường đoán kém; float unboxed nhờ OxCaml giảm tail latency khoảng 25% trong một lần replay. Jane Street 2026
  • 2021 · Jane Street: sampling profiler vô dụng với hệ phản hồi dưới 250 µs; magic-trace dùng Intel Processor Trace chụp 10 ms trước một hàm được chọn, attach bằng hardware breakpoint, xem từng lần gọi hàm ở thang nanosecond. Tìm ra regression 100 ns do một hàm thôi được inline. Jane Street 2022
  • 2021 · HRT: kiểm chứng FPGA bằng co-simulation: cocotb (Python) + Verilator thay testbench Verilog/UVM, dùng lại code C++/Python vốn nói chuyện với sàn; không vướng license nên mỗi developer chạy hàng nghìn mô phỏng; cùng test chạy được trên FPGA thật trong lab Hudson River Trading 2021. Năm 2026 thêm slang-server (language server SystemVerilog, indexer nhanh khoảng 10 lần nhờ bỏ lock dùng chung và intern đường dẫn) và cùng test chạy trên Verilator lẫn simulator thương mại Hudson River Trading 2026.
  • 2022 · HRT: với trang 4 KiB, TLB khoảng 2.000 entry chỉ phủ khoảng 8 MiB; trang 2 MiB phủ khoảng 4 GiB. Benchmark truy cập ngẫu nhiên nhanh 4,5 lần Hudson River Trading 2022. Nhưng THP gây spike khi OS dồn hay tách trang; hugetlbfs hết pool thì process nhận SIGBUS (nguy hiểm với fork()); L1 dTLB có ít entry cho trang 2 MiB hơn trang 4 KiB nên có khi giữ vài trang nóng ở 4 KiB. Phải benchmark từng workload. Hudson River Trading 2022
  • 2025 · Jane Street: OxCaml, nhánh compiler production, đưa layout bộ nhớ, SIMD và kiểm soát cấp phát vào type system, chỉ tốn phức tạp ở chỗ dùng. Jane Street 2025
  • 2026 · Jane Street: message bus Aria (state machine replication, nhiều TB/ngày): lọc tip bằng quét tuyến tính thân thiện cache từng đủ, tới khi server lên 100% CPU vì nhiều client recovery cùng lúc. Index theo topic partition + block pool dùng chung giảm 30% CPU; server chưa có index vẫn có tail latency vài giây. Jane Street 2026
  • 2026 · Optiver: model deep learning cho HFT vẫn phải nằm trong ngân sách latency production; có thể cần phần cứng inference riêng thiết kế cùng kỹ sư FPGA. Optiver 2026
  • 2026 · Optiver (năm từng thế hệ không nêu): stack HFT ở châu Á qua ba thế hệ: đồ thị trực quan (dễ đọc, latency không cạnh tranh) → định giá bằng ngôn ngữ cấp cao biên dịch thành code nhanh (mở đường cho ML, nhưng compiler thành nút thắt và ranh giới tổ chức) → native end-to-end với abstraction gần như không tốn runtime. Theo Optiver, chi phí lặp là đầu vào thiết kế ngang latency, và mô phỏng phải trung thực với production. Optiver 2026

Các lựa chọn và đánh đổi

Trục Lựa chọn Ví dụ Đánh đổi
Concurrency Nhiều thread + hàng đợi (actor, SEDA) LMAX prototype trước 2011 Dễ nghĩ; tranh chấp ghi trên hàng đợi, mất cache
Một thread nghiệp vụ + ring buffer một-người-ghi LMAX 2011 Không lock, cache ấm; không được gọi dịch vụ ngoài, không rollback tự động
Bộ nhớ Pool mọi object, không cấp phát (Jane Street mô tả là cách thường làm) Không GC pause; code khó viết, khó suy luận
Sửa GC để ứng dụng tự lên lịch Jane Street 2015 Vẫn cấp phát được; phải sửa runtime
Cấp phát hết lúc khởi động, compiler kiểm zero-alloc Jane Street Flex Model Đường nóng sạch; đồ thị không đổi được khi chạy
Huge page (THP hay hugetlbfs) HRT 2022 Ít trượt TLB; spike khi dồn trang, SIGBUS khi hết pool
Đo Sampling profiler (HRT, Jane Street: không đủ) Rẻ, tổng quan; mù với sự kiện ngắn và hiếm
Trace phần cứng quanh một sự kiện Jane Street magic-trace 2021 Thấy từng lần gọi hàm; cần CPU Intel đời mới, dữ liệu khoảng 1 GB/s
Độ bền DB trên đường nóng Betfair (theo LMAX) Quen thuộc; latency và tranh chấp
Event sourcing + snapshot + bản sao chạy song song LMAX 2011 Không I/O trên đường nóng, replay để debug; working set phải vừa RAM

Quy tắc rút ra

  1. Đo trước, suy luận sau: LMAX loại actor model nhờ prototype và benchmark; HRT bắt benchmark từng workload trước khi bật huge page. LMAX 2011 Hudson River Trading 2022
  2. Bớt phối hợp trước khi thêm song song: một thread không phải phối hợp có thể nhanh hơn nhiều thread phải phối hợp; mỗi vị trí bộ nhớ chỉ nên có một người ghi. LMAX 2011
  3. Đưa mọi chi phí bất định ra khỏi đường nóng: cấp phát lúc khởi động, GC vào lúc rảnh, I/O ở thread khác. Jane Street 2015 Jane Street 2026
  4. Nhánh phụ thuộc dữ liệu thị trường đắt; đôi khi chạy hết kế hoạch không cutoff lại nhanh hơn và dễ suy luận hơn. Jane Street 2026
  5. Công cụ đo phải cùng thang với vấn đề: latency dưới micro giây cần trace đầy đủ một cửa sổ ngắn, không cần thống kê lấy mẫu. Jane Street 2022
  6. Tối ưu ở tầng OS đổi nguồn latency này lấy nguồn khác; đo phân phối đuôi, không chỉ trung bình. Hudson River Trading 2022
  7. Chi phí lặp là đầu vào thiết kế ngang latency: stack dễ thử nghiệm mọc tầng, stack tối giản làm chậm nghiên cứu; tầng biên dịch/DSL tách người viết logic khỏi runtime nhưng chính nó thành sản phẩm phải nuôi. Optiver 2026
  8. Kiểm soát hiệu năng phải an toàn và chỉ tốn ở chỗ dùng: đưa layout, cấp phát vào type system thay vì bắt cả codebase viết kiểu hệ thống. Jane Street 2025
  9. Đường nóng bằng phần cứng cần công cụ như phần mềm: test bằng ngôn ngữ chung, simulator mở để CI song song, cùng test chạy trên mô phỏng lẫn thiết bị thật. Hudson River Trading 2021 Hudson River Trading 2026

Câu hỏi mở