SlideShare ist ein Scribd-Unternehmen logo
1 von 30
DTCC2011
DTCC2011


Jametong@童家旺
work@alipay (2010.8-)
work@alibaba(2005.5-2010.8)
work@浙江移劢台州公司 (2003.12-2005.5)
Blog @ http://www.dbthink.com/
mail@ jametong@gmail.com
DTCC2011


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




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

什么是优化?
响应时间 Vs 吞吐量
Instrument & metrics
需要了解的一点硬件知识
常见案例分析
引用资料
DTCC2011


The fastest way to do something is
don„t do it
  Anonymous


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


Performance is all about code path
  From Cary Millsap
  http://carymillsap.blogspot.com/2010/09/my-otn-interview-at-
  oow2010-which-hasnt.html
DTCC2011

丌访问丌必要的数据
 使用B*Tree/hash等方法定位必要的数据
 使用column Store或分表的方式将数据分开存储
 使用Bloom filter算法排除空值查询

合理的利用硬件来提升访问效率
 使用缓存消除对数据的重复访问
 使用批量处理来减少磁盘的Seek操作
 使用批量处理来减少网络的Round Trip
 使用SSD来提升磁盘访问效率
DTCC2011

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


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


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

    Response Time = Service Time + Queue Time




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

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



What gets measured gets
managed.
 Peter Drucker (彼得. 德鲁克 )



Don't guess, get the data
 Anonymous
DTCC2011

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

从杭州北京(花费了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分钟)
DTCC2011

Metrics
  v$sys_time_model & v$sess_time_model
  v$sysstat & v$sesstat
  v$system_event & v$session_event
  v$session_wait & v$event_histogram


Instrument
  Extended 10046 trace
DTCC2011

vmstat & iostat & netstat & tcprstat &
sar
strace & oprofile & systemtap
aspersa & latencytop & top
   [oracle@mytest ~]$ ps -ef | grep dbw
   oracle 8323        1 0 2010 ?           00:42:29
   ora_dbw0_mytest
   [oracle@mytest ~]$ strace -c -p 8323
   Process 8323 attached - interrupt to quit
   Process 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
DTCC2011

         L1 cache reference 0.5 ns(1GHz CPU)
         Branch mispredict 5 ns
         L2 cache reference 7 ns
         Mutex lock/unlock 25 ns
         Main memory reference 100 ns
         Compress 1K bytes with Zippy 3,000 ns
         Send 2K bytes over 1 Gbps network 20,000 ns
         Read 1 MB sequentially from memory 250,000 ns
         Round trip within same datacenter 500,000 ns
         Disk seek 10,000,000 ns (7200rpm SATA)
         Read 1 MB sequentially from disk 20,000,000 ns
         Send packet CA->Netherlands->CA 150,000,000 ns

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

      7200 RPM SATA                                  15000 rpm SAS
       基本处理延时                                         基本处理延时
        Seek Time = 9.5ms (1)                          Seek Time = 4ms (1)
        Rotation Time = 4.2ms                          Rotation Time = 2ms
       一次IO随机读取8KB数据的延时                               一次IO随机读取8KB数据的延时
        Transfer Time = 8KB / ( 3Gb/s) = 21 μs         Transfer Time = 8KB / ( 3Gb/s) = 21 μs
        Total Time = ST + RT + ETT + ITT = 13.72ms     Total Time = ST + RT + TT = 6.021ms
       一次IO随机读取1MB数据的延时                               一次IO随机读取1MB数据的延时
        Transfer Time = 1MB / ( 3Gb/s) = 2.69ms        Transfer Time = 1MB / ( 3Gb/s) = 2.688ms
        Total Time = ST + RT + TT = 16.41 ms           Total Time = ST + RT + TT = 8.709 ms
       一次IO顺序读取1MB数据的延时                               一次IO顺序读取1MB数据的延时
        Transfer Time = 1MB / ( 3Gb/s) = 2.69ms        Transfer Time = 1MB / ( 3Gb/s) = 2.688ms
        Total Time = RT + TT = 6.91 ms                 Total Time = RT + TT = 4.709 ms

