IPFS系列04-IPFS 存储性能测试

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

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

1. 本地测试

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

配置一

  • 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

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

[图片上传失败...(image-f34611-1653261369198)]

2. 局域网测试

机器配置

  • 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

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

[图片上传失败...(image-1d6648-1653261369198)]

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

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

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

4. 与七牛云对比测试

上面我们测试了 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),所以这个下载速度不具备可比性。

5. 总结

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

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

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容