I/O, Lưu trữ & Tài nguyên/Tổng quan module — Đường đi I/O & GPU
10/26
Bài 10 / 26~5 phútĐường đi I/O & GPUMiễn phí lượt xem

Tổng quan module — Đường đi I/O & GPU

Lộ trình module: thiết bị nối vào máy thế nào, ai tốn CPU khi chép dữ liệu, một lệnh read() đi qua những tầng nào, cách chờ I/O, zero-copy và GPU.

TL;DR: Module trước trả lời dữ liệu nằm ở đâu. Module này trả lời dữ liệu đi đường nào để tới được biến trong chương trình bạn viết. Bạn sẽ bắt đầu từ chỗ CPU chạm vào phần cứng (thanh ghi thiết bị và bus PCIe), rồi xem ai là người thật sự tốn chu kỳ CPU khi dữ liệu di chuyển, lần theo trọn một lệnh read() xuyên các tầng của kernel, so ba cách chờ I/O khi máy chủ có hàng vạn kết nối, cắt bớt bản sao bằng zero-copy, và khép lại bằng GPU — thiết bị dùng đúng ba cơ chế đó ở quy mô lớn nhất.

Vì sao module này tồn tại

Course đầu tiên của track, ở bài mô hình von Neumann, có một lời hứa treo: I/O được nói qua rồi gác lại với ghi chú "chi tiết ở bài sau". Đây chính là bài sau đó.

Nhưng lý do thật thì thực dụng hơn. Rất nhiều quyết định kỹ thuật hằng ngày phụ thuộc vào việc bạn có nhìn thấy tuyến đường này không. Thêm thread vào một service đang chậm mà thông lượng không nhúc nhích. Đổi sang thư viện "async" mà độ trễ y hệt. Mua GPU rồi phát hiện nó ngồi chơi 80% thời gian. Ba tình huống đó đều là cùng một sai lầm ở ba tầng khác nhau: tối ưu nhầm chỗ vì không biết dữ liệu đang tắc ở đâu trên đường đi.

Sau module này bạn sẽ

  • Explain CPU điều khiển thiết bị thế nào qua thanh ghi thiết bị, memory-mapped I/O và bus PCIe.
  • Compare polling, interrupt và DMA về việc ai tốn chu kỳ CPU khi dữ liệu di chuyển.
  • Trace một lời gọi read() qua syscall, VFS, page cache, block layer và driver tới thiết bị rồi quay về.
  • Choose mô hình chờ I/O (blocking, non-blocking, epoll) cho server nhiều kết nối dựa trên số fd và chi phí syscall.
  • Explain zero-copy loại bỏ những bản sao nào trên đường dữ liệu và giới hạn của nó.
  • Explain GPU đạt thông lượng cao nhờ đâu về mặt kiến trúc — SIMT, băng thông bộ nhớ và đánh đổi độ trễ.
  • Diagnose vì sao một pipeline GPU nghẽn ở khâu chuyển dữ liệu host-device thay vì ở phép tính.

Lộ trình module

Bay bai cua module xep canh cau hoi ma moi bai dong lai

Ba bài đầu dựng tuyến đường. Bài 01 đặt chân xuống tầng thấp nhất mà phần mềm còn với tới được: thiết bị hiện ra trước CPU dưới dạng vài thanh ghi nằm trong không gian địa chỉ, và PCIe là cái cây nối chúng lại. Bài 02 hỏi một câu tưởng nhỏ mà quyết định cả kiến trúc — trong lúc dữ liệu di chuyển thì ai đang tốn chu kỳ CPU — rồi cho thấy câu trả lời "polling luôn phí" là sai ở tốc độ cao. Bài 03 gộp cả hai lại và lần theo trọn một lệnh read(), từ syscall xuống tới ngắt báo xong; đây là bài xương sống, nơi page cache của module trước hiện ra đúng vị trí của nó trên tuyến đường.

Hai bài giữa chuyển từ đường đi sang cách chờ. Bài 04 lấy bài toán C10K làm trục: một thread canh một kết nối thì hết bao nhiêu tiền, và vì sao epoll đổi được độ phức tạp chứ không chỉ đổi cú pháp. Bài 05 quay lại đếm — đếm số bản sao mà một lần read() cộng write() phải trả, rồi xem sendfile cắt được bao nhiêu trong số đó và trong hoàn cảnh nào nó chẳng cắt được gì.

Hai bài cuối đưa GPU vào không phải như một chủ đề mới, mà như ví dụ cực đoan nhất của mọi thứ vừa học. Bài 06 giải thích kiến trúc đổi độ trễ lấy thông lượng. Bài 07 đóng module bằng câu hỏi thực dụng nhất: khi pipeline chậm, nghẽn nằm ở phép tính hay ở đoạn dây PCIe nối hai bên?

Yêu cầu trước khi bắt đầu

  • Đã học module 01 — Lưu trữ & Filesystem, đặc biệt page cache và dirty page. Bài 03 dùng lại rất nhiều.
  • Nắm system callinterrupt ở mức cơ chế — module này bắt đầu ngay từ chỗ hai bài đó dừng lại.
  • Quen CPU-bound so với I/O-bound; bài 04 và bài 07 là cùng một bài học đó, đổi tầng.
  • Không cần GPU để học hai bài cuối. Chúng dạy cơ chế và cách chẩn đoán, không dạy viết CUDA.

Thời lượng

BàiPhút
01 — Thiết bị, MMIO và PCIe13
02 — Polling, interrupt và DMA13
03 — Hành trình một lệnh read()15
04 — Blocking, non-blocking và epoll15
05 — Zero-copy13
06 — GPU về mặt kiến trúc14
07 — Host và device14
08 — Tổng kết6
Tổng~1 giờ 43 phút

Cách học module này hiệu quả

  • Bài 03 là bản lề, đừng lướt. Sáu bài còn lại đều tham chiếu về tuyến đường mà nó dựng lên. Đọc xong bài 03 mà tự vẽ lại được các chặng thì phần sau nhẹ hẳn.
  • Chạy lspci -tvstrace trên máy mình. Hai bài đầu có lệnh chạy được ngay, không cần cài gì. Nhìn thấy cây thiết bị thật của máy mình đáng hơn nhiều so với đọc một sơ đồ tổng quát.
  • Mỗi lần gặp con số, hỏi nó là đo hay là suy ra. Băng thông PCIe trong module này là số học từ chuẩn, nên luôn kèm chữ "lý thuyết"; thực đo bao giờ cũng thấp hơn. Thói quen phân biệt hai loại số đó có ích xa ngoài phạm vi khoá học.
  • Hai bài GPU không phải phần phụ. Chúng là chỗ ba cơ chế của bài 02 — thanh ghi, DMA, ngắt — hiện ra rõ nhất, ở quy mô mà cái giá của một bản sao thừa đo được bằng tiền thật.

Bài tiếp theo: Thiết bị nói chuyện với CPU — MMIO, thanh ghi, PCIe

Bài này đáng gửi cho bạn học cùng?

Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.

Bài này có giúp bạn hiểu bản chất không?

Hỏi đáp về bài này

Chưa có câu hỏi

Đặt câu hỏi

Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).

Đặt câu hỏi đầu tiên

Bài tiếp theo

Thiết bị nói chuyện với CPU — MMIO, thanh ghi, PCIe