256
128
 64                                                                             SATA 7200RPM(8K)(随机)
 32                                                                             SATA 7200RPM(1M)(随机)
 16                                                                             SATA 7200RPM(1M)(顺序)
  8                                                                             SAS 15000RPM(8K)(随机)
  4                                                                             SAS 15000RPM(1M)(随机)
  2                                                                             SAS 15000RPM(1M)(顺序)

  1
0.5           延时(ms)                    IOPS(次           吞吐量(MB)
                                        数)
1.来自Seagate介绍
DTCC2011


                                                    索引键的选择性(唯一性)
                                                    索引键的顺序
                                                    索引对应基础数据的更新
                                                    频度
                                                    等值检索 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》
DTCC2011

模拟场景
 表中有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);
DTCC2011

 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

Logical Reads                                                      Logical Reads

              full table scan                                                                   53470



  index access + table filter                                  130



 index access + index filter                            27



               index access                         24


                                1        5         25        125       625    3125   15625     78125
DTCC2011

场景介绍
 表VeryBigTable含有30个列
 表的记录数为50,000,000条
 平均每个用户为300条左右
 其中有2个列属于详细描述字段,平均长度为2k
 其它的列的总长度平均为250个字节
 此表上的查询有两种模式
     列出表中的主要信息(每次20条,丌包含详细信息,90%的查询)
     查看记录的详细信息(10%的查询)
 保存在Oracle数据库中,默认block size(8k)
要求
 对此业务进行优化
 分析数据,说服开发部门实施此优化
DTCC2011

   性能分析
    每块记录数
     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


右上标的内容请参见注释
DTCC2011

场景
Read Intensive (R/W 20倍以上)
业务可接受部分延迟(Delay)
每天访问量上亿次
系统IO压力巨大(本地内存无法容纳活跃数据)
要求
优化业务
DTCC2011

方案
使用缓存来减少应用对后端的访问
注意事项
考虑缓存的刷新策略
考虑缓存的数据延迟对业务的影响
考虑缓存失效时,系统的支撑能力
参考缓存工具: MemCached, Tair, Redis
DTCC2011

场景分析
 单词拼写检查
  有20万单词条目
  每个条目平均长度50字节
  单词条目会劢态增加,但变更量很小
  目前单词条目存储在数据库中
  每天1亿次查询,其中99%的查询为空查
  现在通过read through的缓存进行处理
  但是仍然有80%的查询(都为空查询)会访问后端
 要求
  对此业务进行优化
  分析方案的投入产出
DTCC2011

方案
 使用全量缓存
     将所有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%的空查.
DTCC2011

        加入字符串过程
            首先是将字符串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
DTCC2011

             elapsed time    elapsed time
    16
    14
    12
    10
     8
     6
     4
     2
     0




             Logical Reads     Logical Reads
    120000

    100000

     80000

     60000

     40000

     20000

         0




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

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

Optimizing Oracle Performance
   By Cary Millsap, Jeff Holt
Forecasting Oracle Performance
   By Craig Shallahamer
Guerrilla Capacity Planning
   By Neil J. Gunther
Relational Database Index Design and the Optimizers
   By Tapio Lahdenmaki
Think Clearly About Performance
   By Cary Millsap
   http://www.method-r.com/downloads/doc_details/44-thinking-clearly-
   about-performance
TroubleShooting Oracle Performance
   By Christian Antognini
性能诊断艺术
   Translated By 冯大辉/胡怡文/童家旺
DTCC2011

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




Q&A

Weitere ähnliche Inhalte

Was ist angesagt?

MySQL InnoDB 源码实现分析(一)
MySQL InnoDB 源码实现分析(一)MySQL InnoDB 源码实现分析(一)
MySQL InnoDB 源码实现分析(一)frogd
 
排队论及其应用浅析
排队论及其应用浅析排队论及其应用浅析
排队论及其应用浅析frogd
 
数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)
数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)
数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)frogd
 
NoSQL-MongoDB介紹
NoSQL-MongoDB介紹NoSQL-MongoDB介紹
NoSQL-MongoDB介紹國昭 張
 
Nosql三步曲
Nosql三步曲Nosql三步曲
Nosql三步曲84zhu
 
TomCat迁移步骤简述以及案例
TomCat迁移步骤简述以及案例TomCat迁移步骤简述以及案例
TomCat迁移步骤简述以及案例maclean liu
 
