CPU Cache and Memory Ordering——并发程序设计入门

7月 13th, 2013

CPU Cache and Memory Ordering

内容简介

本PPT,为本人学习CPU架构以及并发程序设计的一些心得与收获。主要内容包括:

 

  •   简单介绍CPU的架构,部分主要模块及其功能(Cache Structure, Cache Line , Set-Way);
  •   Cache Coherence算法 (MESI, MOESI);
  •  CPU Memory Ordering模型 (Atomic,Reorder,Memory Barrier (Compiler, CPU),Lock Instruction,Load Acquire/Store Release);
  •  并发程序设计 (实现一个Spinlock,纠正一个Lock-Free Algorithm,Data Race (False-Sharing, Per-Processor Data));

 

分享地址

新浪微盘

  • PPT格式下载地址:点我
  • PDF格式下载地址:点我

 

说明:推荐下载PPT格式,每页PPT的备注中,都有对应的参考资料,可进行深入的学习。而PDF格式,所有的参考资料,均在最后给出。

 

SlideShare


 

 

 

My sql 5.6新特性深入剖析——innodb引擎

4月 12th, 2013

简介

2012-09-29,MySQL 5.6第一个RC版本发布(MySQL 5.6.7),2013-02-05,MySQL 5.6第一个GA版本发布(MySQL 5.6.10)。总的来说,MySQL 5.6算是一个值得期待的版本,包含了大量的新特性,了解这些新特性,不仅对数据库内核研发有帮助,对于更好的使用MySQL数据库也有着极大的意义。

 

因此,本人从2012年初开始,就一直关注MySQL 5.6版本的各个新特性,阅读每一个5.6版本相关的相关博文,下载其最新的版本进行测试验证,积累下了一定的心得与收获,形成了这个介绍MySQL 5.6新特性深入剖析的PPT。本PPT一共分为两期:分别是InnoDB引擎以及MySQL Server。

 

本次为第一期,分享 MySQL 5.6 InnoDB引擎中的性能优化与功能增强。性能优化包括:Read-Only Transaction,Buffer Pool Flushing,Page Cleaner,Purge等;功能增强包括:Online DDL,InnoDB Memcached Plugin,Transportable Tablespaces,Buffer Pool Dump/Restore等;同时,阅读此PPT的过程中,朋友们还可以通过PPT中的链接,深入到每个功能的设计、实现与使用的相关资料,更进一步了解每一个新特性。

 

My sql 5.6新特性深入剖析——innodb引擎

 

新浪微盘地址

 

Slideshare在线观看

 


 

InnoDB Memcached Plugin源码实现调研

4月 3rd, 2013

背景

 

MySQL 5.6版本,新增了一个NoSQL的接口,通过将memcached嵌入到MySQL系统之中,用户可以直接使用memcached接口直接操作MySQL中的InnoDB表,绕过MySQL Server层面的SQL解析,优化,甚至绕过InnoDB Handler层,直接操作InnoDB内部的方法,从而达到更优的响应时间与效率。关于此功能的官方介绍,请见:InnoDB Integration with memcached 。嵌入memcached之后,整个MySQL的架构如下图所示:

 

 

本文接下来的部分,将从源码的角度,详细分析InnoDB Integration with memcached的实现细节问题。

 

导读

 

  • InnoDB引擎为了支持Memcached API,在Handler层面进行的改动,请见(一)


  • Memcached Plugin的初始化流程,请见(二)

 

  • InnoDB提供的Callback方法在InnoDB Handlerton中的data中以及Memcached Plugin的data中,是如何传递的呢?请见(三)

 

  • InnoDB Memcached Engine提供的方法集合,请见(四)

 

  • InnoDB Memcached Engine提供的方法,如何调用到InnoDB Engine提供的方法,请见(五)

 

  • InnoDB Memcached Engine中,存在两个Engine实例:InnoDB Engine vs Default Engine,二者的功能异同,请见(六)

 

  • InnoDB Memcached Engine中,需要配置Container Table,Container表详解,请见(七)

 

  • InnoDB Memcached Engine的初始化与使用流程,可参考engine_testapp.c测试文件;

阅读全文…

