我对后端优化的一点想法.pptx

30
我我我我我我我 我我我

Upload: james-tong

Post on 23-Jun-2015

8.200 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: 我对后端优化的一点想法.pptx

我对后端优化的一点想法

Page 2: 我对后端优化的一点想法.pptx

About Me

Jametong@ 童家旺

work@alipay (2010.8-)

work@alibaba(2005.5-2010.8)

work@ 浙江移动台州公司 (2003.12-2005.5)

Blog @ http://www.dbthink.com/

mail@ [email protected]

Page 3: 我对后端优化的一点想法.pptx

About Me(2)

《 Oracle 性能诊断艺术》与冯大辉 (Fenng), 胡怡文合译

《 Oracle Performance Survival Guide 》与郑勇斌,胡怡文合作翻译中

Page 4: 我对后端优化的一点想法.pptx

内容简介

什么是优化 ?

响应时间 Vs 吞吐量

Instrument & metrics

需要了解的一点硬件知识

常见案例分析

引用资料

Page 5: 我对后端优化的一点想法.pptx

什么是优化 (1)

The fastest way to do something is don‘t do itAnonymous

Two ways to improve performance, do it less or do it faster

Anonymous

Performance is all about code pathFrom Cary Millsaphttp://carymillsap.blogspot.com/2010/09/my-otn-interview-at-oow2010-which-hasnt.html

Page 6: 我对后端优化的一点想法.pptx

什么是优化 (2)

不访问不必要的数据使用 B*Tree/hash 等方法定位必要的数据

使用 column Store 或分表的方式将数据分开存储

使用 Bloom filter 算法排除空值查询

合理的利用硬件来提升访问效率使用缓存消除对数据的重复访问

使用批量处理来减少磁盘的 Seek 操作

使用批量处理来减少网络的 Round Trip

使用 SSD 来提升磁盘访问效率

Page 7: 我对后端优化的一点想法.pptx

响应时间 Vs 吞吐量 (1)

性能衡量完成特定任务的速度或效率

响应时间衡量系统与用户交互式多久能够发出响应

吞吐量衡量系统在单位时间里可以完成的任务量

Page 8: 我对后端优化的一点想法.pptx

响应时间 Vs 吞吐量Response Time = Service Time + Queue Time

图片引用自 : 《 Forecasting Oracle Performance 》 , Chapter 2 P44,figure 2-1

经典的响应时间曲线 . 到达率为 1.55trx/s, 响应时间为3ms/Trx, 服务时间为 2ms/Trx, 排队时间为 1ms/trx

Page 9: 我对后端优化的一点想法.pptx

Instrument & Metrics

What gets measured gets managed.

Peter Drucker ( 彼得 . 德鲁克 )

Don't guess, get the dataAnonymous

Page 10: 我对后端优化的一点想法.pptx

Instrument & Metrics@life

从杭州北京(花费了 6 个半小时)

Page 11: 我对后端优化的一点想法.pptx

Instrument & Metrics@life

从杭州北京(花费了6个半小时)13:00 – 13:15 从公司下楼到淘宝 (15分钟 )

13:30 – 13:50 从淘宝出发到上出租车 (20分钟 )

14:00 - 15:00 在出租车上 ,从淘宝<->机场 (60分钟 )

15:10 - 15:20 拿机票 (10分钟 )

15:25 - 15:50 安检 (25分钟 )

16:00 – 17:00 在机场候机 (60分钟 )

17:00 - 18:20 飞机上 ,杭州北京 (80分钟 )

18:20 - 18:40 到出租车上车点 (20分钟 )

18:40 - 18:55 等待出租车 (15分钟 )

18:55 - 19:50 机场到酒店 (55分钟 )

Page 12: 我对后端优化的一点想法.pptx

Instrument & Metrics@Oracle

Metricsv$sys_time_model & v$sess_time_model

v$sysstat & v$sesstat

v$system_event & v$session_event

v$session_wait & v$event_histogram

InstrumentExtended 10046 trace

Page 13: 我对后端优化的一点想法.pptx

Instrument & Metrics@Linux

