SlideShare una empresa de Scribd logo
1 de 27
Descargar para leer sin conexión
淘宝网前台应用性能优化实践
自我介绍

•   丁宇,阿里花名叔同

•   4年行业软件和3年互联网应用     发
    经验,对构建高性能、高可用、可
    扩展的Web应用     趣浓厚

•   现为淘宝网技术部综合业务平台技
    术专家,负责性能优化领域的工作

•   Weibo:淘宝叔同
议程

1. 应用性能分析

2. 基础设施优化

3. 应用自身优化

4. 前端性能优化
1. 应用性能分析


•   介绍前台应用

•   度量   键指标

•   查找应用瓶颈
介绍前台应用


•   面向用户的Web应用

•   商品详情、店铺等

•   流量较大、机器较多
前台应用特点

•   模板        染⻚页面

    •   使用Velocity引擎

    •   ⻚页面较大(大于100KB)


•   外部调用较多

    •   数据来自外部,不保存数据

    •   DB、HSF、 Tair、 Search、 TFS ...


•   磁盘读写较少

•       吐量相对低
度量              键指标

•       吐量

    •   线上环境压测获取

    •   HttpLoad、Nginx引流


•   响应时间、 ⻚页面大小

    •   分析访问日志获取


•   每请求内存数

    •   GC回收的内存数除以         吐量
查找应用瓶颈



•       于瓶颈

    •   瓶颈是系统中比较慢的部分,在瓶颈完成前,其他部分需要等待


•   2/8原则

    •   20%的代码执行会消耗80%的资源
查找应用瓶颈

•   CPU、IO、Memory

    •   Thread、File、Socket、GC


•   一般性瓶颈

    •   CPU计算

        •   字符串查找、替换、拼接

        •   编码、解码、压缩、解压

    •   外部调用

        •   IO   销、序列化、反序列化
查找模块瓶颈

                 Other
             Tair
                  5%
             4%


                                    Velocity
  Search                            Hesper
   31%                              Search
                         Velocity   Tair
                           57%      Other

           Hesper
            3%



时间消耗分析,使用TProfiler工具
查找代码瓶颈

      •    找出代码瓶颈

          •    使用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
2. 基础设施优化


•   软件升级

•   JVM调优

•   模板引擎优化
软件升级
•   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
                                           JBoss 4.2
    •   加大Java Heap,   吐量提升70%
                                           Web App
•   Kernel升级

    •   内核升级参数调整,        吐量提升40%
JVM调优


•   Minor GC暂停25ms,Major GC暂停500ms

•    少Young晋升到Tenured的对象,        少Major GC

•   合理分配堆大小、Survivor Space Size、Tenuring Threshold

•   借助工具 TBJMap 分析JVM堆每一个分区的内容

•   优化系统代码,及时回收对象、              少内存使用、       小⻚页面大小

•   JVM性能表现的最佳状态是没有Major GC
模板引擎优化




•   Char 转 byte - 性能提升100%

•   解析执行改编译执行 - 性能提升10%
3. 应用自身优化
•   压缩模板大小

•   设置最佳并发

•   代码瓶颈优化

•   外部调用优化

•   CPU优化

•   架构优化
压缩模板大小

•   模板大小和           吐量成反比

•   删除空行、多余空格

•   ⻓长URL压缩、 用URL           名

    •   去掉’http:’


•   业务上去重

    •   案例:JSON去重    小50%
设置最佳并发




最佳并发 = ((CPU时间+CPU等待时间) / CPU时间) * CPU数量
代码瓶颈优化

•   找到影响性能的              键点进行优化

•   案例:某应用每个请求都抛               常   常

    •   去掉后, CPU使用率提高30%

    •       吐量提升近30%

    •        常危害很大,需要从根源发现

        •   Taobao JDK 常监测补丁
外部调用优化
•   并行RPC、并行搜索

    •   会降低响应时间,不会提升       吐量


•   合并外部调用

    •   去冗余调用、合并接口


•   使用更优的序列化协议

    •   Protocol Buffers

    •   Kryo 比 PB 快20%
CPU优化

•   GZip压缩级

•   类中Field排序

    •   频繁使用的放一起

    •   Cache Line优化


•   批量处理数组

    •   按行处理不要按列处理

    •   使用批量接口


•   使用乐观策略
架构优化

