gpt4 book ai didi

linux - 在 Linux 上,access() 是否比 stat() 快?

转载 作者:IT王子 更新时间:2023-10-29 00:00:48 26 4
gpt4 key购买 nike

我会假设 access() 只是 stat() 的包装器,但我一直在谷歌搜索并找到 found some anecdotes关于用“更便宜”的访问调用替换统计调用。假设您只对检查文件是否存在感兴趣,访问速度是否更快?它是否完全因文件系统而异?

最佳答案

理论

我对此表示怀疑。

在内核的较低层中,access()stat() 调用之间没有太大区别,两者都执行查找操作:它们将文件名映射到 dentry 缓存inode 中(它是实际的内核结构,inode)。查找是一个缓慢的操作,因为您需要为路径的每个部分执行它,即对于 /usr/bin/cat 您将需要查找 usr, bin 然后是 cat 并且它可能需要从磁盘读取——这就是 inode 和 dentry 缓存在内存中的原因。

这两个调用之间的主要区别是 stat()inode 结构转换为 stat 结构,而 access() 会做一个简单的检查,但与查找时间相比,这个时间很小。

真正的性能提升可以通过 at 操作实现,比如 faccessat()fstatat(),它允许 open() 目录一次,比较一下:

struct stat s;
stat("/usr/bin/cat", &s); // lookups usr, bin and cat = 3
stat("/usr/bin/less", &s); // lookups usr, bin and less = 3

int fd = open("/usr/bin"); // lookups usr, bin = 2
fstatat(fd, "cat", &s); // lookups cat = 1
fstatat(fd, "less", &s); // lookups less = 1

实验

我写了一个小的 python 脚本,它调用 stat()access():

import os, time, random
files = ['gzexe', 'catchsegv', 'gtroff', 'gencat', 'neqn', 'gzip',
'getent', 'sdiff', 'zcat', 'iconv', 'not_exists', 'ldd',
'unxz', 'zcmp', 'locale', 'xz', 'zdiff', 'localedef', 'xzcat']
access = lambda fn: os.access(fn, os.R_OK)

for i in xrange(1, 80000):
try:
random.choice((access, os.stat))("/usr/bin/" + random.choice(files))
except:
continue

我使用 SystemTap 跟踪系统以测量在不同操作上花费的时间。 stat()access() 系统调用都使用 user_path_at_empty() 内核函数来表示查找操作:

stap -ve ' global tm, times, path;
probe lookup = kernel.function("user_path_at_empty")
{ name = "lookup"; pathname = user_string_quoted($name); }
probe lookup.return = kernel.function("user_path_at_empty").return
{ name = "lookup"; }
probe stat = syscall.stat
{ pathname = filename; }
probe stat, syscall.access, lookup
{ if(pid() == target() && isinstr(pathname, "/usr/bin")) {
tm[name] = local_clock_ns(); } }
probe syscall.stat.return, syscall.access.return, lookup.return
{ if(pid() == target() && tm[name]) {
times[name] <<< local_clock_ns() - tm[name];
delete tm[name];
} }
' -c 'python stat-access.py'

结果如下:

         COUNT      AVG
lookup 80018 1.67 us
stat 40106 3.92 us
access 39903 4.27 us

请注意,我在实验中禁用了 SELinux,因为它会对结果产生重大影响。

关于linux - 在 Linux 上,access() 是否比 stat() 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32748530/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com