vmstat & iostat & netstat & tcprstat & sar strace & oprofile & systemtapaspersa & latencytop & top

[oracle@mytest ~]$ ps -ef | grep dbworacle 8323 1 0 2010 ? 00:42:29 ora_dbw0_mytest[oracle@mytest ~]$ strace -c -p 8323 Process 8323 attached - interrupt to quitProcess 8323 detached% time seconds usecs/call calls errors syscall------ ----------- ----------- --------- --------- ------------- 98.39 0.007194 37 195 pwrite 1.61 0.000118 0 644 times 0.00 0.000000 0 1 read 0.00 0.000000 0 1 open 0.00 0.000000 0 1 close 0.00 0.000000 0 10 getrusage 0.00 0.000000 0 11 11 semtimedop------ ----------- ----------- --------- --------- -------------100.00 0.007312 863 11 total

Page 14: 我对后端优化的一点想法.pptx

Numbers you Should Know

L1 cache reference 0.5 ns(1GHz CPU)Branch mispredict 5 nsL2 cache reference 7 nsMutex lock/unlock 25 nsMain memory reference 100 nsCompress 1K bytes with Zippy 3,000 nsSend 2K bytes over 1 Gbps network 20,000 nsRead 1 MB sequentially from memory 250,000 nsRound trip within same datacenter 500,000 nsDisk seek 10,000,000 ns (7200rpm SATA)Read 1 MB sequentially from disk 20,000,000 nsSend packet CA->Netherlands->CA 150,000,000 ns

引用自 : Peter Norvig: http://norvig.com/21-days.html,Jeff Dean: dean-keynote-ladis2009.pdf

Page 15: 我对后端优化的一点想法.pptx

传统磁盘的访问特性7200 RPM SATA

基本处理延时Seek Time = 9.5ms (1)

Rotation Time = 4.2ms

一次 IO 随机读取 8KB 数据的延时Transfer Time = 8KB / ( 3Gb/s) = 21 μsTotal Time = ST + RT + ETT + ITT = 13.72ms

一次 IO 随机读取 1MB 数据的延时Transfer Time = 1MB / ( 3Gb/s) = 2.69msTotal Time = ST + RT + TT = 16.41 ms

一次 IO 顺序读取 1MB 数据的延时Transfer Time = 1MB / ( 3Gb/s) = 2.69msTotal Time = RT + TT = 6.91 ms

1. 来自 Seagate 介绍

15000 rpm SAS基本处理延时

Seek Time = 4ms (1)

Rotation Time = 2ms

一次 IO 随机读取 8KB 数据的延时Transfer Time = 8KB / ( 3Gb/s) = 21 μsTotal Time = ST + RT + TT = 6.021ms

一次 IO 随机读取 1MB 数据的延时Transfer Time = 1MB / ( 3Gb/s) = 2.688msTotal Time = ST + RT + TT = 8.709 ms

一次 IO 顺序读取 1MB 数据的延时Transfer Time = 1MB / ( 3Gb/s) = 2.688msTotal Time = RT + TT = 4.709 ms

延时 (ms) IOPS( 次数 ) 吞吐量 (MB)

0.1

1

10

100

1000

SATA 7200RPM(8K)( 随机 )

SATA 7200RPM(1M)( 随机 )

SATA 7200RPM(1M)( 顺序 )

SAS 15000RPM(8K)( 随机 )

SAS 15000RPM(1M)( 随机 )

SAS 15000RPM(1M)( 顺序 )

IOPS( 次数 )

Page 16: 我对后端优化的一点想法.pptx

B*Tree 优化数据访问

索引键的选择性 ( 唯一性 )索引键的顺序索引对应基础数据的更新频度等值检索 Vs 范围检索导致索引失效的场景Index Access Vs Index Filter Vs Table Filter

Richard Foote 的 Blog http://richardfoote.wordpress.com/ 与Tapio Lahdenmaki 的书《 Relational Database Index Design and the Optimizers 》

Page 17: 我对后端优化的一点想法.pptx

B*Tree 优化数据访问模拟场景

表中有 5 个字段 (id, status, type, gmt_create, content)