•   动态资源静态化

    •   分析⻚页面,更新迟缓占比较大的部分放CDN

    •   案例:⻚页面大小200KB -> 100KB


•   后台依赖前台化

    •   降低响应时间、提高稳定性


•   后端      染前端化

    •   数据远小于⻚页面,⻚页面布局比较规则

    •   案例:响应时间     少25%、⻚页面大小   小60%
架构优化

•   DB依赖缓存化

    •   需要Center应用维护缓存

    •   对象缓存

    •   ⻚页面片段缓存

    •   整⻚页缓存

    •   HTTP缓存

    •   提高命中率
4. 前端性能优化



•   度量   键指标

•   前端优化实践
度量   键指标


•   ⻚页面下载时间         •       TSlow

                    •       阿里度
•    始   染时间
                    •       阿里测
•   首屏时间
                    •       ⻚页面埋点
•   domReady
                        •    Navigation Timing
•   onLoad
                    •       PhantomJS
前端优化实践


•   Yahoo 34条军规

•   首屏优先,           染优化

    •   BigRender


•   延迟加载,按需加载

•   Keep Alive、mod_pagespeed
Q&A

Más contenido relacionado

La actualidad más candente

性能优化
性能优化性能优化
性能优化Lu Wei
 
服务器基准测试-叶金荣@CYOU-20121130
服务器基准测试-叶金荣@CYOU-20121130服务器基准测试-叶金荣@CYOU-20121130
服务器基准测试-叶金荣@CYOU-20121130Jinrong Ye
 
一个 Mongodb command 的前世今生
一个 Mongodb command 的前世今生一个 Mongodb command 的前世今生
一个 Mongodb command 的前世今生dennis zhuang
 
Building the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
Building the Production Ready EB level Storage Product from Ceph - Dongmao ZhangBuilding the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
Building the Production Ready EB level Storage Product from Ceph - Dongmao ZhangCeph Community
 
阿里CDN技术揭秘
阿里CDN技术揭秘阿里CDN技术揭秘
阿里CDN技术揭秘Joshua Zhu
 
分布式Key Value Store漫谈
分布式Key Value Store漫谈分布式Key Value Store漫谈
分布式Key Value Store漫谈Tim Y
 
构建基于Lamp的网站架构
构建基于Lamp的网站架构构建基于Lamp的网站架构
构建基于Lamp的网站架构Cosey Lee
 
线上问题排查交流
线上问题排查交流线上问题排查交流
线上问题排查交流Edward Lee
 
Golang 高性能实战
Golang 高性能实战Golang 高性能实战
Golang 高性能实战rfyiamcool
 
Cephfs架构解读和测试分析
Cephfs架构解读和测试分析Cephfs架构解读和测试分析
Cephfs架构解读和测试分析Yang Guanjun
 
系统性能分析和优化.ppt
系统性能分析和优化.ppt系统性能分析和优化.ppt
系统性能分析和优化.pptFrank Cai
 
Sun JDK 1.6内存管理 -调优篇
Sun JDK 1.6内存管理 -调优篇Sun JDK 1.6内存管理 -调优篇
Sun JDK 1.6内存管理 -调优篇bluedavy lin
 
PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223
PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223
PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223Jinrong Ye
 
Truck js 高性能移动web开发解决方案
Truck js 高性能移动web开发解决方案Truck js 高性能移动web开发解决方案
Truck js 高性能移动web开发解决方案美团技术团队
 
Traffic server overview
Traffic server overviewTraffic server overview
Traffic server overviewqianshi
 
Java内存管理问题案例分享
Java内存管理问题案例分享Java内存管理问题案例分享
Java内存管理问题案例分享bluedavy lin
 
Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)ykdsg
 
腾讯大讲堂19 系统优化的方向
腾讯大讲堂19 系统优化的方向腾讯大讲堂19 系统优化的方向
腾讯大讲堂19 系统优化的方向areyouok
 
腾讯大讲堂17 性能优化不是仅局限于后台(qzone)
腾讯大讲堂17 性能优化不是仅局限于后台(qzone)腾讯大讲堂17 性能优化不是仅局限于后台(qzone)
腾讯大讲堂17 性能优化不是仅局限于后台(qzone)topgeek
 

La actualidad más candente (20)

性能优化
性能优化性能优化
性能优化
 
服务器基准测试-叶金荣@CYOU-20121130
服务器基准测试-叶金荣@CYOU-20121130服务器基准测试-叶金荣@CYOU-20121130
服务器基准测试-叶金荣@CYOU-20121130
 
