先講結論:Mac 上 WebDAV 慢,通常不是你的伺服器慢,是 Finder 太囉唆。
把群暉 NAS 的 WebDAV 掛上來,點進一個放了幾百個檔案的資料夾,然後就是一段莫名其妙的等待。頻寬跑不滿,CPU 也沒事,就是慢。
Finder 打開一個資料夾要做多少事
把一個資料夾顯示出來,代價大致是這樣。
- 一次 Depth 1 的 PROPFIND,把資料夾裡的項目列出來。這步很正常,一來一回。
- 接著一連串後續 PROPFIND:逐項檢查、把剛拿到的屬性再確認一次,連你只是滑鼠掃過的子資料夾也順手看一眼。
- 每進一個資料夾讀一次 .DS_Store,離開時再寫一次,好把顯示方式記起來。
- 幾乎每個檔案都被探一次 AppleDouble 兄弟檔。資料夾裡有 report.pdf,Finder 就會再去找 ._report.pdf。對一台沒見過 Mac 的伺服器來說,這些全部是 404,而一次 404 的往返成本和 200 完全一樣。
- 掛載時探測鎖定支援。Finder 在意伺服器是不是 WebDAV class 2,沒有宣告 LOCK 的伺服器有機會被掛成唯讀,而且不會給你明確的錯誤訊息。
- 回應最好帶 Content-Length。Finder 對 chunked 的回應不太友善,伺服器常常因此被迫多做一層緩衝。
算一下就懂了:300 個檔案,每個平均三四次請求,伺服器在 40 ms 之外,光等就是四十秒上下,這時候檔案內容一個位元組都還沒開始傳。這裡面沒有一項是頻寬問題,全是延遲乘上請求次數。
同一台伺服器,用指令列戳起來很快,交給 Finder 就變樣,原因就在這。
WebDAV 速度優化,值得動手的設定
讓 Finder 別再寫 .DS_Store
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUE
改完登出再登入一次才會生效。兩個代價要先講明白:這是以使用者為單位的設定,對所有網路磁碟機都有效,SMB 共享也一樣;換來的副作用是這些磁碟機上的顯示方式不再被保存。已經寫出去的 .DS_Store 不會自己消失。
其餘能做的,都是在減少請求次數
- 關掉圖像預覽。在「顯示方式」選單裡打開顯示方式選項,取消勾選圖像預覽。不然 Finder 為了畫縮圖會真的去讀檔案內容。
- 資料夾結構自己能決定的話,單層盡量別超過幾百個項目。請求次數是跟項目數走的。
- 在大資料夾裡工作時用列表方式,不要用圖像或藝廊方式。
- 大批搬檔案不要走掛載。用專門的 WebDAV 程式,或直接在 AnyStorage 裡傳,一條連線處理完,不必讓 Finder 在中間指揮交通。
這些做法沒有一項能讓單次往返變快,它們只是減少往返次數。另一半自然就要從延遲下手。
把往返搬到本機回環
請求數砍不動,就砍延遲。
AnyStorage 走的就是這條路:WebDAV 伺服器跑在你自己的機器上,而不是網路的另一端。側邊欄進「服務」,切到 WebDAV 分頁,按啟動。預設端點是 http://127.0.0.1:3211,連接埠可以改(1 到 65535),撞到別的服務就換一個。HTTP Basic 驗證一直是開著的,預設使用者名稱 anystorage,首次使用時產生一組 24 位隨機密碼,兩者都能改,旁邊都有複製按鈕。接著在 Finder 裡選「前往」→「連接伺服器」,或直接 Cmd+K,貼上 http://127.0.0.1:3211,以註冊使用者身分用這組帳號密碼登入。
Finder 的行為一點都沒變乖,PROPFIND 照樣狂發,._ 照樣探。差別在於這些請求全都走本機回環,一個來回不到一毫秒。幾百次乘上一個很小的數字,結果還是很小。
程式裡目前處於已連線狀態的儲存空間,都會以資料夾的形式出現在 WebDAV 根目錄下,名稱就是連線名稱。S3、Cloudflare R2、Google 雲端硬碟、Dropbox、SFTP、本機資料夾,總共支援 20 種連線類型。真正還要走網路的只剩檔案內容,而讀取是串流的、支援 HTTP Range,所以在 QuickTime 裡拖時間軸只會抓需要的那一段,不必整個檔案下載完。
它解決不了的部分
Finder 終究還是 Finder,本機端點也生不出雲端服務沒給你的傳輸速度。
- 一個前綴底下放了五萬個物件,列出來還是慢,因為慢的是後端的列舉。回環省掉的是 Finder 的開銷,不是底下那次 API 呼叫。
- 免費版的 WebDAV 服務是唯讀的。讀寫屬於 Pro;Pro 使用者也可以自己把它設成唯讀。
- 目前版本沒有 TLS,網址是純 http,Basic 憑證也是明文,所以預設只監聽 127.0.0.1。開啟區域網路存取會綁定 0.0.0.0,程式會先跳出明確警告。
- 沒有真正的檔案鎖定,兩台機器同時改同一個檔案不會受到任何保護。不要把它當成團隊協作的基礎設施。
- 程式重新啟動後,某個連線要先在程式裡打開過一次,才會出現在 WebDAV 根目錄下,因為連線是延遲建立的。新增的連線則不需要重啟伺服器就會出現。
如果這些都做完,Finder 還是讓你不耐煩,那就在程式裡瀏覽,把掛載留給那些非要一個真實路徑不可的軟體。
常見問題
Finder 用 WebDAV 為什麼這麼慢
因為 Finder 的 WebDAV 用戶端發出的請求遠多於這件事需要的數量,你等的是請求次數,不是頻寬。顯示一個資料夾就要付出:一次 PROPFIND 把資料夾列出來,接著是對個別項目的一連串 PROPFIND,進資料夾時讀一次 .DS_Store、離開時再寫一次,以及幾乎為每個檔案都探一次 AppleDouble 的兄弟檔案——有 report.pdf 就會再去找 ._report.pdf,在一台沒見過 Mac 的伺服器上那是 404,而 404 的往返成本和 200 完全一樣。三百個檔案、每個三到四次請求、伺服器在 40 ms 之外,就是檔案內容還沒動到一個位元組就已經過了大約四十秒,所以換更快的線路並不會有用。真正能動的只有兩件事:減少往返次數(不讓 Finder 往網路卷寫 .DS_Store、關掉圖示預覽、改用列表檢視),以及縮短每一次往返,也就是把 WebDAV 端點放到 127.0.0.1 上。