主要基于三个字段的组合进行查询字段 status, type 总共有 30 个组合 (status 5 个值 ,type 6 个值 )

每天有 10000 条记录 , 时间随机分布 ( 共 60 天的数据 )

执行的查询 , 分页取第一个 20 条记录

select id,status,type,gmt_create,content from ( select

id,status,type,gmt_create,content,rownum rn

from ( select id,status,type,gmt_create,content from james_t

where status = '00' and type = '05' and gmt_create >= trunc(sysdate) and

gmt_create < trunc(sysdate+1)

order by gmt_create desc ) where rownum <= 20 ) where rn >= 0;

分别创建三种不同的索引进行测试

create index james_t_idx on james_t(status, type, gmt_create);

create index james_t_idx on james_t (status, gmt_create);

create index james_t_idx on james_t (gmt_create, status, type);

Page 18: 我对后端优化的一点想法.pptx

B*Tree 优化数据访问index columns description Logical Reads

status, type, gmt_create index access 24

gmt_create, status, type index access + index filter 27

status, gmt_create index access + table filter 130

no index full table scan 53470

index access

index access + index filter

index access + table filter

full table scan

10 100 1000 10000 100000

24

27

130

53470

Logical Reads Logical Reads

Page 19: 我对后端优化的一点想法.pptx

分表存储来提高性能场景介绍

表 VeryBigTable 含有 30 个列表的记录数为 50,000,000 条平均每个用户为 300 条左右其中有 2 个列属于详细描述字段 , 平均长度为 2k

其它的列的总长度平均为 250 个字节此表上的查询有两种模式

列出表中的主要信息 ( 每次 20 条 , 不包含详细信息 ,90% 的查询 )

查看记录的详细信息 (10% 的查询 )

保存在 Oracle 数据库中 ,默认block size(8k)

要求对此业务进行优化分析数据 ,说服开发部门实施此优化

Page 20: 我对后端优化的一点想法.pptx

分表存储来提高性能 (2)

性能分析每块记录数

8192 * 0.80(1) / 250 = 25.5 ( 主表 )8192 * 0.80 / 2000 = 3.27( 详情表 )8192 * 0.80 / ( 2000 + 250 ) = 2.91

访问的逻辑 IO(内存块访问 )List 的查询代价访问代价为 = 索引头块+ 需访问的叶子块+ 需要访问的数据块 .改进后=( 300/25.5 ) * y + 4 + x = 4 + x + 11.8y = 42 + 73 + 11.8 * 1.54 = 28.7 改进前=( 300/2.91 ) * y + 4 + x = 4 + x + 103.y = 4 + 7 + 103 * 1.5 = 165.5

访问涉及到的物理读 ( 磁盘块访问 )List 的查询代价 (逻辑 IO * ( 1 – 命中率 ))

改进后=28.7 * ( 1 – 0.855) = 4.305改进前=165.5 * ( 1 – 0.85 ) = 24.825

访问时间 (ms)改进后=逻辑 IO 时间 +物理 IO 时间 = 28.7 * 0.016 + 4.305 * 77 = 30.422ms改进前=逻辑 IO 时间 +物理 IO 时间 = 165.5 * 0.01 + 24.825 * 7 = 175.43ms

右上标的内容请参见注释

Page 21: 我对后端优化的一点想法.pptx

使用缓存优化重复查询

场景Read Intensive (R/W 20倍以上 )

业务可接受部分延迟 (Delay)

每天访问量上亿次系统 IO压力巨大 ( 本地内存无法容纳活跃数据 )

要求优化业务

Page 22: 我对后端优化的一点想法.pptx

使用缓存优化重复查询

方案使用缓存来减少应用对后端的访问

注意事项考虑缓存的刷新策略考虑缓存的数据延迟对业务的影响考虑缓存失效时 , 系统的支撑能力参考缓存工具 : MemCached, Tair, Redis

Page 23: 我对后端优化的一点想法.pptx

空查询优化场景分析

单词拼写检查有 20万单词条目每个条目平均长度 50 字节单词条目会动态增加 ,但变更量很小目前单词条目存储在数据库中每天 1亿次查询 , 其中 99% 的查询为空查现在通过 read through 的缓存进行处理但是仍然有 80% 的查询 (都为空查询 )会访问后端