Mysql企业备份发展及实践
Mysql企业备份发展及实践Mysql企业备份发展及实践
Mysql企业备份发展及实践maclean liu
 
Mongo db 簡介
Mongo db 簡介Mongo db 簡介
Mongo db 簡介昱劭 劉
 
【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略
【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略
【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略maclean liu
 
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案maclean liu
 
分区表基础知识培训
分区表基础知识培训分区表基础知识培训
分区表基础知识培训maclean liu
 
MySQL Tuning For CPU Bottleneck
MySQL Tuning For CPU BottleneckMySQL Tuning For CPU Bottleneck
MySQL Tuning For CPU BottleneckSky Jian
 
ElasticSearch Training#2 (advanced concepts)-ESCC#1
ElasticSearch Training#2 (advanced concepts)-ESCC#1ElasticSearch Training#2 (advanced concepts)-ESCC#1
ElasticSearch Training#2 (advanced concepts)-ESCC#1medcl
 
20110625.【打造高效能的cdn系统】.易统
20110625.【打造高效能的cdn系统】.易统20110625.【打造高效能的cdn系统】.易统
20110625.【打造高效能的cdn系统】.易统锐 张
 
分布式Key Value Store漫谈
分布式Key Value Store漫谈分布式Key Value Store漫谈
分布式Key Value Store漫谈Tim Y
 
淘宝图片存储与Cdn系统
淘宝图片存储与Cdn系统淘宝图片存储与Cdn系统
淘宝图片存储与Cdn系统Dai Jun
 

Was ist angesagt? (17)

MySQL InnoDB 源码实现分析(一)
MySQL InnoDB 源码实现分析(一)MySQL InnoDB 源码实现分析(一)
MySQL InnoDB 源码实现分析(一)
 
排队论及其应用浅析
排队论及其应用浅析排队论及其应用浅析
排队论及其应用浅析
 
数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)
数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)
数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)
 
NoSQL-MongoDB介紹
NoSQL-MongoDB介紹NoSQL-MongoDB介紹
NoSQL-MongoDB介紹
 
Nosql三步曲
Nosql三步曲Nosql三步曲
Nosql三步曲
 
TomCat迁移步骤简述以及案例
TomCat迁移步骤简述以及案例TomCat迁移步骤简述以及案例
TomCat迁移步骤简述以及案例
 
Mysql企业备份发展及实践
Mysql企业备份发展及实践Mysql企业备份发展及实践
Mysql企业备份发展及实践
 
Mongo db 簡介
Mongo db 簡介Mongo db 簡介
Mongo db 簡介
 
Mongo db 特性
Mongo db 特性Mongo db 特性
Mongo db 特性
 
【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略
【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略
【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略
 
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
 
分区表基础知识培训
分区表基础知识培训分区表基础知识培训
分区表基础知识培训
 
MySQL Tuning For CPU Bottleneck
MySQL Tuning For CPU BottleneckMySQL Tuning For CPU Bottleneck
MySQL Tuning For CPU Bottleneck
 
ElasticSearch Training#2 (advanced concepts)-ESCC#1
ElasticSearch Training#2 (advanced concepts)-ESCC#1ElasticSearch Training#2 (advanced concepts)-ESCC#1
ElasticSearch Training#2 (advanced concepts)-ESCC#1
 
20110625.【打造高效能的cdn系统】.易统
20110625.【打造高效能的cdn系统】.易统20110625.【打造高效能的cdn系统】.易统
20110625.【打造高效能的cdn系统】.易统
 
分布式Key Value Store漫谈
分布式Key Value Store漫谈分布式Key Value Store漫谈
分布式Key Value Store漫谈
 
淘宝图片存储与Cdn系统
淘宝图片存储与Cdn系统淘宝图片存储与Cdn系统
淘宝图片存储与Cdn系统
 

Andere mochten auch

Rethinkdb and tokudb research
Rethinkdb and tokudb research Rethinkdb and tokudb research
Rethinkdb and tokudb research mysqlops
 
MongoDB使用技巧
MongoDB使用技巧MongoDB使用技巧
MongoDB使用技巧mysqlops
 
