Linux Kernel 5.3
考虑fstat
定义为的系统调用int fstat(int fd, struct stat *statbuf);
。ext4 上的系统调用是否需要磁盘访问?fstat
我做了一些与之相关的研究并找到了一些信息。系统调用的内核入口点是函数vfs_statx_fd
。以下是它的实现方式:
int vfs_statx_fd(unsigned int fd, struct kstat *stat,
u32 request_mask, unsigned int query_flags)
{
struct fd f;
int error = -EBADF;
if (query_flags & ~KSTAT_QUERY_FLAGS)
return -EINVAL;
f = fdget_raw(fd);
if (f.file) {
error = vfs_getattr(&f.file->f_path, stat,
request_mask, query_flags);
fdput(f);
}
return error;
}
所以我们在这里得到的unsigned int fd
是用户传递给系统调用的实际文件描述符,用于查找指向struct file
. 其定义的关键部分是
struct file {
//...
struct path f_path;
struct inode *f_inode; /* cached value */
//...
}
所以我们基本上有它struct file
代表一个打开的文件,并且结构包含对dentry
和的引用inode
如果我们有一个打开的文件描述符,我们是否可以仅从内存中获取所有统计信息,从而避免昂贵的磁盘访问?
更新:我试图free && sync && echo 3 > /proc/sys/vm/drop_caches && free
在调用之前刷新内核缓存syscall
,它不会影响 stat 系统调用的时间。所以我倾向于认为不需要磁盘访问。
在 Ext4 文件系统上,从 开始的函数图
vfs_statx_fd
是查看所有这些函数的实现表明没有提供磁盘 I/O。正如您所猜测的,数据来自缓存的 inode。
另请参阅手册
fstat(2)
页,其中提到:(尽管这更多地与锁定而不是缓存有关)。
对于其他一些文件系统,
AT_STATX_FORCE_SYNC
可以在查询标志中包含强制远程同步;这在 Ceph、FUSE、NFS 和 VirtualBox 来宾共享文件夹上受支持。