二分查找(Binary Search)需要注意的问题,以及在数据库内核中的实现

4月 1st, 2013

问题背景

 

今年的实习生招聘考试,我出了一道二分查找(Binary Search)的题目。题目大意如下:

 

给定一个升序排列的自然数数组,数组中包含重复数字,例如:[1,2,2,3,4,4,4,5,6,7,7]。问题:给定任意自然数,对数组进行二分查找,返回数组正确的位置,给出函数实现。注:连续相同的数字,返回第一个匹配位置还是最后一个匹配位置,由函数传入参数决定。

 

我为什么会出这道题目?

 

  • 二分查找在数据库内核实现中非常重要

    在数据库的内核实现中,二分查找是一个非常重要的逻辑,几乎99%以上的SQL语句(所有索引上的范围扫描/等值查询/Unique查询等),都会使用到二分查找进行数据的定位。


    考虑一个数据库表t1(a int primary key, b int),表上的b字段有一个B+树索引,表中记录的b字段取值,就是题目中的[1,2,2,3,4,4,4,5,6,7,7]序列。此时,给定以下的两条查询语句,就是使用到了不同的二分查找逻辑:


    SQL1:   select * from t1 where b 4;

    SQL2: select * from t1 where b >= 4;


    针对SQL1,索引的二分查找,就需要跳过所有的4,从最后一个4之后开始返回所有记录;针对SQL2,二分查找就需要定位到第一个4,然后顺序读取所有记录。


    除此之外,针对数据库中其他的查询逻辑,二分查找还需要附带更多的功能,例如:


    SQL3: select * from t1 where b < 2;

    SQL4: select * from t1 where b <= 2;


    由于数据库索引同时支持反向扫描,因此SQL3、SQL4的语句,都可以使用索引反向扫描。反向扫描时,SQL3需要定位到索引中的第一个2;而SQL4,则需要定位到索引的最后一个2,然后开始反向返回满足查询条件的索引记录。

    阅读全文…

SQL中的where条件,在数据库中提取与应用浅析

3月 3rd, 2013

1        问题描述

一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣。当然,要完整描述一条SQL在数据库中的生命周期,这是一个非常巨大的问题,涵盖了SQL的词法解析、语法解析、权限检查、查询优化、SQL执行等一系列的步骤,简短的篇幅是绝对无能为力的。因此,本文挑选了其中的部分内容,也是我一直都想写的一个内容,做重点介绍:

 

给定一条SQL,如何提取其中的where条件?where条件中的每个子条件,在SQL执行的过程中有分别起着什么样的作用?

 

通过本文的介绍,希望读者能够更好地理解查询条件对于SQL语句的影响;撰写出更为优质的SQL语句;更好地理解一些术语,例如:MySQL 5.6中一个重要的优化——Index Condition Pushdown,究竟push down了什么?

 

本文接下来的内容,安排如下:

  1. 简单介绍关系型数据库中数据的组织形式;
  2. 给定一条SQL,如何提取其中的where条件;
  3. 最后做一个小的总结;

 

阅读全文…

Oracle RAC资源管理算法与Cache-Fusion实现浅析

2月 21st, 2013

 

本人阅读<Oracle DSI408>,<Oracle 8i Parallel Server>,<Oracle Core>等书籍后,整理的一篇简单介绍Oracle RAC实现的PPT,内容包括RAC的基本架构、RAC的脑裂检测、RAC的资源管理、RAC Cache-Fusion、RAC Instance Crash Recovery流程等。

 

微盘地址Oracle RAC资源管理算法与Cache-Fusion实现浅析

 

注1:能够翻墙的朋友,应该能够看到以下的Slideshare内容

 


NTSE、TNT引擎研发之自动化测试实践

2月 19th, 2013

背景介绍

软件自动化测试,是软件测试中的一类分支。自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较。在此过程中,为了节省人力、时间或硬件资源,提高测试效率,便引入了自动化测试的概念。

 