Event proxy introduction
Event proxy introductionEvent proxy introduction
Event proxy introductionmysqlops
 
PPC2009_yahoo_mysql_pagination
PPC2009_yahoo_mysql_paginationPPC2009_yahoo_mysql_pagination
PPC2009_yahoo_mysql_paginationmysqlops
 
Couchbase b jmeetup
Couchbase b jmeetupCouchbase b jmeetup
Couchbase b jmeetupmysqlops
 

Andere mochten auch (6)

Rethinkdb and tokudb research
Rethinkdb and tokudb research Rethinkdb and tokudb research
Rethinkdb and tokudb research
 
MongoDB使用技巧
MongoDB使用技巧MongoDB使用技巧
MongoDB使用技巧
 
Event proxy introduction
Event proxy introductionEvent proxy introduction
Event proxy introduction
 
PPC2009_yahoo_mysql_pagination
PPC2009_yahoo_mysql_paginationPPC2009_yahoo_mysql_pagination
PPC2009_yahoo_mysql_pagination
 
LVS
LVSLVS
LVS
 
Couchbase b jmeetup
Couchbase b jmeetupCouchbase b jmeetup
Couchbase b jmeetup
 

Ähnlich wie 我对后端优化的一点想法

我对后端优化的一点想法 (2012)
我对后端优化的一点想法 (2012)我对后端优化的一点想法 (2012)
我对后端优化的一点想法 (2012)james tong
 
我对后端优化的一点想法.pptx
我对后端优化的一点想法.pptx我对后端优化的一点想法.pptx
我对后端优化的一点想法.pptxjames tong
 
Osc scott linux下的数据库优化for_postgresql
Osc scott linux下的数据库优化for_postgresqlOsc scott linux下的数据库优化for_postgresql
Osc scott linux下的数据库优化for_postgresqlOpenSourceCamp
 
阿里巴巴 叶正盛 数据库性能量化
阿里巴巴 叶正盛 数据库性能量化阿里巴巴 叶正盛 数据库性能量化
阿里巴巴 叶正盛 数据库性能量化colderboy17
 
阿里巴巴 叶正盛 数据库性能量化
阿里巴巴 叶正盛 数据库性能量化阿里巴巴 叶正盛 数据库性能量化
阿里巴巴 叶正盛 数据库性能量化guiyingshenxia
 
淘宝前端优化
淘宝前端优化淘宝前端优化
淘宝前端优化锐 张
 
淘宝前台系统优化实践“吞吐量优化”-Qcon2011
淘宝前台系统优化实践“吞吐量优化”-Qcon2011淘宝前台系统优化实践“吞吐量优化”-Qcon2011
淘宝前台系统优化实践“吞吐量优化”-Qcon2011Yiwei Ma
 
Mongo db at qihoo 360
Mongo db at qihoo 360Mongo db at qihoo 360
Mongo db at qihoo 3602507697439
 
Baidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log AnalysisBaidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log AnalysisXiaoming Chen
 
Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)ykdsg
 
Pptv lb日志实时分析平台
Pptv lb日志实时分析平台Pptv lb日志实时分析平台
Pptv lb日志实时分析平台drewz lin
 
MongoDB at Qihoo 360
MongoDB at Qihoo 360MongoDB at Qihoo 360
MongoDB at Qihoo 360MongoDB
 
Performance Data Analyze
Performance Data AnalyzePerformance Data Analyze
Performance Data Analyzeanysql
 
Tokyo Cabinet
Tokyo CabinetTokyo Cabinet
Tokyo Cabinetrewinx
 
Tokyo Cabinet Key Value数据库及其扩展应用
Tokyo Cabinet  Key Value数据库及其扩展应用Tokyo Cabinet  Key Value数据库及其扩展应用
Tokyo Cabinet Key Value数据库及其扩展应用rewinx
 
Mysql遇到的一些问题
Mysql遇到的一些问题Mysql遇到的一些问题
Mysql遇到的一些问题wang tongchao
 
腾讯大讲堂06 qq邮箱性能优化
腾讯大讲堂06 qq邮箱性能优化腾讯大讲堂06 qq邮箱性能优化
腾讯大讲堂06 qq邮箱性能优化topgeek
 

Ähnlich wie 我对后端优化的一点想法 (20)

