本文来自网易云社区

作者:孙建良

最近团队在对存储系统做一些性能测试,期间遇到了不少问题,测试过程中得出的结果也没有很好的数据支撑,所以尝试了非常多的方法来对性能问题进行定位。

小王童鞋是挺厉害的,使用了非常多的工具进行性能问题定位,包括iosnoop对IO请求进行跟踪、iostat进行磁盘状态记录、go-pprof从runtime层面收集性能profile数据、使用go-torch对profile生成直观的火焰图、使用trace2heatmap对延迟数据生产热力图 等等。

纵然是花了很多时间和精力去测试分析,但是诸多变量的系统中从外部整体去测试其实很难发现真正原因,走了一些弯路。

所以最后小伙伴通过一定手段对系统中的一些不确定性的环节进行简化确定,真相才慢慢浮出水面。

以下整理分享。

性能说明

存储系统中采用多副本技术保障数据可靠性,leader并发将数据发送到follower(三副本),所有candidate(leader & follower)完成磁盘写入之后,由leader回复client写入成功。

如下为两个测试数据说明图,第一张图为从客户端收集到的端到端的写入响应时间分布,第二张图为从一个副本上测试得到的fdatasync刷磁盘的响应时间分布。

从两测试图可以看出:

  • 写入的整体性能趋势基本是跟磁盘fdatasync的分布呈现相同的分布和趋势。

  • 客户端Put的平均响应时间是fdatasync的2倍左右

疑问:leader接收到client写发送过来的数据是并发发送到follower,在低压力情况下,理论上网络上的开销相比磁盘的fdatasync开销基本可以忽略不计,是什么原因导致三副本写入结果达到了fdatasync的两倍左右?

后来我们对fdatasync做了mock,响应时间就设置为固定50ms,测试结果发现三副本写入结果基本就是50ms左右。非常符合预期的结果,结果说明了相比于fdatasync程序本身造成的开销基本可以忽略不计,那么真实情况下问题出在哪里?

zipf分布

从单节点fdatasync的响应时间分布看,是一个典型的zipf分布,大部分请求响应时间较小,而小部分请求响应时间特别大。

所以使用程序拟合了类似的分布,并且通过模拟的方式验证得到如下结果

  • 从单纯三副本fdatasync来说,并发写三副本的平均响应值差不多为单次fdatasync的2倍左右,因为响应时间总是大于为3副本中fdatasync最慢的那个节点。

  • 多数派协议中,比如三副本的系统中,并发写入F/2 +1 = 2 个副本成功情况下的响应时间比单次fdatasync的平均响应时间好要小,即3次中选最快的两次fdatasync比单次的平均结果还要好。

拟合程序

    package main    import (        "fmt"
        "math/rand"
        "sort"
        "time"
    )     func main() {        r := rand.New(rand.NewSource(int64(time.Now().Second())))        zipf := rand.NewZipf(r, 2.7, 25, 300)        data := make([]int, 0)        N := 20
        for i := 0; i != N; i++ {            item  :=  int(zipf.Uint64() + 30)
            data = append(data, item)
        }
        sort.Ints(data)
        fmt.Printf("%+v", data)
    }

程序拟合出的曲线如下:

乳腺癌三副本提交和两副本quorum情况下的平均提交时间及分布曲线。(PS:实线为总体平均值与百分比分布无关,图例为展示方面,放在一块儿)

相关拟合程序详见: zipf.gozipf.py

结论

  • qourom 协议不仅仅是副本一致性上的一大解决思路,在提高系统响应时间上也是颇有益处。

  • zipf 分布是在很多场景中存在的问题,在对响应时间敏感的系统里头,比如实时游戏信令、股票交易等等系统中,多发几次请求,取其中最快返回的,简单而有效

  • 看似奇怪的问题后面有可能隐藏着不为人知的更深层次的原因,执着的专研分析,翻过山越过岭,总有惊喜等着你。

网易云免费体验馆0成本体验20+款云产品!

更多网易研发、产品、运营经验分享请访问网易云社区

相关文章:
【推荐】 知物由学 | 如何应对日益强大的零日攻击

