本文是对 IPFS 存储性能测试的一个报告。

文章导读

Note: 本次测试使用的都是单台服务器,主要测试 IPFS 读写性能,以及哪些因素会影响 IPFS 的存储效率。
统计方式:每组操作执行5次,然后取平均值

本地测试

考虑到硬件对存储性能的影响,我们这里分别使用了两台不同配置的台式机进行了测试。

配置一

  • CPU: i5-4160-4Core 主频 3.2G
  • 内存: 8GB
  • 硬盘:普通家用硬盘 1GB
  • 操作系统:Ubuntu 18.04-LTS

测试结果

网络环境 文件大小 写入时间(ms) 读取时间(ms) 写入速度(MB/s) 读取速度(MB/s)
本地 1G 103584.98 41718.92 9.97 24.25
本地 500M 45045.54 7469.16 11.11 66.66
本地 100M 8981.92 1162.43 11.22 86.20
本地 50M 4022.22 577.39 12.43 86.65
本地 10M 1775.41 252.60 5.64 39.68
本地 5M 1165.52 186.50 4.54 27.77
本地 1M 530.57 151.1872 1.88 6.66

配置二

  • CPU: i7-8700K CPU @ 3.70GHz
  • 内存: 16GB
  • 硬盘: 希捷企业硬盘 8TB
  • 操作系统:Ubuntu 18.04-LTS
网络环境 文件大小 写入时间(ms) 读取时间(ms) 写入速度(MB/s) 读取速度(MB/s)
本地 1G 37819.67 2237.9 27.08 459.19
本地 500M 16841.98 1085.08 29.76 462.96
本地 100M 3006.19 266.68 32.67 384.61
本地 50M 2496.54 143.81 20.08 357.14
本地 10M 1156.53 47.92 8.69 212.76
本地 5M 583.78 52.28 8.62 58.13
本地 1M 204.68 37.77 5 27.02

本地测试原始数据 (单位:mses)

# i5 CPU
Write:
1G: 97389.72878, 100163.63883, 102394.04202, 121107.44262, 96870.09001
500M 46019.42205, 43743.31760, 45353.94692, 45235.54754, 44875.50592
100M 8350.12960, 8919.12270, 8405.61080, 9136.59215, 10098.17624
50M 3909.33299, 3994.80295, 4111.20057, 4065.45925, 4030.31278
10M 1789.08062, 1746.42110, 1776.58439, 1807.98721, 1756.99902
5M 1187.28948, 1139.60743, 1186.48696, 1171.19718, 1143.03637
1M 544.82102, 512.79807, 485.28814, 553.72643, 556.23889

Read:
1G: 39059.96132, 42852.09465, 40929.29006, 41882.52759, 43870.74089
500M 7555.64952, 8230.87454, 7912.68301, 6132.61437, 7514.02307
100M 858.94799, 1568.71152, 1702.42906, 873.50821, 808.59113
50M 447.64829, 781.59356, 776.32689, 451.41816, 430.00174
10M 203.68147, 295.31884, 368.38579, 200.71745, 194.91434
5M 165.23266, 217.01288, 220.20507, 170.92180, 159.16085
1M 167.58633, 167.72866, 166.81981, 119.10820, 134.69315

本地使用的是我是直接使用 IPFS 自带的客户端命令行工具进行测试的,通过 shell 脚本进行批量测试,值得一提的是,可能 shell 脚本的运行时间统计可能有些许不是 特别精确,但是我们这个测试本身也是比较粗略的定性测试,所以这个不影响结果。

下面我贴出我的测试脚本,有兴趣的同学可以自己运行测试一下:

#!/bin/bash

timer() {
	timeStamp=`date +%s.%N`
	echo $timeStamp
}

dir="/home/yangjian/downloads"
datas=(
	"$dir/data-1GB.zip"
	"$dir/data-500MB.zip"
	"$dir/data-100MB.zip"
	"$dir/data-50MB.zip"
	"$dir/data-10MB.zip"
	"$dir/data-5MB.zip"
	"$dir/data-1MB.zip"
)

rm Qm*
start=$(timer)

