发现 CIFS 共享速度极慢

发现 CIFS 共享速度极慢

参赛作品/proc/mounts

//OUR_ORG.file.core.windows.net/OUR_ORG /data/csv cifs rw,relatime,vers=3.0,sec=ntlmssp,cache=strict,username=OUR_ORG,domain=,uid=0,noforceuid,gid=0,noforcegid,addr=SOME_IP,file_mode=0777,dir_mode=0777,soft,persistenthandles,nounix,serverino,mapposix,rsize=1048576,wsize=1048576,echo_interval=60,actimeo=1 0 0

我正在尝试运行命令:

find /data/csv -mtime -1 -name '*.csv.gz'

不幸的是,它非常慢。

ls -alh --time-style=+%D /data/csv/

该命令运行正常并在不到 2 秒的时间内完成。

我检查了 strace。内部find使用newfstatat,但是内部ls使用。lstat

我更愿意使用find一些开关而不是解析ls输出。我能以某种方式让find命令变得相当快吗?

答案1

我有一个类似的 find 命令,它花费了将近 10 分钟,而 ls 命令只需几秒即可返回。缓存设置没有任何效果。

通过使用参数actimeo=60(默认值 = 1 秒),find 命令在不到 10 秒的时间内返回。

actimeo=arg

CIFS 客户端在从服务器请求属性信息之前缓存文件或目录属性的时间(以秒为单位)。在此期间,服务器上发生的更改将保持未被发现,直到客户端再次检查服务器。默认情况下,属性缓存超时设置为 1 秒。这意味着更频繁地在线调用服务器以检查属性是否已更改,这可能会影响性能。使用此选项,用户可以根据工作负载需求在性能和缓存元数据正确性之间进行权衡。较短的超时意味着更好的缓存一致性,但对服务器的调用次数会增加。较长的超时意味着对服务器的调用次数减少,但缓存一致性较差。actimeo 值是一个正整数,其值可以保持在 0 到最大值 2^30 * HZ(计时器中断频率)设置之间。

答案2

将参数更改为

cache=loose

手册页上有一条严肃的评论

当多个读取器和写入器对同一个文件进行操作时,cache=loose 可能会导致数据损坏。


cache=

Cache mode. See the section below on CACHE COHERENCY for details. Allowed values are:

    • none: do not cache file data at all 

    • strict: follow the CIFS/SMB2 protocol strictly 

    • loose: allow loose caching semantics 

The default in kernels prior to 3.7 was "loose". As of kernel 3.7 the default is "strict". 

相关内容