我对后端优化的一点想法 (2012)
我对后端优化的一点想法 (2012)我对后端优化的一点想法 (2012)
我对后端优化的一点想法 (2012)
 
我对后端优化的一点想法.pptx
我对后端优化的一点想法.pptx我对后端优化的一点想法.pptx
我对后端优化的一点想法.pptx
 
Osc scott linux下的数据库优化for_postgresql
Osc scott linux下的数据库优化for_postgresqlOsc scott linux下的数据库优化for_postgresql
Osc scott linux下的数据库优化for_postgresql
 
阿里巴巴 叶正盛 数据库性能量化
阿里巴巴 叶正盛 数据库性能量化阿里巴巴 叶正盛 数据库性能量化
阿里巴巴 叶正盛 数据库性能量化
 
阿里巴巴 叶正盛 数据库性能量化
阿里巴巴 叶正盛 数据库性能量化阿里巴巴 叶正盛 数据库性能量化
阿里巴巴 叶正盛 数据库性能量化
 
淘宝前端优化
淘宝前端优化淘宝前端优化
淘宝前端优化
 
淘宝前台系统优化实践“吞吐量优化”-Qcon2011
淘宝前台系统优化实践“吞吐量优化”-Qcon2011淘宝前台系统优化实践“吞吐量优化”-Qcon2011
淘宝前台系统优化实践“吞吐量优化”-Qcon2011
 
Glider
GliderGlider
Glider
 
Mongo db at qihoo 360
Mongo db at qihoo 360Mongo db at qihoo 360
Mongo db at qihoo 360
 
Baidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log AnalysisBaidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log Analysis
 
Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)
 
Pptv lb日志实时分析平台
Pptv lb日志实时分析平台Pptv lb日志实时分析平台
Pptv lb日志实时分析平台
 
MongoDB at Qihoo 360
MongoDB at Qihoo 360MongoDB at Qihoo 360
MongoDB at Qihoo 360
 
Performance Data Analyze
Performance Data AnalyzePerformance Data Analyze
Performance Data Analyze
 
19 cpu03
19 cpu0319 cpu03
19 cpu03
 
Godson x86
Godson x86Godson x86
Godson x86
 
Tokyo Cabinet
Tokyo CabinetTokyo Cabinet
Tokyo Cabinet
 
Tokyo Cabinet Key Value数据库及其扩展应用
Tokyo Cabinet  Key Value数据库及其扩展应用Tokyo Cabinet  Key Value数据库及其扩展应用
Tokyo Cabinet Key Value数据库及其扩展应用
 
Mysql遇到的一些问题
Mysql遇到的一些问题Mysql遇到的一些问题
Mysql遇到的一些问题
 
腾讯大讲堂06 qq邮箱性能优化
腾讯大讲堂06 qq邮箱性能优化腾讯大讲堂06 qq邮箱性能优化
腾讯大讲堂06 qq邮箱性能优化
 

Mehr von mysqlops

The simplethebeautiful
The simplethebeautifulThe simplethebeautiful
The simplethebeautifulmysqlops
 
Oracle数据库分析函数详解
Oracle数据库分析函数详解Oracle数据库分析函数详解
Oracle数据库分析函数详解mysqlops
 
Percona Live 2012PPT:mysql-security-privileges-and-user-management
Percona Live 2012PPT:mysql-security-privileges-and-user-managementPercona Live 2012PPT:mysql-security-privileges-and-user-management
Percona Live 2012PPT:mysql-security-privileges-and-user-managementmysqlops
 
Percona Live 2012PPT: introduction-to-mysql-replication
Percona Live 2012PPT: introduction-to-mysql-replicationPercona Live 2012PPT: introduction-to-mysql-replication
Percona Live 2012PPT: introduction-to-mysql-replicationmysqlops
 
Percona Live 2012PPT: MySQL Cluster And NDB Cluster
Percona Live 2012PPT: MySQL Cluster And NDB ClusterPercona Live 2012PPT: MySQL Cluster And NDB Cluster
Percona Live 2012PPT: MySQL Cluster And NDB Clustermysqlops
 
