在正式切入今天要谈的优化之前,先碎碎念一些自己过去这几年的经历。很久没有登录过博客园了,今天也是偶然兴起打开上来看一下,翻看了下自己的随笔,最后一篇原创文章发布时间是2015年的4月,今天是2017年的6月10号,真是离开了博客园有两年之久了。

2014年6月毕业后开始了北漂生活,在百度2年时间,主要从事百度Hi服务端的研发工作。在百度算是第一次对整个项目的开发有了相对完善的了解,同时也从一个新人逐步的成长,踩了一些坑,长了一些见识。2016年6月离开百度,回到成都,主要是考虑在成都安家,同时老婆也怀孕了,家里很快就要迎来两个小朋友。正好成都蚂蚁金服团队在招人,通过几次面试然后顺利的加入到了蚂蚁金服人工智能团队。

加入蚂蚁一晃过去了一年时间了,现在还记得入职当天就出差时我一脸懵逼的状态。到蚂蚁之后,最大的改变就是团队不再把我当做一个新人来培养,没有人来指导你改怎么样做,我收到的就是一个需求,至于这个需求怎么做,我可以随意发挥,当然前提是要做好。总结为一句话,就是以结果为导向,你可以做的很完美,也可以做的很low,但只要项目符合预期,并取得了该有的成效那你就没有失职。当然懵逼归懵逼,任务可不会等你的,根本就没有时间给我去适应,然后就开始卷入各种任务中。现在回想起来,入职那段时间我效率也是最高的,当然压力也大。

好了,闲话不多说,谈谈今天我要说的话题:pb传输优化浅谈。在最近蚂蚁的工作中,遇到一个性能优化的问题,两个系统之间通过pb形式传输数据,考虑到数据量比较大(单次请求包大约2M左右),原有的pb传输性能不符合业务预期。那么,该怎么优化来提升这个性能呢?

首先我们需要分析主要的耗时在那个环节?我们对该调用链路进行简单的梳理:
客户端将请求对象序列化为pb--网络IO--服务反序列化对象--业务计算--计算结果序列化--网络IO--客户端对响应反序列化

对整个流程中的分阶段耗时进行统计分析,发现目前主要的耗时在序列化的过程,也就是说目前的pb序列化性能不符合预期!怎么优化呢?序列化的过程是cpu密集型的,既然pb序列化无法满足,那我们就寻求性能更好的序列化方式,这里我们选择了flat buffer。

pb和fb各有裨益,在内存空间占用这个指标上,flat buffers占用的内存空间比protobuf多了两倍。序列化时二者的cpu计算时间fb比pb快,当然反序列化时二者的cpu计算时间fb比pb也要快。即fb在计算时间上占优势,而pb则在内存空间上占优。

看似问题解决了,然而未必!序列化、反序列化的性能提升了,传输的数据包变大了。那就继续优化呗,包大了怎么破?压缩~

压缩方法比较多,GZIP、LZO、Zippy/Snappy压缩等方法众多,我们需要选择适合我们的那一款。这几款压缩也是hbase中应用的几种压缩方式。我们对其特点做一个分析,其中:
1)GZIP的压缩率最高,但是其实CPU密集型的,对CPU的消耗比其他算法要多,压缩和解压速度也慢;
2)LZO的压缩率居中,比GZIP要低一些,但是压缩和解压速度明显要比GZIP快很多,其中解压速度快的更多;
3)Zippy/Snappy的压缩率最低,而压缩和解压速度要稍微比LZO要快一些。

BigTable中采用的是Zippy算法,目标是达到尽可能快的压缩和解压速度,同时减少对CPU的消耗。我们目前的需求和这个也是类似的,所以我们通过实现最终选定了使用snappy压缩方式。

好了,今天的浅谈内容结束,期待后续自己能够多有一些出来,有关项目中遇到的一些点和大家分享,也期望能够帮到大家,谢谢!

