參數(shù)指定
mount時候可以提供參數(shù)ac
或者noac
設置attribute cache參數(shù)欺嗤。具體含義參考
mount -o noac #沒有attribute cache
mount -o actimeo=60 #設置attribute cache為60s
Linux Kernel分析
為了避免頻繁發(fā)送get attribe,Linux kernel在timeout之前讹挎,使用上次得到的結(jié)果筒溃。
int nfs_attribute_timeout(struct inode *inode)
{
struct nfs_inode *nfsi = NFS_I(inode);
return !time_in_range_open(jiffies, nfsi->read_cache_jiffies, nfsi->read_cache_jiffies + nfsi->attrtimeo);
}
當然在timeout之間怜奖,但cache數(shù)據(jù)需要更新時歪玲,也需要再次發(fā)送NFS請求
static bool nfs_need_revalidate_inode(struct inode *inode)
{
if (NFS_I(inode)->cache_validity &
(NFS_INO_INVALID_ATTR|NFS_INO_INVALID_LABEL))
return true;
if (nfs_attribute_cache_expired(inode))
return true;
return false;
}
需要更新的幾種情況
static void nfs_drop_nlink(struct inode *inode)
{
spin_lock(&inode->i_lock);
/* drop the inode if we're reasonably sure this is the last link */
if (inode->i_nlink == 1)
clear_nlink(inode);
NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATTR;
spin_unlock(&inode->i_lock);
}
nfs-ganesha中類似Kernel的機制
在獲取atttribte時候,會先先經(jīng)過DCache層钙皮,如果mdcache_is_attrs_valid
返回true,直接從cache層拿以前的數(shù)據(jù)』派眨可以通過修改參數(shù)Attr_Expiration_Time
為0,其默認值為60
static inline bool
mdcache_is_attrs_valid(mdcache_entry_t *entry, attrmask_t mask)
{
...
if ((mask & ATTR_ACL) != 0 && entry->attrs.expire_time_attr > 0) {
time_t current_time = time(NULL);
if (current_time - entry->acl_time >
entry->attrs.expire_time_attr)
return false;
}
return true;
}