Azure 文件存储 SMB 缓慢列出目录中的文件
Azure file Storage SMB slow to list files in directory
我们有一个应用程序可以通过 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;
}
它returns所有文件,但大约需要 10 秒。为什么性能差异这么大?
当使用 Directory.GetFiles(系统文件 API)时,它实际上通过 SMB 协议与 Azure 文件存储通信(v2.1 或 v3.0 取决于客户端 OS 版本) .但是,当切换到 CloudStorageAccount 时,它会通过 REST 与文件存储对话。如果您使用 Wireshark,您会发现由于协议的性质,SMB 协议将在客户端和服务器之间有多个来回请求。 Azure 文件存储同时支持 SMB 和 REST 访问的原因是允许您的遗留 code/application(用于访问文件服务器托管的文件共享)现在可以在不更改代码的情况下与云中的文件共享通信。
因此,针对您的情况,建议使用 REST 调用来访问 Azure 文件存储以获得更好的性能。
我们有一个应用程序可以通过 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;
}
它returns所有文件,但大约需要 10 秒。为什么性能差异这么大?
当使用 Directory.GetFiles(系统文件 API)时,它实际上通过 SMB 协议与 Azure 文件存储通信(v2.1 或 v3.0 取决于客户端 OS 版本) .但是,当切换到 CloudStorageAccount 时,它会通过 REST 与文件存储对话。如果您使用 Wireshark,您会发现由于协议的性质,SMB 协议将在客户端和服务器之间有多个来回请求。 Azure 文件存储同时支持 SMB 和 REST 访问的原因是允许您的遗留 code/application(用于访问文件服务器托管的文件共享)现在可以在不更改代码的情况下与云中的文件共享通信。
因此,针对您的情况,建议使用 REST 调用来访问 Azure 文件存储以获得更好的性能。