for file in ${datas[@]}
do
	echo -e "\033[35m\033[1m+++++++++++++++ Test for file $file +++++++++++++++\033[0m"
	# put files
	t1=$(timer)
	r=$(ipfs add $file)
	t2=$(timer)

	cost=`awk 'BEGIN{printf "%.5f\n",(('$t2'-'$t1')*1000)}'`
	filename=`echo $r | awk '{print $2}'`
	echo -e "\033[32m\033[1mPut file successfully, hash: $filename, cost: $cost msecs.\033[0m"

	# get files
	t1=$(timer)
	ipfs get $filename
	t2=$(timer)

	cost=`awk 'BEGIN{printf "%.5f\n",(('$t2'-'$t1')*1000)}'`
	echo -e "\033[32m\033[1mGet file successfully,  cost: $cost msecs.\033[0m"
done

end=$(timer)
cost=`awk 'BEGIN{printf "%.5f\n",(('$end'-'$start')*1000)}'`
echo -e "\033[34m\033[1mTotal cost: $cost msecs.\033[0m"

exit 0

Note: 这里需要注意的是,IPFS 的存储是去重的,也就是说,相同的文件,第一次存储是最慢的,之后如果你再存储相同的文件,它会非常快。 我们这里都是取第一次的存储所耗费的时间。如果你要像我一样通过多次测试取平均值的话,你每测试完一次之后需要重新初始化 IPFS 节点, 这样测试虽然挺繁琐的,但是结果比较精确。

初始化的方法很简单:

rm -rf ~/.ipfs
ipfs init
ipfs daemon

下图是本人实测的运行截图:

局域网测试

机器配置

  • CPU: i7-8700K CPU @ 3.70GHz
  • 内存: 16GB
  • 硬盘: 希捷企业硬盘 8TB
  • 操作系统:Ubuntu 18.04-LTS

测试结果

网络环境 文件大小 写入时间(ms) 读取时间(ms) 写入速度(MB/s) 读取速度(MB/s)
局域网 1G 41630.6 9640.5 24.59 106.22
局域网 500M 19016.4 4677.8 26.29 107.06
局域网 100M 3365.6 1016.8 29.76 94.33
局域网 50M 2073.6 489 24.15 102.24
局域网 10M 854.2 123 11.76 83.33
局域网 5M 396 72.8 12.82 69.44
局域网 1M 136.6 34.8 7.35 29.41

局域网测试原始数据 (单位:msec)

Write:
1G 40780, 41130, 41226, 43040, 41977
500MB 18280, 19613, 18984, 18799, 19406
100MB 3207, 3518, 3129, 3551, 3423
50MB 1862, 1989, 2072, 2182, 2263
10MB 864, 860, 759, 895, 893
5MB 404, 392, 414, 369, 401
1MB 119, 171, 110, 176, 107

Read:
1G 9675, 9755, 9590, 9542,9557
500MB 4674, 4670, 4667, 4677, 4701
100MB 1018, 1018, 1019, 1012, 1017
50MB 481, 503, 488, 491, 482
10MB 122, 126, 126, 122, 119
5MB 73, 71, 72, 74, 74
1MB 36, 33, 35, 36, 34

下面同样贴出本人的实测截图:

从本地测试和局域网测试数据可以看出一些问题:

  1. 高配置的 CPU 和 硬盘能够明显提升 IPFS 的存储性能,估计是 IPFS 在分片的时候,更好的 CPU 能更快速地创建分片。
  2. 在进行小文件(10M 以下)存储时,发现局域网速度比还是稍微快一些,这个是因为二者使用的是不同的客户端,本地使用的是 IPFS 自带的 ipfs 客户端。 局域网使用的是 ipfs-http-client 工具。还有就是局域网测试的时候我没有算把文件转为字节流的时间,以及连接服务端的时间。
  3. 文件越小,绝对的存储速度越慢,这是因为存储的边际效应递减的缘故,因为文件太小的时候,一些初始化以及网络连接的时间占比就大大增加了。

公网测试

公网本人使用的是阿里云主机进行测试的。这次测试的工具是自己写的 IPFS php client 工具,为什么不继续使用 IPFS nodejs client, 一个原因是因为本人擅长 PHP 语言,另一个原因是下面要跟七牛云做对比,尽量做到单一变量原则。