Percona Live 2012PPT: MySQL Query optimization
Percona Live 2012PPT: MySQL Query optimizationPercona Live 2012PPT: MySQL Query optimization
Percona Live 2012PPT: MySQL Query optimizationmysqlops
 
Pldc2012 innodb architecture and internals
Pldc2012 innodb architecture and internalsPldc2012 innodb architecture and internals
Pldc2012 innodb architecture and internalsmysqlops
 
DBA新人的述职报告
DBA新人的述职报告DBA新人的述职报告
DBA新人的述职报告mysqlops
 
分布式爬虫
分布式爬虫分布式爬虫
分布式爬虫mysqlops
 
MySQL应用优化实践
MySQL应用优化实践MySQL应用优化实践
MySQL应用优化实践mysqlops
 
eBay EDW元数据管理及应用
eBay EDW元数据管理及应用eBay EDW元数据管理及应用
eBay EDW元数据管理及应用mysqlops
 
基于协程的网络开发框架的设计与实现
基于协程的网络开发框架的设计与实现基于协程的网络开发框架的设计与实现
基于协程的网络开发框架的设计与实现mysqlops
 
eBay基于Hadoop平台的用户邮件数据分析
eBay基于Hadoop平台的用户邮件数据分析eBay基于Hadoop平台的用户邮件数据分析
eBay基于Hadoop平台的用户邮件数据分析mysqlops
 
对MySQL DBA的一些思考
对MySQL DBA的一些思考对MySQL DBA的一些思考
对MySQL DBA的一些思考mysqlops
 
QQ聊天系统后台架构的演化与启示
QQ聊天系统后台架构的演化与启示QQ聊天系统后台架构的演化与启示
QQ聊天系统后台架构的演化与启示mysqlops
 
腾讯即时聊天IM1.4亿在线背后的故事
腾讯即时聊天IM1.4亿在线背后的故事腾讯即时聊天IM1.4亿在线背后的故事
腾讯即时聊天IM1.4亿在线背后的故事mysqlops
 
分布式存储与TDDL
分布式存储与TDDL分布式存储与TDDL
分布式存储与TDDLmysqlops
 
MySQL数据库生产环境维护
MySQL数据库生产环境维护MySQL数据库生产环境维护
MySQL数据库生产环境维护mysqlops
 

Mehr von mysqlops (20)

The simplethebeautiful
The simplethebeautifulThe simplethebeautiful
The simplethebeautiful
 
Oracle数据库分析函数详解
Oracle数据库分析函数详解Oracle数据库分析函数详解
Oracle数据库分析函数详解
 
Percona Live 2012PPT:mysql-security-privileges-and-user-management
Percona Live 2012PPT:mysql-security-privileges-and-user-managementPercona Live 2012PPT:mysql-security-privileges-and-user-management
Percona Live 2012PPT:mysql-security-privileges-and-user-management
 
Percona Live 2012PPT: introduction-to-mysql-replication
Percona Live 2012PPT: introduction-to-mysql-replicationPercona Live 2012PPT: introduction-to-mysql-replication
Percona Live 2012PPT: introduction-to-mysql-replication
 
Percona Live 2012PPT: MySQL Cluster And NDB Cluster
Percona Live 2012PPT: MySQL Cluster And NDB ClusterPercona Live 2012PPT: MySQL Cluster And NDB Cluster
Percona Live 2012PPT: MySQL Cluster And NDB Cluster
 
Percona Live 2012PPT: MySQL Query optimization
Percona Live 2012PPT: MySQL Query optimizationPercona Live 2012PPT: MySQL Query optimization
Percona Live 2012PPT: MySQL Query optimization
 
Pldc2012 innodb architecture and internals
Pldc2012 innodb architecture and internalsPldc2012 innodb architecture and internals
Pldc2012 innodb architecture and internals
 
DBA新人的述职报告
DBA新人的述职报告DBA新人的述职报告
DBA新人的述职报告
 
分布式爬虫
分布式爬虫分布式爬虫
分布式爬虫
 
MySQL应用优化实践
MySQL应用优化实践MySQL应用优化实践
MySQL应用优化实践
 
eBay EDW元数据管理及应用
eBay EDW元数据管理及应用eBay EDW元数据管理及应用
eBay EDW元数据管理及应用
 
