这是Linux NFS客户端缓冲区吗?
在NFS挂载(具有古老的2.6.18内核的RedHat 5.6上的标准选项)中,在我看来,大写和多写操作会延迟较小的读操作.例如,如果同时运行cp或dd,则在目录中执行简单的ls将花费几秒(或几分钟).
这个问题有点缓解,因为 Linux缓存元数据几秒钟,但是当要写入大量数据时,NFS挂载变得无法使用. 起初我虽然这只是一个NFS服务器问题,但运行如下: for((i=0; i<60; i++)) do strace -f -t -o strace.$i.log time stat /mnt/nfs/data > out.$i.log 2>&1 sleep 1 if ((i == 30)); then dd if=/dev/zero of=/mnt/nfs/data bs=1M count=1000 & fi done wait 并行的tcpdump告诉我以下内容: 1)每当dd开始时,执行缓存未命中的下一个统计信息需要15秒 23261 16:41:24 munmap(0x2ad024d0e000,4096) = 0 23261 16:41:24 lstat("/mnt/fermat_emctest/data",{st_mode=S_IFREG|0600,st_size=1048576000,...}) = 0 23261 16:41:40 open("/proc/filesystems",O_RDONLY) = 3 2)tcpdump显示当dd正在运行并且发出WRITE调用时,不会发送单个GETATTR. 这就是为什么stat需要很长时间,因为它等待内核提交GETATTR调用. 我对吗 ? 我认为这与我的其他问题How to achieve multiple NFS/TCP connections to the same server?有某种关系. 有没有办法调整内核NFS操作队列? 解决方法
好的,这是我的答案.
与RedHat一起提供的内核2.6.18和2.6.32的https://bugzilla.redhat.com/show_bug.cgi?id=688232相关(我没有时间用vanilla更新的内核重新验证),在NFS客户端(v3 / tcp / default mount options)上,当一个是写入文件时,内核还需要更新该文件的时间戳.在写入文件时,如果另一个进程需要此文件的元数据(例如在此文件上执行stat或在其父目录中执行ls -l时),则此读取器进程会被内核延迟,直到写入完成. 在NFS级别,我可以看到内核只会发出GETATTR调用(我不确定这个,但在我的测试中最多5GiB,统计时间似乎与dd时间匹配)WRITE.写入越大,等待的时间越长. 使用慢速NFS服务器或具有大量RAM的服务器,该延迟可能是几分钟.当stat(2)进入休眠状态时,可以监视/ proc / meminfo以查找NFS_Unstable或Writeback,它显示有多少数据是飞行的. 我不确定为什么内核会这样做,但至少现在我理解了这种行为.所以没有bufferbloat,但有些操作是序列化的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |