本文来自网易云社区

作者:孙建良

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

小王童鞋是挺厉害的,使用了非常多的工具进行性能问题定位,包括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. JS案例练习 — 给div添加样式选择功能

    附加效果图: CSS内容: <style> ; padding:0px} li{list-style:none} body{font:24px 'Microsoft YaHei'; col ...

  2. Wince 6.0获取设备的分辨率 自动设置窗体位置

    调用微软提供给wince的API  “coredll.dll” [DllImport("coredll.dll")] public static extern int GetSys ...

  3. 再回首win98

    因为一个软件只能运行在win98上,所以上个win98虚拟机. 下载的是经典的Win98.SE.iso 307M. 真是小巧呀,感慨现在的win8.1的3.69G,真是没法比. 原来是没有用过老古董的 ...

  4. HDU1075 字典树 + 字符串映射

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1075 ,字典树的字符串映射. 题意是给你每个火星文单词对应的英语,然后让你把一篇火星文文章给翻译成英语 ...

  5. OpenGL位图变形问题

    因为初次接触OpenGL,图形学也后悔当初在学校没有认真学,隐约记得教授当时讲过图像变形的问题,而且我的bitmap也是2的N次方:16*16的,在网络上找到的大多都是一句话:“视口的纵横比一般和视景 ...

  6. 操作系统(1)_操作系统结构_李善平ppt

    cpu和内存之间通过地址总线.数据总线.控制总线连接.外部总线连接外部设备.下图有问题,内存和外设没有直接连接.同一组总线,CPU和内存连接的时候硬盘就不能和内存连接,否则有冲突,core和core之 ...

  7. Oracle Analyze

    Analyze使用场景 之前很多次都说到,对表的索引等信息进行了增删改之后,需要对表进行analyze更新统计信息,才能使数据库做出最好的执行计划,没有注意到,即使是一张很小的空表,如果进行了字段的增 ...

  8. 避免修改Android.mk添加cpp文件路径

    手工输入项目需要编译的cpp文件到Android.mk里的缺点 1)繁琐,如果cpp文件很多,简直无法忍受 2)手工输入过程中容易出现错误 3)如果cpp文件更改名称,需要修改android.mk文件 ...

  9. linux网络编程之断点传输文件

    以下载链接"http://www.boa.org/boa-0.94.13.tar.gz"为例: 断点续传实验大概步骤: ===================== 1,使用geth ...

  10. MySQL基础 - 1 数据库基础

    一.数据库基础 1.什么是数据库 1.数据库(database)是保存有组织的数据的容器( 通常是一个文件或一组文件 ) 2.数据库是一个以某种有组织的方式存储的数据集合 注意:数据库软件应该称为DB ...