基于NTSE、TNT项目的特点:

  • 软件需求变动不频繁

    NTSE是MySQL的一个非事务存储引擎,TNT是MySQL的事务存储引擎。两个项目在立项之初,就已经确定了项目的特性及主要功能。NTSE项目从2008年6月至今,其核心功能几乎没有变化。

  • 项目周期长

    NTSE、TNT均为数据库的存储引擎,研发难度大,周期长。其中,NTSE引擎从2008年6月立项,到目前为止已经历经5年左右时间,发布了多个版本。TNT引擎从2011年9月立项,至今也有了一年半左右时间。而且,两个项目还会一直进行持续研发,项目周期非常长。

  • 测试脚本可重复使用

    由于NTSE、TNT项目的核心功能相对稳定,因此很多测试用例,可以重复使用。例如:NTSE早期开发的测试框架与测试代码,在新的TNT引擎中仍旧能够正常运行。

    与此同时,数据库系统已经是非常成熟的系统,市场上已经有了大量自动化性能测试工具,这些工具也能够用于测试NTSE、TNT引擎。

NTSE、TNT项目以上三个显著的特点,非常符合软件自动化测试的基本需求。因此,在项目的研发过程中,大量使用了自动化测试技术,达到了很好的测试效果。

阅读全文…

从MySQL Bug#67718浅谈B+树索引的分裂优化

1月 6th, 2013

问题背景

今天,看到Twitter的DBA团队发布了其最新的MySQL分支:Changes in Twitter MySQL 5.5.28.t9,此分支最重要的一个改进,就是修复了MySQL 的Bug #67718:InnoDB drastically under-fills pages in certain conditions。关于此Bug的详细描述,以及如何重现此问题,可以阅读以上的Bug链接,以下简单描述下此Bug对应的问题:

 

InnoDB的索引分裂策略,在特定的情况下,索引页面的分裂存在问题,导致每个分裂出来的页面,仅仅存储一条记录,页面的空间利用率极低。

 

此Bug引起了我的兴趣,因此准备跟大家简单聊聊B+树索引的结构、B+树的分裂、B+树分裂操作的优化、Bug #67718的成因,以及个人对如何修复此Bug的一些建议等。

阅读全文…

硬件体系架构浅析

12月 19th, 2012

个人写的一个介绍硬件体系架构的PPT,介绍CPU,Cache,内存,硬盘,SSD,网络等各方面的基础知识。包括如何计算各种内存的速度?如何计算硬盘的IOPS?SSD与硬盘的性能差距?编程中,针对不同的硬件,有何注意点?等等知识。由于本人不是这方面的专家,因此做了大量的调研,力争让每一页的PPT都尽量正确,如果PPT中有错误之处,还希望朋友们给予指出,本人做修正。

 

此PPT,可通过新浪微盘下载,也可以通过Slideshare在线阅读。其中,新浪微盘分享的下载文件,每一页的PPT,其备注部分都包含了撰写此页PPT所参考的资料,推荐通过参考资料进行深入的阅读。

 

新浪微盘地址硬件体系架构浅析

 


数据库内核分享(第二期)—— InnoDB 日志 回滚段 & 崩溃恢复 实现详解

12月 7th, 2012

 

本期PPT分享内容

 

InnoDB 日志/回滚段/崩溃恢复的实现详解。第一期分享的内容,是InnoDB与Oracle的Buffer Pool实现对比。而本期,让我们暂时告别Oracle,将心思完全放在InnoDB引擎上。本期的分享,将详细介绍如下内容:
一、InnoDB的日志相关内容:InnoDB有哪些日志?InnoDB的DML操作,会如何记录日志?为何不同的Update操作,性能上会有较大的不同?
二、InnoDB的Redo详解:InnoDB Redo日志的种类?Mini-Transaction是什么?InnoDB的Log Buffer,Log Block的结构是怎样的?如何通过LSN计算对应的日志文件位置?
三、InnoDB的Undo详解:InnoDB的回滚段结构是如何组织的?回滚段页面有哪些类型?事务与回滚段是如何交互的?事务提交、回滚、Purge的操作,分别如何进行?
四、InnoDB的崩溃恢复详解:InnoDB的崩溃恢复步骤?崩溃恢复过程中,如何处理Redo?如何处理Undo?如何重建所有事务?

 

本期PPT的微盘下载地址微盘下载

本期PPT分享的视频地址分享视频