一个 Mongodb command 的前世今生
一个 Mongodb command 的前世今生一个 Mongodb command 的前世今生
一个 Mongodb command 的前世今生
 
Building the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
Building the Production Ready EB level Storage Product from Ceph - Dongmao ZhangBuilding the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
Building the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
 
Ceph perf-tunning
Ceph perf-tunningCeph perf-tunning
Ceph perf-tunning
 
阿里CDN技术揭秘
阿里CDN技术揭秘阿里CDN技术揭秘
阿里CDN技术揭秘
 
分布式Key Value Store漫谈
分布式Key Value Store漫谈分布式Key Value Store漫谈
分布式Key Value Store漫谈
 
构建基于Lamp的网站架构
构建基于Lamp的网站架构构建基于Lamp的网站架构
构建基于Lamp的网站架构
 
线上问题排查交流
线上问题排查交流线上问题排查交流
线上问题排查交流
 
Golang 高性能实战
Golang 高性能实战Golang 高性能实战
Golang 高性能实战
 
Cephfs架构解读和测试分析
Cephfs架构解读和测试分析Cephfs架构解读和测试分析
Cephfs架构解读和测试分析
 
系统性能分析和优化.ppt
系统性能分析和优化.ppt系统性能分析和优化.ppt
系统性能分析和优化.ppt
 
Sun JDK 1.6内存管理 -调优篇
Sun JDK 1.6内存管理 -调优篇Sun JDK 1.6内存管理 -调优篇
Sun JDK 1.6内存管理 -调优篇
 
PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223
PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223
PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223
 
Truck js 高性能移动web开发解决方案
Truck js 高性能移动web开发解决方案Truck js 高性能移动web开发解决方案
Truck js 高性能移动web开发解决方案
 
Traffic server overview
Traffic server overviewTraffic server overview
Traffic server overview
 
Java内存管理问题案例分享
Java内存管理问题案例分享Java内存管理问题案例分享
Java内存管理问题案例分享
 
Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)
 
腾讯大讲堂19 系统优化的方向
腾讯大讲堂19 系统优化的方向腾讯大讲堂19 系统优化的方向
腾讯大讲堂19 系统优化的方向
 
腾讯大讲堂17 性能优化不是仅局限于后台(qzone)
腾讯大讲堂17 性能优化不是仅局限于后台(qzone)腾讯大讲堂17 性能优化不是仅局限于后台(qzone)
腾讯大讲堂17 性能优化不是仅局限于后台(qzone)
 

Similar a 淘宝网前台应用性能优化实践

前端性能优化&测试
前端性能优化&测试前端性能优化&测试
前端性能优化&测试tbmallf2e
 
Mysql调优
Mysql调优Mysql调优
Mysql调优ken shin
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合Qiangning Hong
 
Comment System of 56.com
Comment System of 56.comComment System of 56.com
Comment System of 56.comHo Kim
 
美团前端架构简介
美团前端架构简介美团前端架构简介
美团前端架构简介pan weizeng
 
05.wls调优
05.wls调优05.wls调优
05.wls调优Meng He
 
前端性能测试
前端性能测试前端性能测试
前端性能测试tbmallf2e
 
张勇 搜搜前端架构
张勇 搜搜前端架构张勇 搜搜前端架构
张勇 搜搜前端架构isnull
 
Chasingice
ChasingiceChasingice
Chasingice冰 白
 
Nodejs & NAE
Nodejs & NAENodejs & NAE
Nodejs & NAEq3boy
 
百度前端技术交流会--搜搜前端架构演变与优化
百度前端技术交流会--搜搜前端架构演变与优化百度前端技术交流会--搜搜前端架构演变与优化
百度前端技术交流会--搜搜前端架构演变与优化tiantianli
 
[Baidu web frontend_conference_2010]_[soso_frontend_architecture]
[Baidu web frontend_conference_2010]_[soso_frontend_architecture][Baidu web frontend_conference_2010]_[soso_frontend_architecture]
[Baidu web frontend_conference_2010]_[soso_frontend_architecture]思念 青青
 
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰Scourgen Hong
 
淘宝搜索前端优化
淘宝搜索前端优化淘宝搜索前端优化
淘宝搜索前端优化Frank Xu
 