机器配置

  • CPU: Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz 双核
  • RAM: 8GB
  • 硬盘: 普通云盘,80GB
  • 带宽: 2MB
  • 操作系统: Ubuntu 16.04.4 LTS

公网测试结果

网络环境 文件大小 上传时间(s) 上传速度(MB/s)
gamma云 1G 263.59 3.88
gamma云 500M 125.95 3.96
gamma云 100M 25.34 3.94
gamma云 50M 10.55 4.73
gamma云 10M 0.95 10.52
gamma云 5M 0.26 19.23
gamma云 1M 0.11 9.09

公网测试原始数据 (单位:sec)下表列出了 5 次文件上传的实际耗时。

文件大小 1 2 3 4 5
1G 268.32 261.71 266.63 262.56 258.74
500MB 129.14 125.61 125.68 123.97 125.38
100MB 24.18 24.54 24.68 28.70 24.60
50MB 11.11 10.29 10.56 10.31 10.49
10MB 0.95 0.95 0.98 0.94 0.94
5MB 0.27 0.23 0.26 0.28 0.26  
1MB 0.11 0.14 0.11 0.12 0.10

与七牛云对比测试

上面我们测试了 IPFS 在各种网络条件下的单节点存储的绝对性能,看起来还不错,但是毕竟 IPFS 是一个新的分布式文件系统,不确定是否能够满足商用需求,提供稳定的 云存储服务。接下来我分别使用同样的数据测试了七牛云的企业存储服务的性能。看看 IPFS 的单节点跟七牛云的存储服务性能对比是否存在比较大的差距。

我使用七牛云官方的 php sdk 作为测试工具,分别测试了 1GB,500MB,100MB,50MB,10MB,5MB,1MB 文件的上传和下载,测试结果如下:

七牛云测试结果

网络环境 文件大小 上传时间(s) 上传速度(MB/s)
七牛云 1G 264.08 3.87
七牛云 500M 129.43 3.87
七牛云 100M 25.65 3.89
七牛云 50M 10.71 4.66
七牛云 10M 1.55 6.45
七牛云 5M 0.88 5.68
七牛云 1M 0.25 4.00

从测试数据可以看出,上传速度稳定在 5MB 左右,我本地的上传带宽是 50MB 的, 所以这个上传速度应该没有受到本地上传带宽的影响,也就是说是服务端的性能没有受到压制,数据没有问题。

七牛云测试原始数据(单位:sec)下表列出了 5 次文件上传的实际耗时。

文件大小 1 2 3 4 5
1G 262.94 262.45 268.50 261.31 265.21
500MB 148.29 124.73 123.31 122.87 127.99
100MB 25.12 25.60 26.71 25.41 25.44
50MB 10.65 10.76 10.57 10.56 11.05
10MB 1.64 1.63 1.64 1.47 1.40
5MB 0.83 0.89 0.83 0.87 1.00
1MB 0.25 0.24 0.26 0.26 0.26

Node: 七牛云和 IPFS 的下载都是通过 http 网关提供服务,所以下载速度就完全只跟下载带宽有关了,本人阿里云服务器带宽只有 2MB, 所以下载的最大速度只有 220KB/s,要远远低于七牛云的下载速度(12MB/s),所以这个下载速度不具备可比性。

总结

通过测试我们可以发现,对于本地存储和局域网存储,IPFS 的存储性能略低于拷贝,这是由于 IPFS 需要对文件进行分片存储。

对于线上的环境,带宽成为了上传速度的最大瓶颈了,但是 IPFS 的性能表现依然不差,对于 100MB 以下的小文件,IPFS 的表现甚至要比七牛云 更优。考虑到七牛云的硬件配置应该比我们的高的多,所以如果把 IPFS 作为一个分布式云存储工具,根据本人测试的结果来看,性能上应该不比七牛云差。

那如果我们在进一步考虑到由于 IPFS 本身的各种优势以及特点,IPFS 节点是自带 CDN 加速的,也就是说节点越多,IPFS 的存储系统的读取效率将会更高。 而且同一个文件在第二次存储的时候,IPFS 只需要判断其哈希值就可以了,不需要再次分片以及存储工作,所以存储会非常快。因此我们有充分的 理由相信,使用 IPFS 做分布式云存储,将大有可为。

相关文章