本文来自网易云社区

作者:孙建良

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

小王童鞋是挺厉害的,使用了非常多的工具进行性能问题定位,包括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. maven 配置Hibernate

    1.首先在maven中添加jar包依赖 <dependency> <groupId>org.hibernate</groupId> <artifactId&g ...

  2. 第2章 TCP-IP的工作方式

    第2章 TCP-IP的工作方式 TCP/IP协议系统 为了实现TCP的功能,TCP/IP的创建者使用了模块化的设计.TCP/IP协议系统被分为不同的组件,每个组件分别负责通信过程的一个步骤.这种模块化 ...

  3. ECMAScript 原始值和引用值

    原始值和引用值 在ECMAScript中,变量可以存在两种类型的值,即原始值和引用值 原始值 存储

  4. Lua学习---函数定义

    1.函数定义的格式: Lua使用function定义函数,语法如下: function function_name (arc) --arc表示参数列表,函数的参数列表可以为空 --body end 上 ...

  5. zblog删除网站后台顶部菜单中的“官方网站”链接

    文件\zb_system\function\c_system_admin.php 注释或删除代码 $topmenus[] = MakeTopMenu("misc", $zbp-&g ...

  6. fancyBox高级进阶用法

    最近给客户做的一个项目中,客户要求弹窗的边界与页面某个区块边界平齐,但平齐之后,弹出的窗口就不是居中的情况了,研究之后,认为需要改写fancyBox的fancybox-wrap类中的top属性才能达到 ...

  7. C# sftp通过秘钥上传下载

    一.适用场景 我们平时习惯了使用ftp来上传下载文件,尤其是很多Linux环境下,我们一般都会通过第三方的SSH工具连接到Linux,但是当我们需要传输文件到Linux服务器当中,很多人习惯用ftp来 ...

  8. Linux让Apache支持中文URL图片/文件名

    需要用到iconv_hook和mod_encoding Apache(32位): 安装环境:CentOS 5.6 + Apache 2.2.15 (Apache2.4同样适用) 安装结果:安装后支持“ ...

  9. 小记:vue 及 react 的工程项目入口小结及 webpack 配置多页面应用参考

    一.前言 闲暇时间,看了下前端的基础知识,有幸参与了公司公众号项目前面的一个阶段,学习到了一些前端框架的相关知识 小结了一下 自己练习通过新建一个个文件组织起项目的过程中的一些理解 二.项目入口 vu ...

  10. [转]Cannot deserialize the current JSON array (e.g. [1,2,3]) into type

    string content =[{"id": 3636, "is_default": true, "name": "Unit&q ...