pb传输优化浅谈的更多相关文章

  1. MYSQL优化浅谈,工具及优化点介绍,mysqldumpslow,pt-query-digest,explain等

    MYSQL优化浅谈 msyql是开发常用的关系型数据库,快速.稳定.开源等优点就不说了. 个人认为,项目上线,标志着一个项目真正的开始.从运维,到反馈,到再分析,再版本迭代,再优化… 这是一个漫长且考 ...

  2. App性能优化浅谈

    前言 前段时间给公司的小伙伴们进行了关于app性能优化的技术分享.这里我稍微整理一下也给大家分享一下.关于性能优化这个话题非常大,涉及面能够非常广,也能够非常深入.本人能力有限,不会给大家讲特别难懂, ...

  3. web server性能优化浅谈

    作者:ZhiYan,Jack47 转载请保留作者和原文出处 Update: 2018.8.8 在无锁小节增加了一些内容 性能优化,优化的东西一定得在主路径上,结合测量的结果去优化.不然即使性能再好,逻 ...

  4. dom渲染方面的优化浅谈

    今天分享一个面试经验,上周面试中一位印象很深的面试官(主要长得很帅),问我了一个我至今印象很深刻的问题,当然不是什么你之后的职业规划啊,你工作中遇到过哪些问题啊之类的.原起于一道面试题,小伙伴们可以想 ...

  5. mysql配置优化浅谈(一)

    MySQL对于web架构性能的影响最大,也是关键的核心部分.MySQL的设置是否合理优化,直接影响到web的速度和承载量!同时,MySQL也是优化难度最大的一个部分,不但需要理解一些MySQL专业知识 ...

  6. Mysql 性能优化7【重要】sql语句的优化 浅谈MySQL中优化sql语句查询常用的30种方法(转)

    原文链接   http://www.jb51.net/article/39221.htm 这篇文章大家都在转载,估计写的有条理吧,本人稍微做一下补充 1.对查询进行优化,应尽量避免全表扫描,首先应考虑 ...

  7. sql性能优化浅谈

    sql性能优化总结: 最近随着数据越来越多,数据库性能问题暴露的越来越严重.几百万,上千万,甚至过亿的数据处理速度会非常的慢. 下面对工作中遇到的问题做下总结,希望以后能对日后的工作有所帮助. 不同的 ...

  8. 转:浅谈CSS在前端优化中一些值得注意的关键点

    前端优化工作中要考虑的元素多种多样,而合理地使用CSS脚本可以在很大程度上优化页面的加载性能,以下我们就来浅谈CSS在前端优化中一些值得注意的关键点: 当谈到Web的“高性能”时,很多人想到的是页面加 ...

  9. Android性能优化的浅谈

    一.概要: 本文主要以Android的渲染机制.UI优化.多线程的处理.缓存处理.电量优化以及代码规范等几方面来简述Android的性能优化 二.渲染机制的优化: 大多数用户感知到的卡顿等性能问题的最 ...

随机推荐

  1. App内切换语言

    前几天客户提需求,对App增加一个功能,这个功能目前市面上已经很常见,那就是应用内切换语言.啥意思,就是 英.中.法.德.日...语言随意切换. (本案例采用Data-Bingding模式,麻麻再也不 ...

  2. react基于nodejs简单的搭建与开发方法

    只需安装babel命令,即可将react的jsx写法转换成浏览器认识的js写法 1.安装nodejs(百度下载安装即可,自带npm) 2.cmd打开命令行,cd进入在自己的文件夹下 执行命令: npm ...

  3. 为RecyclerView的item之间设置相同的间距

    项目中经常碰到列表当中的每一项之间需要设置间距的问题,我们可以通过给列表中的每一项设置margin值来实现,例如纵向的间距可以给每一项设置right_margin,这种方法下,整个列表的最左边会紧贴屏 ...

  4. java入门基础

    什么是java? java是一门编程语言  编程语言有很多种 你比如 C语言 等等 为什么学习java呢! 因为你要和计算机交互  当然了你用汉语跟她说她听不懂 所以你要学习编程语言 那么额咱们的ja ...

  5. java jdk中安装证书的步骤

    需要注意的是:导入证书时,请确认导入的JDK为当前程序运行所用的JDK,且路径是jdk目录下的jre目录路径,非与jdk同级的jre目录 首先你可以把需要导入的证书放在keytool的同级目录下,然后 ...

  6. [刷题]算法竞赛入门经典(第2版) 4-4/UVa253 - Cube painting

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) #include<iostream> char str[15]; v ...

  7. java内存模型7-处理器内存模型

    处理器内存模型 顺序一致性内存模型是一个理论参考模型,JMM和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照.JMM和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照顺序 ...

  8. Natas Wargame Level20 Writeup(会话状态注入/篡改)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAArMAAACmCAYAAADJYwcaAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF

  9. Day5模块-time和datetime模块

    模块是封装一段代码来实现某种功能. 分为三类: 1.自定义模块 2.标准库,内置模块 3.开源模块 -------------------------------------------------- ...

  10. JSON的使用小结

    JSON中存储的是key:value,其实在编程的时候我们会遇到很多都是key:value的形式.比如:map,java对象(一个对象的一个属性只会有一个值),数据库中key:value对应着里面存储 ...