Sun’s Network File System (NFS)

這篇是閱讀 Operating Systems: Three Easy Pieces Sun’s Network File System (NFS) 的心得。這篇文章是說明 NFSv2 的設計。

NFS 用起來和其它 file system 一樣,軟體一樣用 open(), read(), write() 操作檔案,然後 NFS client 會改用 NFS protocol 傳指令給 NFS server,再將結果以 open(), read(), write() 規定的形式傳回給軟體。下面是示意圖:

http://pages.cs.wisc.edu/~remzi/OSTEP/dist-nfs.pdf

架構設計

NFS 的設計關鍵在於如何保證 client 和 server 在 request lost 後,仍能正常操作。client 發一個 request 給 server,以下任何一種情況都會造成 request lost:

  • client 發出 request,但網路有問題而沒傳達。
  • server 收到 request,處理中 server crash。
  • server 處理完了,但網路有問題 client 沒收到回覆。

兩邊斷線後,要如何保證兩邊的狀態一致,是很困難的事。工作上我常會遇到網路問題,對這裡提的問題特別有感。

NFSv2 的解法很簡單:

  • server 不要有狀態 (stateless) 就沒有同步問題,NFS client 每個指令都要帶足夠的資訊讓 NFS server crash 後一樣能正常處理。
  • 每個指令都可以被重覆執行多次 (Idempotence),而不會有問題。

比方說 write() 有指定寫入的 offset 起點,這樣即使 server 執行完第一次 request,client 沒收到回覆。client 再要求 server 作第二次,結果仍會正確。話說 API 設計上,我也偏好 Idempotence,像先前讀到 file system 用 journaling 解 crash consistent 的問題,用 physical logging 就比較容易作到 Idempotence。特別是這類同步資料的需求,Idempotence 可以避免錯誤如滾雪球愈滾愈大。

stateless protocol 是很不錯的設計,像 HTTP 就是廣泛使用的 stateless protocol,需要 state 的時候,client 需要每次放 request 都夾帶先前 server 回傳的資料 (即 HTTP header 裡的 cookies)。減輕 server 設計和實作的負擔。

但話說回來,stateless 要怎麼作 file lock?這篇文章沒有提及。google 一下得知 NFSv2、NFSv3 是另外透過 NLM (Network Lock Manager) 作,而 NFSv4 有 state 並包含 lock 的功能 (ref1.、ref2.)。

stateless 另一個缺點是傳輸資料量會比較多,視應用性質可能會是問題。

效能最佳化

提升讀取效能自然是用 cache,有了 cache 就有 cache consistency problem。原本想說會不會用和 CPU 一樣的作法 (MESI Protocol),結果 NFSv2 的作法相當直接:讀 cache 前先問 server 該檔案的最後更新時間,這和 HTTP 的 last-modified 一樣。不過和 web server 不同的地方是,HTTP 回傳值可以帶 expires 說明資料失效的時間,讓 client 不會一直重覆問。NFS 的使用情境無法這麼作。

那 NFSv2 怎麼解決大量詢問最後更新時間的問題呢?作法也很直接,client 有個 file attribute cache,比方說每筆資料三秒內有效,讓 client 不要那麼常詢問檔案最後更新時間。這讓 NFS 會有意外狀況 (讀到較舊的資料),但滿足多數情況的需求。還滿無賴的解法,將 bug 變成「規格」的一部份。

寫入效能是另一個問題:由於 NFSv2 是 stateless,server 和 client 說寫入成功,就真得要寫入成功 — 也就是有寫入硬碟。這會拖慢 server 回覆寫入操作的時間。如果 server 只是寫入 write buffer 就回覆寫入成功,若 server 不幸立即 crash 又立即重開且 client 沒有察覺,client 再繼續寫入後面的資料,會讓資料內容變成前半是舊的,後半是新的。所以 server 得確保資料寫入硬碟才能回覆 client。

文章內提到有廠商用帶有電池的記憶體,讓 NFS server 先寫入資料到那裡,就能立即回覆 client;還有用特化的 file system,專門加速寫入硬碟的操作。

Like what you read? Give fcamel a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.