天天看點

[深入了解檔案系統之六]:Directory Name Lookup Cache

作為BSD對檔案系統最主要的三大貢獻之一,Directory Name Lookup Cache 極大地提高了檔案路徑名解析的速度。那麼什麼是路徑名解析和Directory Name Lookup Cache呢?

路徑名解析

考慮到現代檔案系統中對多個檔案系統的支援,可能存在一個絕對路徑名,穿越了多個檔案系統層的情況,是以現在沒有辦法像之前unix檔案系統樣用路徑名之間找對應的inode/vnode節點,而應該逐層調用各自檔案系統對應的vop_lookup()操作,僞碼如下:

<code>if</code>

<code>    </code><code>(absolute_pathname) {</code>

<code>    </code><code>dirvp = rootdir</code>

<code>} </code><code>else</code> <code>{</code>

<code>    </code><code>dirvp = u.u_cdir</code>

<code>}</code>

<code>do</code>

<code>{</code>

<code>    </code><code>name = extract string from pathname</code>

<code>    </code><code>newvp = VOP_LOOKUP(dirvp, name, ...)</code>

<code>    </code><code>if</code> <code>not last component {</code>

<code>        </code><code>dirvp = newvp</code>

<code>    </code><code>}</code>

<code>}until basename of pathname reached</code>

<code>return</code> <code>newvp</code>

DNLC ( Directory Name Lookup Cache)

基于局部性原理,常用的檔案可能會常常打開,這樣就需要反複執行上面的程式,根據路徑名找到vnode節點,為了避免這裡帶來的重複操作,DNLC(Directory Name Lookup Cache))建立起來了路徑名和vnode的映射關系。更進一步,為了避免反複冗長的路徑名解析,基于parent vnode和路徑名生成了hash值, 然後建立這個hash值和目前vnode的映射關系。整個DNLC的資料結構和機制如下圖所示:

<a href="https://s4.51cto.com/wyfs02/M01/8E/4D/wKioL1i8986z-ycbAABsjyMGzBo359.png" target="_blank"></a>

雖然最早在剛引入DNLC之後,在大量檔案(500K~1000K)打開和關閉測試的情況下,命中率能夠達到85%。但現在的DNLC的命中率應該可以達到90%以上,如果達不到,可以ncsize和最大程序數和使用者數進行調節。

本文轉自存儲之廚51CTO部落格,原文連結: http://blog.51cto.com/xiamachao/1903607,如需轉載請自行聯系原作者

繼續閱讀