本文来自网易云社区

作者:孙建良

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

小王童鞋是挺厉害的,使用了非常多的工具进行性能问题定位,包括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. OSS基本概念介绍

    存储空间(Bucket): 存储空间是用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间. 可以设置和修改存储空间属性用来控制地域.访问权限.生命周期等,这些属性设置直接作用于该存 ...

  2. DB2数据库常用语句

    1.快速清空大量数据表数据,但是还原不了 alter table rm_customer activate not logged initially with empty table2.大量导出表语句 ...

  3. 美国L-1A签证简介

    一. L-1A签证是美国非移民签证种类之一,主要发给外国跨国公司在美所设公司的高层管理人员.申请程序是先经美国移民局批准,美驻外使领馆凭移民局的批准函(I-797表)核发签证.移民局的批准函并不意味着 ...

  4. maven+jenkins发布环境

    安装java省略,下面是环境变量 export JAVA_HOME=/usr/java/jdk1.8.0_65/ export PATH=$JAVA_HOME/bin:$PATH export CLA ...

  5. LeetCode OJ 3Sum 3个整数之和

    题意:给一个vector<int>容器,要求每当找到3个元素之和为0时就将这3个数按大小顺序记下来,用一个二维vector返回.也就是vector< vector<int> ...

  6. POI对EXCEL的操作【重点:如何设置CELL格式为文本格式】

    实际开发过程中通常用到的就是从数据库导出EXCEL表格了,JXL可以这样做,其实POI也可以(关于JXL与POI的异同可访问我之前总结的文章),之前写过POI对七种文档(当然也包括EXCEL)的内容读 ...

  7. vuejs计算属性和侦听器

    <div id='root'> 姓:<input v-model='firstName'/> 名:<input v-model='secondName'/> < ...

  8. 2018.2.6 JS-判断用户浏览器

    JS-判断用户浏览器 在判断用户使用的浏览器是否为PC还是移动设备,有时候项目中需要用到.可在需要的项目中当全局方法来使用. 判断代码 function getMoblieDevice(window) ...

  9. python_57_高阶函数

    变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数. def add(a,b,f): return f(a)+f(b) res=add(-3,- ...

  10. 漫谈Ajax在.Net中的使用

    引用地址:http://birdshover.cnblogs.com/archive/2006/07/03/441439.html AJAX出来的时间也不短了.虽然它在某些方面很受争议,但是瑕不掩瑜. ...