在正式切入今天要谈的优化之前,先碎碎念一些自己过去这几年的经历。很久没有登录过博客园了,今天也是偶然兴起打开上来看一下,翻看了下自己的随笔,最后一篇原创文章发布时间是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. Eclipse实现图形化界面插件-vs4e

    vs4e插件下载地址:http://visualswing4eclipse.googlecode.com/files/vs4e_0.9.12.I20090527-2200.zip 下载完成后,解压,然 ...

  2. 【转载】stm32的GPIO八种工作模式

    一.推挽输出:可以输出高.低电平,连接数字器件:推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止.高低电平由IC的电源决定.         推挽电路是两个参数 ...

  3. UE4 Fade out Mesh

    由于项目需要一个将场景慢慢淡入以及淡出的效果,所以就想了想实现思路.因为PBR光照模型是不支持透明物体的渲染的,所以UE4中的PBR材质在为Opaque时是无法改变透明度的,想来想去想不出解决方法,然 ...

  4. Linux 3.2中回写机制的变革

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://alanwu.blog.51cto.com/3652632/1109952 wri ...

  5. FrameBuffer系列 之 简单编程

    一.Linux的帧缓冲设备 帧缓冲(framebuffer)是 Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作.这种操作是抽象的 ...

  6. iOS APP打包分发给远程的手机测试

    APP要打包给远程的朋友或客户测试,但又不是企业账号的情况下,我们只能根据手机的udid进行描述证书的配置,再打包分发给提供了udid的手机进行安装 一.如何得到udid? 手机连接到mac电脑,打开 ...

  7. sublime text3在指定浏览器上本地服务器(localhost)运行文件(php)

    昨天在使用sublime text3时,发现能在本地服务器上运行php文件,于是百度了一下有关知识, 终于成功了,今天总结一下. 首先要让sublime text3 出现侧边栏sidebar,不会的可 ...

  8. Java IO最详解

    初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见 ...

  9. nginx 高可用

    1 nginx负载均衡高可用 1.1 什么是负载均衡高可用 nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务, ...

  10. 使用Dotfuscator加密混淆程序以及如何脱壳反编译

    混淆演示 首先介绍如何使用Dotfuscator对.net程序加密码混淆/加壳 C#或vb.net编写的应用程序或DLL. 这里随便创建了一个C#的命令行控制台程序.程序很简单,对当前的时间进行了AE ...