要求对此业务进行优化分析方案的投入产出

Page 24: 我对后端优化的一点想法.pptx

空查询优化 (2)

方案使用全量缓存

将所有 Key 存储到缓存中 ,并且缓存不可以空间不足变更都同时变更到缓存

如果可以接受 stale 的数据 , 可以考虑使用异步消息处理缓存容量为 200,000 * 50 * 1.5 = 15MB( 大概开销 )

使用 Bloom Filter 作为辅助处理将所有 Key都添加到 Bloom Filter 中变更都同时变更到 Bloom Filter

如果可以接受 stale 的数据 , 可以考虑使用异步消息处理缓存容量 key_cnt * 20 / 8 = 2.5* key_cnt = 2.5 * 200,000 = 0.5MB

当Bloom Filter 的 bitset 为 Key 数量的 20倍左右时 ,通过 3 次 hash 操作就可以达到 1% 左右的 false positive(误判率 ), 从而可以消除 99% 的空查 .

Page 25: 我对后端优化的一点想法.pptx

Bloom filter 技术介绍加入字符串过程

首先是将字符串 str“ 记录”到 BitSet 中的过程:对于字符串 str ,分别计算 h ( 1 , str ), h ( 2 , str )…… h ( k , str )。然后将BitSet 的第 h ( 1 , str )、 h ( 2 , str )…… h ( k , str )位设为 1。

检查字符串是否存在的过程对于字符串 str ,分别计算 h ( 1 , str ), h ( 2 , str )…… h ( k , str )。然后检查BitSet 的第 h ( 1 , str )、 h ( 2 , str )…… h ( k , str )位是否为 1 ,若其中任何一位不为 1则可以判定 str 一定没有被记录过。若全部位都是 1 ,则“认为”字符串 str 存在。若一个字符串对应的 Bit 不全为 1 ,则可以肯定该字符串一定没有被 Bloom Filter 记录过若一个字符串对应的 Bit全为 1 ,实际上是不能 100% 的肯定该字符串被 Bloom Filter 记录过的

http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html

Page 26: 我对后端优化的一点想法.pptx

批量处理接口

2 4 8 12 16 20 24 28 32 36 40 50 60 100 150 200 400 800 1600320050000

2

4

6

8

10

12

14

16elapsed time elapsed time

2 4 8 12 16 20 24 28 32 36 40 50 60 100

150

200

400

800

1600

3200

5000

0

20000

40000

60000

80000

100000

120000Logical Reads Logical Reads

使用不同的批次大小从数据库取出 20万条记录

Page 27: 我对后端优化的一点想法.pptx

批量处理的注意事项在有批量需求的情况下 ,尽可能提供批量处理接口 ,如memcached 的 multiget, 或者cassandra 的 getslice,针对 RDBMS, 可以使用批量接口 (如Oracle 的 Array Interface).不要设置过大的批次大小这需要与对应的程序 heap 空间设置过大可能会导致程序出现OOM错误网络 send/receive_buffer 大小 (/proc/sys/net/core/wmem|rmem_max|default)

Page 28: 我对后端优化的一点想法.pptx

Recommended Reading

Optimizing Oracle PerformanceBy Cary Millsap, Jeff Holt

Forecasting Oracle PerformanceBy Craig Shallahamer

Guerrilla Capacity PlanningBy Neil J. Gunther

Relational Database Index Design and the OptimizersBy Tapio Lahdenmaki

Think Clearly About PerformanceBy Cary Millsaphttp://www.method-r.com/downloads/doc_details/44-thinking-clearly-about-performance

TroubleShooting Oracle PerformanceBy Christian Antognini

性能诊断艺术Translated By 冯大辉 / 胡怡文 / 童家旺

Page 29: 我对后端优化的一点想法.pptx

We Are Hiring

招聘资深 DBA数据库架构师运维架构师详细信息请参见http://job.alipay.com/recruit/index.htm

Page 30: 我对后端优化的一点想法.pptx

谢谢

Q & A