淘宝网前台应用性能优化实践
如果无法正常显示,请先停止浏览器的去广告插件。
1. 淘宝网前台应用性能优化实践
2. 自我介绍
• 丁宇,阿里花名叔同
• 4年行业软件和3年互联网应用
发
经验,对构建高性能、高可用、可
扩展的Web应用
•
趣浓厚
现为淘宝网技术部综合业务平台技
术专家,负责性能优化领域的工作
•
Weibo:淘宝叔同
3. 议程
1. 应用性能分析
2. 基础设施优化
3. 应用自身优化
4. 前端性能优化
4. 1. 应用性能分析
•
•
•
介绍前台应用
度量
键指标
查找应用瓶颈
5. 介绍前台应用
•
•
•
面向用户的Web应用
商品详情、店铺等
流量较大、机器较多
6. 前台应用特点
•
•
•
•
模板
染⻚页面
• 使用Velocity引擎
• ⻚页面较大(大于100KB)
外部调用较多
• 数据来自外部,不保存数据
• DB、HSF、 Tair、 Search、 TFS ...
磁盘读写较少
吐量相对低
7. 度量
•
•
吐量
• 线上环境压测获取
• HttpLoad、Nginx引流
响应时间、 ⻚页面大小
•
•
键指标
分析访问日志获取
每请求内存数
•
GC回收的内存数除以
吐量
8. 查找应用瓶颈
•
于瓶颈
•
•
瓶颈是系统中比较慢的部分,在瓶颈完成前,其他部分需要等待
2/8原则
•
20%的代码执行会消耗80%的资源
9. 查找应用瓶颈
•
CPU、IO、Memory
•
•
Thread、File、Socket、GC
一般性瓶颈
•
•
CPU计算
• 字符串查找、替换、拼接
• 编码、解码、压缩、解压
外部调用
•
IO
销、序列化、反序列化
10. 查找模块瓶颈
Other
Tair
5%
4%
Search
31%
Velocity
57%
Hesper
3%
时间消耗分析,使用TProfiler工具
Velocity
Hesper
Search
Tair
Other
11. 查找代码瓶颈
•
找出代码瓶颈
• 使用TProfiler工具
• VisualVM、JProfiler
方法信息
执行时间 执行次数
总时间
com/xxx/web/core/NewList:execute() 61 3102 190067
com/xxx/web/core/PerformScreenTemplate:performScreenModule() 18 4822 87822
com/xxx/biz/core/DefaultSearchAuctionManager:doMultiSearch() 43 708 30357
com/xxx/biz/core/DefaultSearchCatRedirectManager:doSearch() 4 1248 4552
12. 2. 基础设施优化
•
•
•
软件升级
JVM调优
模板引擎优化
13. 软件升级
•
•
•
•
•
Apache -> Tenginx
•
Linux
吐量提升10%+
Apache 2.2
JBoss 4 -> Tomcat 7
•
吐量提升10%-
mod_jk
JVM 1.6 23 -> 1.6 32
JVM
OS 32bit -> 64bit
•
加大Java Heap,
吐量提升70%
Web App
Kernel升级
•
内核升级参数调整,
JBoss 4.2
吐量提升40%
14. JVM调优
•
•
•
•
•
•
Minor GC暂停25ms,Major GC暂停500ms
少Young晋升到Tenured的对象,
少Major GC
合理分配堆大小、Survivor Space Size、Tenuring Threshold
借助工具 TBJMap 分析JVM堆每一个分区的内容
优化系统代码,及时回收对象、
少内存使用、
JVM性能表现的最佳状态是没有Major GC
小⻚页面大小
15. 模板引擎优化
•
•
Char 转 byte - 性能提升100%
解析执行改编译执行 - 性能提升10%
16. 3. 应用自身优化
•
•
•
•
•
•
压缩模板大小
设置最佳并发
代码瓶颈优化
外部调用优化
CPU优化
架构优化
17. 压缩模板大小
•
•
•
模板大小和
删除空行、多余空格
⻓长URL压缩、 用URL
•
•
吐量成反比
去掉’http:’
业务上去重
•
案例:JSON去重
小50%
名
18. 设置最佳并发
最佳并发 = ((CPU时间+CPU等待时间) / CPU时间) * CPU数量
19. 代码瓶颈优化
•
•
找到影响性能的
键点进行优化
案例:某应用每个请求都抛
•
去掉后, CPU使用率提高30%
•
吐量提升近30%
•
常危害很大,需要从根源发现
•
Taobao JDK 常监测补丁
常
常
20. 外部调用优化
•
并行RPC、并行搜索
•
•
吐量
合并外部调用
•
•
会降低响应时间,不会提升
去冗余调用、合并接口
使用更优的序列化协议
•
•
Protocol Buffers
Kryo 比 PB 快20%
21. CPU优化
•
•
•
•
GZip压缩级
类中Field排序
• 频繁使用的放一起
• Cache Line优化
批量处理数组
• 按行处理不要按列处理
• 使用批量接口
使用乐观策略
22. 架构优化
•
•
动态资源静态化
• 分析⻚页面,更新迟缓占比较大的部分放CDN
• 案例:⻚页面大小200KB -> 100KB
后台依赖前台化
•
•
降低响应时间、提高稳定性
后端
染前端化
• 数据远小于⻚页面,⻚页面布局比较规则
• 案例:响应时间
少25%、⻚页面大小
小60%
23. 架构优化
•
DB依赖缓存化
• 需要Center应用维护缓存
• 对象缓存
• ⻚页面片段缓存
• 整⻚页缓存
• HTTP缓存
• 提高命中率
24. 4. 前端性能优化
•
•
度量
键指标
前端优化实践
25. 度量
•
•
•
•
•
⻚页面下载时间
始
染时间
首屏时间
domReady
onLoad
键指标
•
•
•
•
TSlow
阿里度
阿里测
⻚页面埋点
•
•
Navigation Timing
PhantomJS
26. 前端优化实践
•
•
Yahoo 34条军规
首屏优先,
•
•
•
染优化
BigRender
延迟加载,按需加载
Keep Alive、mod_pagespeed
27. Q&A