2012-12 叔同:淘宝网前台应用性能优化实践(Velocity China 2012)

文字内容
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