基于协程的网络开发框架的设计与实现
基于协程的网络开发框架的设计与实现基于协程的网络开发框架的设计与实现
基于协程的网络开发框架的设计与实现
 
eBay基于Hadoop平台的用户邮件数据分析
eBay基于Hadoop平台的用户邮件数据分析eBay基于Hadoop平台的用户邮件数据分析
eBay基于Hadoop平台的用户邮件数据分析
 
对MySQL DBA的一些思考
对MySQL DBA的一些思考对MySQL DBA的一些思考
对MySQL DBA的一些思考
 
QQ聊天系统后台架构的演化与启示
QQ聊天系统后台架构的演化与启示QQ聊天系统后台架构的演化与启示
QQ聊天系统后台架构的演化与启示
 
腾讯即时聊天IM1.4亿在线背后的故事
腾讯即时聊天IM1.4亿在线背后的故事腾讯即时聊天IM1.4亿在线背后的故事
腾讯即时聊天IM1.4亿在线背后的故事
 
分布式存储与TDDL
分布式存储与TDDL分布式存储与TDDL
分布式存储与TDDL
 
MySQL数据库生产环境维护
MySQL数据库生产环境维护MySQL数据库生产环境维护
MySQL数据库生产环境维护
 
Memcached
MemcachedMemcached
Memcached
 
DevOPS
DevOPSDevOPS
DevOPS
 

