Hiệu suất truy cập tệp tin trên WSL 2 được cải thiện đáng kể

04 tháng 6, 2026·4 phút đọc

Microsoft đang tiếp tục tối ưu hóa WSL 2 với bản cập nhật mới giải quyết nút thắt cổ chai trong việc truy cập tệp tin giữa Windows và Linux. Cải tiến này phân bổ bộ nhớ DMA riêng biệt cho từng thiết bị, giúp tăng tốc độ đáng kể cho các tác vụ nặng về I/O.

Hiệu suất truy cập tệp tin trên WSL 2 được cải thiện đáng kể

Nếu quy trình làm việc của bạn yêu cầu trao đổi dữ liệu liên tục giữa Windows và Linux, tin vui là hiệu suất I/O (nhập/xuất) của WSL 2 đang ngày càng được cải thiện. Một thay đổi quan trọng đã được áp dụng vào WSL 2, loại bỏ một trong những nút thắt cổ chai cuối cùng trên đường dẫn virtiofs.

Để hiểu rõ tầm quan trọng của cải tiến này, chúng ta cần nhìn lại quá trình phát triển của WSL.

Lịch sử phát triển của truy cập tệp tin

WSL 1 (2016) sử dụng DrvFs, một trình điều khiển hệ thống tệp tùy chỉnh chạy trong nhân Windows NT. Vì WSL 1 chạy các tiến trình Linux trực tiếp trên nhân Windows thông qua lớp tương thích, các thao tác tệp trên /mnt/c có thể tiếp cận NTFS gần như trực tiếp, mang lại hiệu suất tốt cho các tác vụ nặng về tệp.

WSL 2 (Tháng 5 năm 2019) thay thế mô hình này bằng một nhân Linux hoàn chỉnh trong một máy ảo Hyper-V nhẹ. Đây là sự đánh đổi đúng đắn: các gọi hệ thống Linux thực sự, khả năng tương thích syscall tốt hơn và hiệu suất vượt trội cho các tác vụ gốc của Linux. Tuy nhiên, đối với truy cập chéo hệ điều hành, ranh giới máy ảo đòi hỏi một cách tiếp cận khác. Microsoft đã xây dựng một máy chủ tệp Plan 9 (9P) vào dịch vụ WSL phía Windows. Phiên làm việc Linux của bạn kết nối với nó qua socket Hyper-V khi khởi động, và các thao tác tệp trên /mnt/c đi qua kênh giao thức 9P này.

Giao thức 9P hoạt động tốt nhưng có chi phí giao thức: mỗi thao tác bị giới hạn bởi tham số kích thước tin nhắn (msize=65536, 64 KB). Các tác vụ nặng về tệp tiếp xúc với nhiều tệp nhỏ sẽ phải chịu chi phí này trong mỗi lần vòng lặp. Kể từ khi ra mắt, Microsoft đã liên tục cải tiến điều này.

Khoảng năm 2021, virtiofs xuất hiện như một tính năng thử nghiệm tùy chọn. Virtiofs sử dụng phương thức vận chuyển VirtIO để truy cập tệp bộ nhớ chia sẻ, giảm thiểu chi phí tuần tự hóa so với 9P. Bạn có thể kích hoạt nó trong phần [wsl2] của tệp .wslconfig bằng virtiofs=true.

Vấn đề tại lớp DMA

Các máy ảo trên Hyper-V thực hiện DMA cho I/O thông qua các bộ đệm chuyển tiếp (bounce buffers): một vùng bộ nhớ dành riêng dưới ranh giới DMA 4 GB mà phần cứng có thể địa chỉ trực tiếp. Nhân Linux gọi vùng này là SWIOTLB pool.

Cho đến gần đây, tất cả các thiết bị virtio trong một phiên WSL 2 đều chia sẻ một pool toàn cục này. Một điểm gắn virtiofs cho /mnt/c, một cái cho /mnt/d, và bộ điều hợp mạng virtio đều xếp hàng vào cùng một bộ đệm, gây ra sự cạnh tranh (contention) trong quá trình I/O nặng.

Giải pháp: SWIOTLB riêng biệt cho từng thiết bị

PR #40654, do Ben Hillis viết và hợp nhất vào ngày 27 tháng 5 năm 2026, cung cấp cho mỗi thiết bị virtio một pool DMA riêng biệt. Nhân Linux phân bổ một vùng vật lý liên tục dưới 4 GB khi khởi động, công bố địa chỉ của nó thông qua sysfs, và dịch vụ WSL đọc các giá trị này và đưa tùy chọn swiotlb= cho từng thiết bị virtio tại thời điểm tạo. Không còn sự chia sẻ hàng đợi giữa các ổ đĩa và bộ điều hợp mạng nữa.

Lưu ý: Điều này yêu cầu nhân Microsoft.WSL.Kernel phiên bản 6.18.26.3-1, đi kèm với WSL 2 DeviceHost 1.2.29-0. Nếu bạn đang sử dụng nhân cũ hơn, WSL sẽ thông báo: "Nhân đang chạy bị thiếu bản vá cải thiện đáng kể hiệu suất thiết bị virtio. Hãy cập nhật lên nhân WSL mới hơn để bật tối ưu hóa này."

Tác động thực tế

Các kịch bản được hưởng lợi nhiều nhất là các quy trình làm việc chéo hệ điều hành nặng về tệp: làm việc trong một dự án nằm trên ổ Windows nhưng biên dịch trong Linux. Nếu bạn lưu mã nguồn trong C:\Users\you\code và chạy cargo build, npm install, hoặc mvn package từ /mnt/c, mọi lần đọc tệp đều phải trả chi phí I/O chéo hệ điều hành. Pool riêng biệt cho từng thiết bị loại bỏ một trong những điểm cạnh tranh còn lại trên đường dẫn virtiofs.

Mạng VirtioProxy cũng được hưởng lợi, vì nó chia sẻ cùng cơ sở hạ tầng DMA và nhận được pool riêng của mình.

Để tận dụng tối đa tính năng này:

  • Đặt virtiofs=true trong phần [wsl2] của tệp .wslconfig.
  • Cập nhật lên nhân WSL mới nhất với lệnh wsl.exe --update --pre-release.
  • Đảm bảo RAM của phiên WSL 2 trên 1 GB. Pool SWIOTLB cần ít nhất 64 MB dung lượng trống.

Hiện tại, virtiofs vẫn là tính năng tùy chọn: phương thức vận chuyển mặc định vẫn là Plan 9 qua socket Hyper-V. Tuy nhiên, với những cải tiến liên tục như vậy, khoảng cách hiệu suất giữa WSL 2 và hệ thống gốc ngày càng được thu hẹp.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