三次性能优化经历

标签: System Design & Architecture Portal Service Spark 性能优化 | 发表时间:2016-02-16 14:22 | 作者:四火
出处:http://www.raychase.net

三次性能优化经历

最近在做一些性能优化工作,回想起工作这些年来,参与过的三次集中性能优化,每次都得折腾少则一个月,多则半年。这些内容既是不同视角、不同思路的比较,也是挺有趣的工作经历。

Portal的性能优化

这已经是大概五年前了,搞了接近半年的Portal性能优化,后来某些内容总结在 这篇文章里面。既然是Portal,性能优化上就有它的特点。比如说:

Portal的性能优化需要从前端和后端两个角度去思考问题,先考虑客户端和服务端之间的交互模型,然后再在客户端和服务端单独考虑分而治之。这个其实和设计的思路是一样的,交互问题需要首先考虑,定义好交互的报文形式(比如某JSON的具体形式)以后,包括用户触发什么行为引发什么样的数据访问,这些需要首先明确,这样才能对大概的请求模型了然于心。最怕的是那些请求乱七八糟的Portal要做优化,因为业务复杂,然后接口还没有统一,有的地方返回页面片段,有的地方返回一个大页面,有的地方返回一堆脚本,有的地方用JSONP,有的地方有返回纯数据格式。互相之间还有许多重复,这种乱七八糟的客户端和服务端之间的交互,简直就没有设计,不同人开发就不同样,做起优化来简直就是噩梦。

在思考view这一层的时候,首先要给它分区,如果是简单的页面,就要给它分类、分块。目的只有一个,抽象出动态变化的部分和静态渲染的部分。有的前端本身解耦做得比较好的,数据和模板已经拆分得很清楚的话,模板是静态的,数据就要分析,哪些是动态的,哪些是相对静态的,可容许的不一致时间有多长。动态静态的划分主要是为了view层面的缓存。对于Portal来说,缓存是非常讨巧的,页面组件划分做得好的,性能优化才有余地。

前端的性能优化大家都会记得这流传甚广的 几十条“rules”,而后端就没有这样的统一原则可以拿来指导了。前面讲了缓存,但是缓存的引入也会引发一系列的问题。最常见的是关于数据过期造成的不一致性问题,但是其实还有一些其他的问题。比如说,如果某些原因导致缓存全部失效(例如掉电、服务重启),这个时候压力一下子全部落到后端部件上去了(比如数据库上),那么实际的性能测试要保证这种情况下依然可以保证正常服务的提供,流控正常,网站不要挂掉。

Service的性能优化

后来工作需要维护过一个几十台机器集群的service,接受get请求,从数据库里面查数据以某种xml形式返回给用户。这种请求处理的并发数、TPS和latency都非常关键,给数据库压力很大,而相对地,计算逻辑就比较简单。

当时想了几种优化的办法。

第一种是中心化的缓存,使用Memcached,主要是考虑总的请求重复率可能在50%左右,但是如果在单台机器上做缓存,这个cache hit比率是非常低的,但是使用一台中心缓存服务器可以提高缓存命中率。但是另一方面,如果一旦引入中心缓存,又会带来很多新问题,比如这样的缓存读写开销就不能忽略了,对于缓存没有命中的case,性能反而是下降的;比如一旦这个中心缓存服务器挂掉怎么办,一定要设置非常短的cache访问超时机制;还有,写缓存的操作,完全做成NoReply形式的,像发送UDP报文一样,只管请求,不管结果,从而尽量保证总的latency。我把Memcached调优的一些总结 放在了这里

第二种思路是把计算部分放到客户端去,让service变得很薄,以期望减小CPU的使用。不过这一点上效果也一般,主要是因为瓶颈毕竟主要还是在数据库查询上面。基于这一点,后来还出现了一种思路,就是异步算好这些用户可能需要的结果,等到需要的时候直接来取就好。

最后,为了减小对关系数据库的压力,增加扩展性,把数据源挪到了DynamoDB这个NoSQL数据库上面。

Spark的性能优化

近期则是做了一些Spark性能优化的工作。其实性能优化的核心问题是不变的,考虑的最主要的几个因素也是不变的,无非CPU、内存、网络、锁(本质是并行度)等等。

系统地分析和改进Spark性能问题的时候,大概有这么几个几件事:

测试常规数据集在不同不同instance type,不同memory、不同executor number下面的性能表现,开始是单个EMR任务,后来则是整个pipeline,评估性能条件下选择的理想性价比环境。比如R3.8的内存是要比C3.8多好几倍,但是价格是1.5倍,这个时候则需要评估如果合理设置executor number,再看性能能达到什么程度,比如如果整个pipeline的计算时间能够缩短好几倍,那么R3.8也是不错的选择。当然,还有一种思路是OOM的风险(因此通常不会配置一大堆executor,把CPU使用率榨取到穷尽),而OOM在测试中不是必现的,因此不能光看pipeline的时间。另外,在评估执行状态的时候,指标不要单独地看。比如有时看到CPU使用率上去了,这其实不一定是计算资源利用率提高的表现,还有可能是内存太小,大量本来安安稳稳在内存里面就可以算完的东西被迫溢出到磁盘上,读写一增加CPU使用率自然就上去了。

第二个是需要结合代码和测试的结果去修正代码具体代码写得不好的地方。例如对于partition的取值,default.parallelism的计算公式,有一些api不合理的使用,还有明明可以并行化的地方,却没有做到等等。这里面有一些调优的hints我放在了 这篇文章里面。总的来说,在最基本的问题修正以后,可以分析整个pipeline里面最慢的几个task,做单独和额外的优化。

