我尝试过Azure 文件服务作为一种网络文件系统,可由多台虚拟机同时挂载 - 这是常规 Azure 虚拟硬盘无法实现的。Azure VHD 一次只能连接到一台虚拟机。
但是,当通过 SMB 协议安装 Azure 文件共享时,我发现写入性能非常差。
设置如下,我已经在 VMCanonical:UbuntuServer:16.04-LTS:latest
上启动了一个 VM Standard_DS2
。
当启动过程完成后,我按照官方说明通过 SMB 挂载 Azure 文件共享。
sudo apt-get install cifs-utils
sudo mkdir -p /mnt/azure
sudo mount -t cifs //<storageaccount>.file.core.windows.net/<file-share-name> /mnt/azure/ -o vers=3.0,username=<storageaccount>,password=<base64-encoded>,dir_mode=0777,file_mode=0777,serverino
然后我运行这个简单的写入性能测试:
time for i in $(seq 1 500); do echo "hello!" > /mnt/azure/hello.txt; done
real 0m20.673s
user 0m0.032s
sys 0m0.124s
可以看出,它需要 20 多秒才能完成。作为比较,在我的本地机器(带有 SSD 驱动器)上运行相同的测试,我看到以下数字:
time for i in $(seq 1 500); do echo "hello!" > hello.txt; done
real 0m0.031s
user 0m0.004s
sys 0m0.024s
大约 30 分钟即可完成毫秒。因此,在 Azure 文件共享上运行时,性能损失几乎是 1000 倍。
这样的性能数字是可以预期的吗,还是我忽略了什么?
答案1
是的。
请记住,虽然本地磁盘和 Azure Files 本质上都是网络存储,但后者使用 I/O API 而不是直接硬件访问。延迟会高得多。说到这里,我们来做一个简单的数学题:
您正在发出 500 个请求,每次它都会打开和关闭一个连接:
500 个请求/20.673 秒 = 24.18 请求/秒
24.18 / 1000 = 0,02418s 完成每个请求,这很棒。
如果您需要处理小文件和/或大量文件的性能,那么 Azure 文件存储不适合您。理论上,它可以实现 1000 IOPS 和 60MB/秒。
此外,让我们面对现实吧,SMB/CIFS 处理小文件的速度非常慢。
答案2
我不确定这是否就是问题的全部,因为这看起来确实有很大的不同,但请记住:
- Azure 文件存储是标准存储,而不是高级存储,因此它都是旋转磁盘,没有 SSD,它总是比你的 SSD 慢。
- 您现在正在通过网络运行,这也会增加一些时间。不同大小的虚拟机有不同的限制,D2 将被限制在 1.5Gb/s 左右