NOS直传加速服务的更多相关文章

  1. 国内网站常用的一些 CDN 公共库加速服务

    CDN公共库是指将常用的JS库存放在CDN节点,以方便广大开发者直接调用.与将JS库存放在服务器单机上相比,CDN公共库更加稳定.高速.一 般的CDN公共库都会包含全球所有最流行的开源JavaScri ...

  2. 2014年十个优秀的免费CDN加速服务-国内和国外免费CDN

    这是一篇总结近几年来网络上出现了各类免费CDN服务的文章,文章本来应该早就发出来的,但是因为近期的各种原因一直拖到现在.之前部落已经总结了近几年来的优秀免费空间,新手朋友不必在茫茫“网”海中寻找免费空 ...

  3. 盘点国内网站常用的一些 CDN 公共库加速服务

    CDN公共库是指将常用的JS库存放在CDN节点,以方便广大开发者直接调用.与将JS库存放在服务器单机上相比,CDN公共库更加稳定.高速.一 般的CDN公共库都会包含全球所有最流行的开源JavaScri ...

  4. 在OneThink(ThinkPHP3.2.3)中整合阿里云OSS的PHP-SDK2.0.4,实现Web端直传,服务端签名直传并设置上传回调的实现流程

    在OneThink(ThinkPHP3.2.3)中整合阿里云OSS的PHP-SDK2.0.4,实现本地文件上传流程 by shuijingwan · 2016/01/13 1.SDK安装 github ...

  5. 新版Azure CDN HTTPS加速服务正式上线

    随着网络安全问题日益得到全民重视,HTTPS网络访问协议在互联网访问中得到了广泛的使用.Azure CDN也早在一年前的2015年4月上线了HTTPS加速服务.该加速服务上线一年以来,用户使用量逐渐增 ...

  6. 华为云提供针对Nuget包管理器的缓存加速服务

    在Visual Studio 2013.2015.2017中,使用的是Nuget包管理器对第三方组件进行管理升级的.而且 Nuget 是我们使用.NET Core的一项基础设施,.NET的软件包管理器 ...

  7. 前端 CDNJS 库及 Google Fonts、Ajax 和 Gravatar 国内加速服务

    由于某些众所周知的原因,好多开源的 JS 库采用的国外 CDN 托管方式在国内访问速度不如人意.所以我们特意制作了这个公益项目,托管了 CDNJS 的所有开源 JS 库以及反代了 Google Fon ...

  8. 国内站点经常使用的一些 CDN 静态资源公共库加速服务

    web开发人员们的福利来了..旨在为大家提供更快很多其它更好的静态资源库的CDN载入库方案! CDN公共库是指将经常使用的JS库存放在CDN节点,以方便广大开发人员直接调用. 与将JS库存放在serv ...

  9. 加载CDN加速服务地址

    Jquery是个非常流行的JS前端框架,在很多网站都能看到它的身影.很多网站都喜欢采用一些Jquery CDN加速服务,这样网站加载jquery会更快.之前火端网络的一些网站都是使用Google的jq ...

随机推荐

  1. Weblogic 10.3.6.0 集群搭建

    Weblogic 集群搭建 Oracle的Weblogic分开发者版本和生产版本,有32位和64位.一般生产版本的weblogic是64位的,安装文件是一个大小为1G多的jar包.去oracle官网上 ...

  2. jQuery_2_常规选择器-进阶选择器

    进阶选择器: 1. 群组选择器     $("span,em,#box")   获取多个选择器的DOM对象 <div id="d1">div< ...

  3. HDU 2191 悼念汶川地震(多重背包)

    思路: 多重背包转成01背包,怎么转?把一种大米看成一堆单个的物品,每件物品要么装入,要么不装.复杂度比01背包要大.时间复杂度为O(vns)(这里S是所有物品的数量s之和).这个做法太粗糙了,但就是 ...

  4. 关于调用百度地图api在自己写的网页中实现和解决在https中正常显示

    百度地图开发者:http://lbsyun.baidu.com/index.php?title=jspopular 我们打开百度地图开发者网站,注册一个百度账号,然后打开控制台,开始创建应用:(如果你 ...

  5. PC:各大主板开机启动项快捷键

    组装机主板 品牌笔记本 品牌台式机 主板品牌 启动按键 笔记本品牌 启动按键 台式机品牌 启动按键 华硕主板 F8 联想笔记本 F12 联想台式机 F12 技嘉主板 F12 宏基笔记本 F12 惠普台 ...

  6. hdu-1179 Ollivanders: Makers of Fine Wands since 382 BC.---二分图匹配模板

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1179 题目大意: 有n个人要去买魔杖,有m根魔杖(和哈利波特去买魔杖的时候一样,是由魔杖选人).接下 ...

  7. 安装git 配置邮箱和用户名

    git 查看用户名和邮箱地址 $ git config user.email $ git config user.name 运行命令来配置你的用户名和邮箱 $ git config --global ...

  8. empty、isset、is

    直接上代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <?php $a=0; $b='0'; $c=0.0; ...

  9. Problem J: 搜索基础之红与黑

    Problem J: 搜索基础之红与黑 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 170  Solved: 100[Submit][Status][ ...

  10. C# StreamReader对象

    1.读取文件 输入流用于从外部源读取数据,在很多情况下,数据源可以是磁盘上的文件或网络的某些位置,任何可能发送数据的位置都可以是数据源,比如网络应用程序,web服务,甚至是控制台.StreamRead ...