Azure文件存储SMB缓慢列出目录

时间:2016-06-02 03:08:09

标签: c# azure azure-storage smb azure-files

我们有一个应用程序,通过Azure文件列出文件夹中的文件。当我们使用C#方法时:

Directory.GetFiles(@"\\account.file.core.windows.net\xyz")

当有2000个文件时,大约需要一分钟。

如果我们使用CloudStorageAccount执行相同的操作:

  CloudFileClient fileClient = storageAccount.CreateCloudFileClient();
  CloudFileDirectory directory = fileClient.GetShareReference("account").GetRootDirectoryReference().GetDirectoryReference("abc");
  Int64 totalLength = 0;
  foreach (IListFileItem fileAndDirectory in directory.ListFilesAndDirectories())
  {
    CloudFile file = (CloudFile)fileAndDirectory;
    if (file == null) //must be directory if null
      continue;

    totalLength += file.Properties.Length;
  }

它返回所有文件,但大约需要10秒钟。为什么性能会有这么大的差异?

1 个答案:

答案 0 :(得分:2)

使用Directory.GetFiles(系统文件API)时,它实际上通过SMB协议与Azure文件存储进行通信(v2.1或v3.0取决于客户端操作系统版本)。但是,当切换到CloudStorageAccount时,它会通过REST与文件存储进行通信。如果您使用Wireshark,您会发现由于协议的性质,SMB协议将在客户端和服务器之间有几个来回请求。 Azure文件存储支持SMB和REST访问的原因是允许您的旧代码/应用程序(以前用于访问由文件服务器托管的文件共享)现在可以与云中的文件共享进行通信而无需更改代码。

因此,您的建议是使用REST调用来访问Azure文件存储以获得更好的性能。