WSL2檔案系統處理速度較慢

chinagod發表於2024-07-31

測試一下檔案寫入速度

WSL1:

root@DESKTOP-QK7OLED:~# dd if=/dev/zero of=/mnt/e/testfile bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 25.163 s, 41.7 MB/s

WSL2:

root@DESKTOP-QK7OLED:~# dd if=/dev/zero of=/mnt/e/testfile bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 45.4924 s, 23.0 MB/s

WSL1(23.0 MB/s) 比 WSL2(41.7 MB/s) 快了將近一倍。

測試一下讀取速度:

WSL1:

root@DESKTOP-QK7OLED:~# dd if=/mnt/e/testfile of=/dev/null bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 0.193664 s, 5.4 GB/s

WSL2:

root@DESKTOP-QK7OLED:~# dd if=/mnt/e/testfile of=/dev/null bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 3.26758 s, 321 MB/s
WSL1(5.4 GB/s)是 WSL2(321 MB/s)的16倍!

主要原因是WSL2採用是9P協議訪問Windows的驅動器,這個協議目前比較慢:

WSL2 uses the 9P protocol to access Windows drives, and it is currently (See Footnote) known to be very slow when compared to:

  • Native NTFS (obviously)
  • The ext4 filesystem on the virtual disk used by WSL2
  • And even the performance of WSL1 with Windows drives

---------------https://stackoverflow.com/a/68974497/6386067

WSL開發人員的有較為詳細的解釋https://github.com/microsoft/WSL/issues/4197#issuecomment-604592340 。

個人理解,WSL2的作業系統執行在Linux的原生檔案系統(ext)上,WSL2檔案系統本身相當於一個封閉的箱子,在操作其他檔案系統的檔案(比如母系統Windows系統的檔案)時,WSL2要先進行檔案系統格式的轉換,所以比較慢。

WSL1的作業系統是執行在Windows的檔案系統(NTFS)上,WSL1的檔案系統的和母系統Windows的檔案系統格式相同,在操作“掛載在Windows系統上的磁碟”的檔案時,不涉及IO轉換,所以會快一些。但是由於WSL1的作業系統本身是“翻譯成Windows”的Linux。

解決WSL2訪問Windows系統檔案慢的一個辦法是,改用NFS協議連結(參見https://stackoverflow.com/a/76314967/6386067)。

還有一種理論的辦法,不經過Windows系統掛載,直接從WSL2子系統掛載磁碟。https://learn.microsoft.com/en-us/windows/wsl/wsl2-mount-disk

測試一下,有一個格式為exFAT的行動硬碟,從WSL2直接掛載試試,不知道是否可以呢,速度是否有提升呢?

經過測試,WSL2目前還不支援直接掛載exFAT格式的磁碟。其他格式可能支援,但沒有嘗試過。

嘗試記錄

#Powershell admin命令列
#查詢掛載的驅動器ID
PS C:\Windows\system32> GET-CimInstance -query "SELECT * from Win32_DiskDrive" DeviceID Caption Partitions Size Model -------- ------- ---------- ---- ----- \\.\PHYSICALDRIVE0 SSDPEMKF512G8 NVMe INTEL 512GB 3 512105932800 SSDPEMKF512G8 NVMe INTEL 512GB \\.\PHYSICALDRIVE1 WD My Passport 2682 USB Device 1 5000945564160 WD My Passport 2682 USB Device \\.\PHYSICALDRIVE2 WD Elements SE SSD SCSI Disk Device 1 2000396321280 WD Elements SE SSD SCSI Disk Device

#使用--mount選項直接掛載磁碟。失敗,WSL2不支援格式。
PS C:\Windows\system32> wsl --mount \\.\PHYSICALDRIVE2
The disk was attached but failed to mount: Invalid argument.
For more details, run 'dmesg' inside WSL2.
To detach the disk, run 'wsl.exe --unmount \\.\PHYSICALDRIVE2'.

#解除安裝磁碟。
PS C:\Windows\system32> wsl --unmount \\.\PHYSICALDRIVE2
The operation completed successfully.

#嘗試使用--bare指令,分兩步掛載
#第一步,在PowerShell中掛載
PS C:\Windows\system32> wsl --mount \\.\PHYSICALDRIVE2 --bare
The operation completed successfully.
#第二步,在bash中呼叫mount -t選項掛載。提示錯誤,無法掛載
root@DESKTOP-QK7OLED:~# sudo mount -t exfat /dev/sdd1 /mnt/e mount: /mnt/e: unknown filesystem type 'exfat'. dmesg(1) may have more information after failed mount system call.

相關文章