我目前在 NFS 网络文件夹上使用以下命令时性能非常差:
time find . | while read f; do test -L "$f" && f=$(readlink -m $f); grp="$(stat -c %G $f)"; perm="$(stat -c %A $f)"; done
问题 1) 在循环中,使用变量 grp 和 perm 检查权限。有没有办法降低通过网络进行此类检查的磁盘 I/O 量(例如,使用 find 一次读取所有元数据)?
问题 2) 似乎 NFS 调校得不是很好,通过 SSHFS 在类似的网络链接上执行相同操作仅花费三分之一的时间。所有参数都是自动协商的。有什么建议吗?
答案1
您的代码对每个文件执行了三次调用;单个stat
+ 解析输出就足够了。首先,重新设计您的脚本stat
以仅使用stat -c "%n %G %A"
... 调用一次。如果您需要帮助,请给我们留言。
答案2
我在过去一个小时内找到的最快的解决方案是:
failed=$(find -L . -printf "%p %g %M\n" | awk '{ if ($2 != "XYZ"){ printf $1; exit 1 }; if ( substr( $3, 9, 1 ) != "-" ) { printf $1; exit 2 } }')
ret=$?
test ! $ret -eq 0 && echo "Error with file $failed"
以检查某个群组所有者和权限为例。此版本仅使用 find 而不使用 stat 并跟踪符号链接,速度至少快 100 倍。