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

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

1. 本地测试

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

配置一

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

测试结果

网络环境文件大小写入时间(ms)读取时间(ms)写入速度(MB/s)读取速度(MB/s)
本地1G103584.9841718.929.9724.25
本地500M45045.547469.1611.1166.66
本地100M8981.921162.4311.2286.20
本地50M4022.22577.3912.4386.65
本地10M1775.41252.605.6439.68
本地5M1165.52186.504.5427.77
本地1M530.57151.18721.886.66

配置二

  • CPU: i7-8700K CPU @ 3.70GHz
  • 内存: 16GB
  • 硬盘: 希捷企业硬盘 8TB
  • 操作系统:Ubuntu 18.04-LTS
网络环境文件大小写入时间(ms)读取时间(ms)写入速度(MB/s)读取速度(MB/s)
本地1G37819.672237.927.08459.19
本地500M16841.981085.0829.76462.96
本地100M3006.19266.6832.67384.61
本地50M2496.54143.8120.08357.14
本地10M1156.5347.928.69212.76
本地5M583.7852.288.6258.13
本地1M204.6837.77527.02

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

# i5 CPUWrite:1G: 97389.72878, 100163.63883, 102394.04202, 121107.44262, 96870.09001500M 46019.42205, 43743.31760, 45353.94692, 45235.54754, 44875.50592100M 8350.12960, 8919.12270, 8405.61080, 9136.59215, 10098.1762450M 3909.33299, 3994.80295, 4111.20057, 4065.45925, 4030.3127810M 1789.08062, 1746.42110, 1776.58439, 1807.98721, 1756.999025M 1187.28948, 1139.60743, 1186.48696, 1171.19718, 1143.036371M 544.82102, 512.79807, 485.28814, 553.72643, 556.23889Read:1G: 39059.96132, 42852.09465, 40929.29006, 41882.52759, 43870.74089500M 7555.64952, 8230.87454, 7912.68301, 6132.61437, 7514.02307100M 858.94799, 1568.71152, 1702.42906, 873.50821, 808.5911350M 447.64829, 781.59356, 776.32689, 451.41816, 430.0017410M 203.68147, 295.31884, 368.38579, 200.71745, 194.914345M 165.23266, 217.01288, 220.20507, 170.92180, 159.160851M 167.58633, 167.72866, 166.81981, 119.10820, 134.69315

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

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

#!/bin/bashtimer() {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[@]}doecho -e "\033[35m\033[1m+++++++++++++++ Test for file $file +++++++++++++++\033[0m"# put filest1=$(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 filest1=$(timer)ipfs get $filenamet2=$(timer)cost=`awk 'BEGIN{printf "%.5f\n",(('$t2'-'$t1')*1000)}'`echo -e "\033[32m\033[1mGet file successfully,cost: $cost msecs.\033[0m"doneend=$(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 ~/.ipfsipfs initipfs daemon

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

2. 局域网测试

机器配置

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

测试结果

网络环境文件大小写入时间(ms)读取时间(ms)写入速度(MB/s)读取速度(MB/s)
局域网1G41630.69640.524.59106.22
局域网500M19016.44677.826.29107.06
局域网100M3365.61016.829.7694.33
局域网50M2073.648924.15102.24
局域网10M854.212311.7683.33
局域网5M39672.812.8269.44
局域网1M136.634.87.3529.41

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

Write:1G 40780, 41130, 41226, 43040, 41977500MB 18280, 19613, 18984, 18799, 19406100MB 3207, 3518, 3129, 3551, 342350MB 1862, 1989, 2072, 2182, 226310MB 864, 860, 759, 895, 8935MB 404, 392, 414, 369, 4011MB 119, 171, 110, 176, 107Read:1G 9675, 9755, 9590, 9542,9557500MB 4674, 4670, 4667, 4677, 4701100MB 1018, 1018, 1019, 1012, 101750MB 481, 503, 488, 491, 48210MB 122, 126, 126, 122, 1195MB 73, 71, 72, 74, 741MB 36, 33, 35, 36, 34

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

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

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

3. 公网测试

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

机器配置

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

公网测试结果

网络环境文件大小上传时间(s)上传速度(MB/s)
gamma云1G263.593.88
gamma云500M125.953.96
gamma云100M25.343.94
gamma云50M10.554.73
gamma云10M0.9510.52
gamma云5M0.2619.23
gamma云1M0.119.09

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

文件大小12345
1G268.32261.71266.63262.56258.74
500MB129.14125.61125.68123.97125.38
100MB24.1824.5424.6828.7024.60
50MB11.1110.2910.5610.3110.49
10MB0.950.950.980.940.94
5MB0.27 0.230.260.280.26
1MB0.110.140.110.120.10

4. 与七牛云对比测试

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

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

七牛云测试结果

网络环境文件大小上传时间(s)上传速度(MB/s)
七牛云1G264.083.87
七牛云500M129.433.87
七牛云100M25.653.89
七牛云50M10.714.66
七牛云10M1.556.45
七牛云5M0.885.68
七牛云1M0.254.00

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

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

文件大小12345
1G262.94262.45268.50261.31265.21
500MB148.29124.73123.31122.87127.99
100MB25.1225.6026.7125.4125.44
50MB10.6510.7610.5710.5611.05
10MB1.641.631.641.471.40
5MB0.830.890.830.871.00
1MB0.250.240.260.260.26

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

5. 总结

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

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

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

本文首发于小一辈无产阶级码农