第三个则是需要测试异常大的数据量,主要是遇到一些特殊的情形,例如Q4(第四季度)业务量暴涨的时候,这种情形要在测试中覆盖到。现在刚升级到Spark 1.5的版本,Spark 1.6我还没有开始使用,但是我知道它是支持动态的executor数量的自动调整(dynamicAllocation.enabled)的,否则给task设置的executor数量还是需要根据input的大小代码里面计算调整的。

这些内容我的初衷是想写一些作为系统的或者补充的内容,从而和以前写的与这三次性能调优单独记录的文章想区别,但是目前思路还理得不很清楚。以后随着思考的深入再慢慢修正。

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《四火的唠叨》

分享到:

相关 [性能优化 经历] 推荐:

三次性能优化经历

- - 四火的唠叨
最近在做一些性能优化工作,回想起工作这些年来,参与过的三次集中性能优化,每次都得折腾少则一个月,多则半年. 这些内容既是不同视角、不同思路的比较,也是挺有趣的工作经历. 这已经是大概五年前了,搞了接近半年的Portal性能优化,后来某些内容总结在 这篇文章里面. 既然是Portal,性能优化上就有它的特点.

MySQL性能优化

- sun - IT程序员面试网
在笔试面试中,尤其是像百度,淘宝这些数据量非常大,而且用LAMP架构的公司,数据库优化方面就显得特别重要了. 此外,除了数据库索引之外,在LAMP结果如此流行的今天,数据库(尤其是MySQL)性能优化也是海量数据处理的一个热点. 下面就结合自己的经验,聊一聊MySQL数据库优化的几个方面. 首先,在数据库设计的时候,要能够充分的利用索引带来的性能提升,至于如何建立索引,建立什么样的索引,在哪些字段上建立索引,上面已经讲的很清楚了,这里不在赘述.

Hebernate 性能优化

- - 企业架构 - ITeye博客
文章分为十三个小块儿对Hibernate性能优化技巧进行总结性分析,分析如下:. 一、在处理大数据量时,会有大量的数据缓冲保存在Session的一级缓存中,这缓存大太时会严重显示性能,所以在使用Hibernate处理大数 据量的,可以使用session. clear()或者session. evict(Object) 在处理过程中,清除全部的缓存或者清除某个对象.

Hbase 性能优化

- - CSDN博客云计算推荐文章
因 官方Book Performance Tuning部分章节没有按配置项进行索引,不能达到快速查阅的效果. 所以我以配置项驱动,重新整理了原文,并补充一些自己的理解,如有错误,欢迎指正. 默认值:3分钟(180000ms). 说明:RegionServer与Zookeeper间的连接超时时间.

JavaScript性能优化

- - ITeye博客
互联网泡沫让投资者长了记性:态度更加谨慎.         如今主流浏览器都在比拼JavaScript引擎的执行速度,但最终都会达到一个理论极限,即无限接近编译后程序执行速度. 这种情况下决定程序速度的另一个重要因素就是代码本身. 在这里我们会分门别类的介绍JavaScript性能优化的技巧,并提供相应的测试用例,供大家在自己使用的浏览器上验证, 同时会对特定的JavaScript背景知识做一定的介绍.

Mysql性能优化

- - 数据库 - ITeye博客
MySQL性能优化.   性能优化是通过某些有效的方法来提高MySQL的运行速度,减少占用的磁盘空间. 性能优化包含很多方面,例如优化查询速度,优化更新速度和优化MySQL服务器等.   数据库管理人员可以使用SHOW STATUS语句来查询MySQL数据库的性能. 语法:SHOW STATUE LIKE ‘value’;其中value参数是常用的几个统计参数.

Linux 性能优化

- - Gsion's Blog
1) Linux Proc文件系统,通过对Proc文件系统进行调整,达到性能优化的目的. 2) Linux性能诊断工具,介绍如何使用Linux自带的诊断工具进行性能诊断. 加粗斜体表示可以直接运行的命令. 二、/proc/sys/kernel/优化. 该文件有一个二进制值,该值控制系统在接收到ctrl+alt+delete按键组合时如何反应.

hbase性能优化

- - CSDN博客推荐文章
  当你调用create方法时将会加载两个配置文件:hbase-default.xml and hbase-site.xml,利用的是当前的java类路径, 代码中configuration设置的这些配置将会覆盖hbase-default.xml和hbase-site.xml中相同的配置,如果两个配置文件都存在并且都设置好了相应参上面的属性下面的属性即可.

oracle性能优化

- - 行业应用 - ITeye博客
                              oracle数据库的性能优化. 主要从内部存储结构,逻辑分区,表结构范式,sql语句优化. hibernate处的层次更高,主要从缓存,和sql语句的使用.     对于ORACLE数据库的数据存取,主要有四个不同的调整级别,第一级调整是操作系统级包括硬件平台,第二级调整是ORACLE RDBMS级的调整,第三级是数据库设计级的调整,最后一个调整级是SQL级.

mssql性能优化

- - 数据库 - ITeye博客
一、             分析阶段. 一般来说,在系统分析阶段往往有太多需要关注的地方,系统各种功能性、可用性、可靠性、安全性需求往往吸引了我们大部分的注意力,但是,我们必须注意,性能是很重要的非功能性需求,必须根据系统的特点确定其实时性需求、响应时间的需求、硬件的配置等. 另一方面,在分析阶段应该根据各种需求区分出系统的类型,大的方面,区分是OLTP(联机事务处理系统)和OLAP(联机分析处理系统).