使用Big pipe提升浏览速度 wk_velocity
使用Big pipe提升浏览速度 wk_velocity使用Big pipe提升浏览速度 wk_velocity
使用Big pipe提升浏览速度 wk_velocitykumawu
 
前端调试工具,编码相关,性能相关
前端调试工具,编码相关,性能相关前端调试工具,编码相关,性能相关
前端调试工具,编码相关,性能相关jay li
 
曲琳 购物搜索引擎架构的变与不变——一淘网搜索技术分享0731
曲琳 购物搜索引擎架构的变与不变——一淘网搜索技术分享0731曲琳 购物搜索引擎架构的变与不变——一淘网搜索技术分享0731
曲琳 购物搜索引擎架构的变与不变——一淘网搜索技术分享0731drewz lin
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践taobao.com
 
Btrace intro(撒迦)
Btrace intro(撒迦)Btrace intro(撒迦)
Btrace intro(撒迦)ykdsg
 
Kvmopt osforce
Kvmopt osforceKvmopt osforce
Kvmopt osforcemeecheng
 

Similar a 淘宝网前台应用性能优化实践 (20)

前端性能优化&测试
前端性能优化&测试前端性能优化&测试
前端性能优化&测试
 
Mysql调优
Mysql调优Mysql调优
Mysql调优
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合
 
Comment System of 56.com
Comment System of 56.comComment System of 56.com
Comment System of 56.com
 
美团前端架构简介
美团前端架构简介美团前端架构简介
美团前端架构简介
 
05.wls调优
05.wls调优05.wls调优
05.wls调优
 
前端性能测试
前端性能测试前端性能测试
前端性能测试
 
张勇 搜搜前端架构
张勇 搜搜前端架构张勇 搜搜前端架构
张勇 搜搜前端架构
 
Chasingice
ChasingiceChasingice
Chasingice
 
Nodejs & NAE
Nodejs & NAENodejs & NAE
Nodejs & NAE
 
百度前端技术交流会--搜搜前端架构演变与优化
百度前端技术交流会--搜搜前端架构演变与优化百度前端技术交流会--搜搜前端架构演变与优化
百度前端技术交流会--搜搜前端架构演变与优化
 
[Baidu web frontend_conference_2010]_[soso_frontend_architecture]
[Baidu web frontend_conference_2010]_[soso_frontend_architecture][Baidu web frontend_conference_2010]_[soso_frontend_architecture]
[Baidu web frontend_conference_2010]_[soso_frontend_architecture]
 
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
 
淘宝搜索前端优化
淘宝搜索前端优化淘宝搜索前端优化
淘宝搜索前端优化
 
使用Big pipe提升浏览速度 wk_velocity
使用Big pipe提升浏览速度 wk_velocity使用Big pipe提升浏览速度 wk_velocity
使用Big pipe提升浏览速度 wk_velocity
 
前端调试工具,编码相关,性能相关
前端调试工具,编码相关,性能相关前端调试工具,编码相关,性能相关
前端调试工具,编码相关,性能相关
 
曲琳 购物搜索引擎架构的变与不变——一淘网搜索技术分享0731
曲琳 购物搜索引擎架构的变与不变——一淘网搜索技术分享0731曲琳 购物搜索引擎架构的变与不变——一淘网搜索技术分享0731
曲琳 购物搜索引擎架构的变与不变——一淘网搜索技术分享0731
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 
Btrace intro(撒迦)
Btrace intro(撒迦)Btrace intro(撒迦)
Btrace intro(撒迦)
 
Kvmopt osforce
Kvmopt osforceKvmopt osforce
Kvmopt osforce
 

淘宝网前台应用性能优化实践

  • 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% Velocity Search Hesper 31% Search Velocity Tair 57% Other Hesper 3% 时间消耗分析,使用TProfiler工具
  • 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 JBoss 4.2 • 加大Java Heap, 吐量提升70% Web App • Kernel升级 • 内核升级参数调整, 吐量提升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%
  • 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. 度量 键指标 • ⻚页面下载时间 • TSlow • 阿里度 • 始 染时间 • 阿里测 • 首屏时间 • ⻚页面埋点 • domReady • Navigation Timing • onLoad • PhantomJS
  • 26. 前端优化实践 • Yahoo 34条军规 • 首屏优先, 染优化 • BigRender • 延迟加载,按需加载 • Keep Alive、mod_pagespeed
  • 27. Q&A