我对后端优化的一点想法

  • 4. DTCC2011 什么是优化? 响应时间 Vs 吞吐量 Instrument & metrics 需要了解的一点硬件知识 常见案例分析 引用资料
  • 5. DTCC2011 The fastest way to do something is don„t do it Anonymous Two ways to improve performance, do it less or do it faster Anonymous Performance is all about code path From Cary Millsap http://carymillsap.blogspot.com/2010/09/my-otn-interview-at- oow2010-which-hasnt.html
  • 6. DTCC2011 丌访问丌必要的数据 使用B*Tree/hash等方法定位必要的数据 使用column Store或分表的方式将数据分开存储 使用Bloom filter算法排除空值查询 合理的利用硬件来提升访问效率 使用缓存消除对数据的重复访问 使用批量处理来减少磁盘的Seek操作 使用批量处理来减少网络的Round Trip 使用SSD来提升磁盘访问效率
  • 8. DTCC2011 Response Time = Service Time + Queue Time 经典的响应时间曲线.到达率为1.55trx/s,响应时间为 3ms/Trx,服务时间为2ms/Trx,排队时间为1ms/trx 图片引用自:《Forecasting Oracle Performance》, Chapter 2 P44,figure 2-1
  • 9. DTCC2011 What gets measured gets managed. Peter Drucker (彼得. 德鲁克 ) Don't guess, get the data Anonymous
  • 11. DTCC2011 从杭州北京(花费了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分钟)
  • 12. DTCC2011 Metrics v$sys_time_model & v$sess_time_model v$sysstat & v$sesstat v$system_event & v$session_event v$session_wait & v$event_histogram Instrument Extended 10046 trace
  • 13. DTCC2011 vmstat & iostat & netstat & tcprstat & sar strace & oprofile & systemtap aspersa & latencytop & top [oracle@mytest ~]$ ps -ef | grep dbw oracle 8323 1 0 2010 ? 00:42:29 ora_dbw0_mytest [oracle@mytest ~]$ strace -c -p 8323 Process 8323 attached - interrupt to quit Process 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
  • 14. DTCC2011 L1 cache reference 0.5 ns(1GHz CPU) Branch mispredict 5 ns L2 cache reference 7 ns Mutex lock/unlock 25 ns Main memory reference 100 ns Compress 1K bytes with Zippy 3,000 ns Send 2K bytes over 1 Gbps network 20,000 ns Read 1 MB sequentially from memory 250,000 ns Round trip within same datacenter 500,000 ns Disk seek 10,000,000 ns (7200rpm SATA) Read 1 MB sequentially from disk 20,000,000 ns Send packet CA->Netherlands->CA 150,000,000 ns 引用自: Peter Norvig: http://norvig.com/21-days.html,Jeff Dean: dean-keynote-ladis2009.pdf
  • 15. DTCC2011 7200 RPM SATA 15000 rpm SAS 基本处理延时 基本处理延时 Seek Time = 9.5ms (1) Seek Time = 4ms (1) Rotation Time = 4.2ms Rotation Time = 2ms 一次IO随机读取8KB数据的延时 一次IO随机读取8KB数据的延时 Transfer Time = 8KB / ( 3Gb/s) = 21 μs Transfer Time = 8KB / ( 3Gb/s) = 21 μs Total Time = ST + RT + ETT + ITT = 13.72ms Total Time = ST + RT + TT = 6.021ms 一次IO随机读取1MB数据的延时 一次IO随机读取1MB数据的延时 Transfer Time = 1MB / ( 3Gb/s) = 2.69ms Transfer Time = 1MB / ( 3Gb/s) = 2.688ms Total Time = ST + RT + TT = 16.41 ms Total Time = ST + RT + TT = 8.709 ms 一次IO顺序读取1MB数据的延时 一次IO顺序读取1MB数据的延时 Transfer Time = 1MB / ( 3Gb/s) = 2.69ms Transfer Time = 1MB / ( 3Gb/s) = 2.688ms Total Time = RT + TT = 6.91 ms Total Time = RT + TT = 4.709 ms 256 128 64 SATA 7200RPM(8K)(随机) 32 SATA 7200RPM(1M)(随机) 16 SATA 7200RPM(1M)(顺序) 8 SAS 15000RPM(8K)(随机) 4 SAS 15000RPM(1M)(随机) 2 SAS 15000RPM(1M)(顺序) 1 0.5 延时(ms) IOPS(次 吞吐量(MB) 数) 1.来自Seagate介绍
  • 16. DTCC2011 索引键的选择性(唯一性) 索引键的顺序 索引对应基础数据的更新 频度 等值检索 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》
  • 17. DTCC2011 模拟场景 表中有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);
  • 18. DTCC2011 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 Logical Reads Logical Reads full table scan 53470 index access + table filter 130 index access + index filter 27 index access 24 1 5 25 125 625 3125 15625 78125
  • 19. DTCC2011 场景介绍 表VeryBigTable含有30个列 表的记录数为50,000,000条 平均每个用户为300条左右 其中有2个列属于详细描述字段,平均长度为2k 其它的列的总长度平均为250个字节 此表上的查询有两种模式 列出表中的主要信息(每次20条,丌包含详细信息,90%的查询) 查看记录的详细信息(10%的查询) 保存在Oracle数据库中,默认block size(8k) 要求 对此业务进行优化 分析数据,说服开发部门实施此优化
  • 20. DTCC2011 性能分析 每块记录数 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 右上标的内容请参见注释
  • 21. DTCC2011 场景 Read Intensive (R/W 20倍以上) 业务可接受部分延迟(Delay) 每天访问量上亿次 系统IO压力巨大(本地内存无法容纳活跃数据) 要求 优化业务
  • 23. DTCC2011 场景分析 单词拼写检查 有20万单词条目 每个条目平均长度50字节 单词条目会劢态增加,但变更量很小 目前单词条目存储在数据库中 每天1亿次查询,其中99%的查询为空查 现在通过read through的缓存进行处理 但是仍然有80%的查询(都为空查询)会访问后端 要求 对此业务进行优化 分析方案的投入产出
  • 24. DTCC2011 方案 使用全量缓存 将所有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%的空查.
  • 25. DTCC2011 加入字符串过程 首先是将字符串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
  • 26. DTCC2011 elapsed time elapsed time 16 14 12 10 8 6 4 2 0 Logical Reads Logical Reads 120000 100000 80000 60000 40000 20000 0 使用丌同的批次大小从数据库取出20万条记录
  • 28. DTCC2011 Optimizing Oracle Performance By Cary Millsap, Jeff Holt Forecasting Oracle Performance By Craig Shallahamer Guerrilla Capacity Planning By Neil J. Gunther Relational Database Index Design and the Optimizers By Tapio Lahdenmaki Think Clearly About Performance By Cary Millsap http://www.method-r.com/downloads/doc_details/44-thinking-clearly- about-performance TroubleShooting Oracle Performance By Christian Antognini 性能诊断艺术 Translated By 冯大辉/胡怡文/童家旺