Dentry cache scalability

勉強がてら LWN.net を毎週見ているので、メモを晒していこうかと。元ネタはこちら
http://lwn.net/Articles/419811/

dentry cache はファイル名の lookup 処理 (ファイル名から dentry を検索する処理) の性能にとても効くのだけれど、これまで dentry cache の競合回避のために、グローバルな dentry_lock が使われていて、スケーラビリティが皆無だった。

これまでの dentry cache の排他制御には特殊な点があって、dentry cache 削除の場合だけ RCU を利用していた。このため、lookup 処理が途中でブロックしないならば競合の心配はないが、現実的な状況ではブロックしうるため、lookup の経路上の dentry cache の参照カウントを1ずつ上げて競合を回避している。参照カウントに頼って lookup するため、これは ref-walk な実装だと言える。

Nick Piggin の scalability パッチは既存の ref-walk アルゴリズムを、RCU-walk なアルゴリズムに置き換えるというものである。ただ単に RCU を利用するだけではだめで、頻繁に参照カウントが上げ下げされるとキャッシュが乱れて性能が出ないため、lookup 処理が dentry 構造体の中身を変更しないようにすることが重要である。

他にも、lookup 処理中に dentry がキャッシュ上に見つからず、いったん lookup を中断しなければならないケースや、dentry の変更に対する保護 (dentry の RCU は削除に対する保護のみ) は、気を遣う必要がある。前者は ref-walk 方式の lookup でやり直すことで対応し、後者は seqlock で同時変更を検出したときに lookup をやり直すことで対応しているようだ。