MySQL新技术探索与实践

6,550 views

Published on

Published in: Technology
2 Comments
27 Likes
Statistics
Notes
No Downloads
Views
Total views
6,550
On SlideShare
0
From Embeds
0
Number of Embeds
1,203
Actions
Shares
0
Downloads
280
Comments
2
Likes
27
Embeds 0
No embeds

No notes for slide
  • #include <iostream> #include <cstdlib> #include <time.h> #include <math.h> #define MAXN 2000000000 using namespace std; // 计时器 class Timer { public : // 构造函数 Timer (); // 析构函数 ~Timer (); // 开始计时 void begin(); // 计时结束 void end(); // 获取时间 float get_time(); private : clock_t start, finish; float time; }; Timer::Timer () { start = 0; finish = 0; } Timer::~Timer () { start = 0; finish = 0; } void Timer::begin () { start = clock(); } void Timer::end () { finish = clock(); } float Timer::get_time() { time = (float)(finish-start)/CLOCKS_PER_SEC; return time; } float pi(int n) { float s=0; float a; for(int i=1;i<=n;++i) { if(i%2==0) { a = 1.0/(2*i-1); s -= a; } else { a = 1.0/(2*i-1); s += a; } } s *= 4; return s; }; float sqrt1 (int n) { float a = 0; for (int i=1; i<=n; ++i) { /*if (i%2 == 0) { a += 1/sqrt(i); } else { a -= 1/sqrt(i); }*/ a += 1/sqrt(i); } return a; } float sqrt2 (float x) { float xhalf = 0.5f*x; int i = *(int*)&x; // get bits for floating VALUE i = 0x5f375a86- (i>>1); // gives initial guess y0 x = *(float*)&i; // convert bits BACK to float x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy return x; } float sqrt3 (int n) { float a = 0; for (int i=1; i<=n; ++i) { /*if (i%2 == 0) { a += sqrt2((float)i); } else { a -= sqrt2((float)i); }*/ a += sqrt2((float)i); } return a; } int main() { Timer timer; timer.begin (); float p = pi(MAXN); timer.end (); cout<<"1.PI Test(NULL):"<<timer.get_time()<<endl; timer.begin (); cout<<"\\n2.PI="<<pi(MAXN)<<endl; timer.end (); cout<<"2.PI Test:"<<timer.get_time()<<endl; timer.begin (); sqrt1(MAXN); timer.end (); cout<<"\\n3.system sqrt Test(NULL):"<<timer.get_time()<<endl; timer.begin (); cout<<"\\n4.sqrt1="<<sqrt1(MAXN)<<endl; timer.end (); cout<<"4.system sqrt Test:"<<timer.get_time()<<endl; timer.begin (); float s = sqrt3(MAXN); timer.end (); cout<<"\\n5.newton sqrt Test(NULL):"<<timer.get_time()<<endl; timer.begin (); cout<<"\\n6.sqrt2="<<sqrt3(MAXN)<<endl; timer.end (); cout<<"6.newton sqrt Test:"<<timer.get_time()<<endl; return 0; }
  • GCC 编译参数: CC=gcc \\ CXX=gcc \\ CHOST="x86_64-pc-linux-gnu" \\ CFLAGS=" -O3 \\ -fomit-frame-pointer \\ -pipe \\ -march=nocona \\ -mfpmath=sse \\ -m128bit-long-double \\ -mmmx \\ -msse \\ -msse2 \\ -maccumulate-outgoing-args \\ -m64 \\ -ftree-loop-linear \\ -fprefetch-loop-arrays \\ -freg-struct-return \\ -fgcse-sm \\ -fgcse-las \\ -frename-registers \\ -fforce-addr \\ -fivopts \\ -ftree-vectorize \\ -ftracer \\ -frename-registers \\ -minline-all-stringops \\ -fno-exceptions \\ -fno-rtti \\ -fbranch-target-load-optimize2 \\ -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free " \\ CXXFLAGS="${CFLAGS}" \\ LDFLAGS=" -ltcmalloc_minimal -lstdc++ " \\ ./configure \\ --with-server-suffix=-alibaba-edition \\ --with-mysqld-user=mysql \\ --with-plugins=heap,innodb_plugin,myisam,partition \\ --with-charset=utf8 \\ --with-collation=utf8_general_ci \\ --with-extra-charsets=gbk,utf8,ascii \\ --with-big-tables \\ --with-fast-mutexes \\ --with-zlib-dir=bundled \\ --with-readline \\ --with-pthread \\ --enable-assembler \\ --enable-profiling \\ --enable-local-infile \\ --enable-thread-safe-client \\ --with-mysqld-ldflags=-all-static \\ --without-embedded-server \\ --without-query-cache \\ --without-geometry \\ --without-debug \\ --without-ndb-binlog \\ --without-ndb-debug ICC 参数: CC=icc \\ CXX=icpc \\ LD=xild \\ AR=xiar \\ CFLAGS="-O3 -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free -unroll2 -ip -fp-model fast=1 -restrict -fno-exceptions -fno-rtti -no-prec-div -fno-implicit-templates -static-intel -static-libgcc -static -xSSE2 -axSSE2 " \\ CXXFLAGS="${CFLAGS}" \\ CPPFLAGS=" -I/usr/alibaba/icc/include " \\ LDFLAGS=" -L/usr/alibaba/icc/lib/intel64/ -lrt -ltcmalloc_minimal -lstdc++ " \\ ./configure \\ --with-server-suffix=-alibaba-edition \\ --with-mysqld-user=mysql \\ --with-plugins=heap,innodb_plugin,myisam,partition \\ --with-charset=utf8 \\ --with-collation=utf8_general_ci \\ --with-extra-charsets=gbk,utf8,ascii \\ --with-big-tables \\ --with-fast-mutexes \\ --with-zlib-dir=bundled \\ --with-readline \\ --with-pthread \\ --enable-assembler \\ --enable-profiling \\ --enable-local-infile \\ --enable-thread-safe-client \\ --with-mysqld-ldflags=-all-static \\ --without-embedded-server \\ --without-query-cache \\ --without-geometry \\ --without-debug \\ --without-ndb-binlog \\ --without-ndb-debug
  • 格式化参数: mkfs.xfs -f -i size=512,attr=2 -l size=128m,lazy-count=1 -d su=64k,sw=5 -L data /dev/sdb1 mount 参数: /dev/sdb1 /data xfs defaults,noatime,nodiratime,noikeep,nobarrier,allocsize=8M,attr2,largeio,inode64,swalloc 0 0
  • 测试场景为 1G 数据不断执行 SELECT 或 GET 操作同一条记录
  • MySQL新技术探索与实践

    1. 1. MySQL 新技术探索与实践 彭立勋 WWW.PengLiXun.COM Alibaba DBA Team
    2. 2. 新技术风起云涌 <ul><li>以 Percona/XtraDB 为代表的 MySQL 分支 ( MariaDB 、 Drizzle…… ) </li></ul><ul><li>以 HandlerSocket 为代表的新接口 ( Memcached Plugin…… ) </li></ul><ul><li>以 XFS/EXT4 为代表的高性能文件系统 ( Btrfs 、 ZFS…… ) </li></ul><ul><li>以 Flashcache 为代表的二级缓存架构 ( InnoDB Secondary Buffer Pool…… ) </li></ul><ul><li>以 Fusion-IO 为代表的 PCI-E SSD </li></ul><ul><li>以 Intel C Compiler 为代表的高性能编译器 </li></ul><ul><li>…… </li></ul>
    3. 3. Topics <ul><li>ICC </li></ul><ul><li>XFS </li></ul><ul><li>Percona </li></ul><ul><li>HandlerSocket </li></ul>
    4. 4. Why ICC <ul><li>为何自己编译 MySQL ? </li></ul><ul><li>官方无静态编译的 Innodb Plugin 版本 </li></ul><ul><li>可以加入第三方 Patch 或修改源码 </li></ul><ul><li>可以将第三方库静态编译到可执行文件( TCMalloc ) </li></ul><ul><li>为何使用 ICC 编译? </li></ul><ul><li>原生 Intel SSE2 指令集,浮点运算效率高 </li></ul><ul><li>内置 Intel Math Lib ,提升数学函数效率 </li></ul><ul><li>内置 Intel Thread Lib ,提升多线程稳定性和效率 </li></ul>
    5. 5. ICC vs GCC(1) 硬件环境 CPU : Intel Xoen 5410 内存: 24G 硬盘: 10*15k SAS RAID10
    6. 6. ICC vs GCC(2) 硬件环境 CPU : Intel Xoen 5520 内存: 24G 硬盘: 10*15k SAS RAID10 MySQL : 5.1.40 Enterprise
    7. 7. Why XFS <ul><li>为何不使用 EXT3 ? </li></ul><ul><li>对 SSD 设备不友好, SSD 是未来数据存储设备的趋势 </li></ul><ul><li>删除文件速度慢,导致数据库 Hang </li></ul><ul><li>对大文件读写性能不佳 </li></ul><ul><li>为何选择 XFS ? </li></ul><ul><li>SGI 已经在其大型机上应用多年 (From 1994) ,稳定可靠 </li></ul><ul><li>对 SSD 设备友好(延迟分配) </li></ul><ul><li>高并发下竞争少,性能好(分配组特性) </li></ul><ul><li>支持条带化分配,使得文件系统分配与 RAID 条带完全对齐,最大化吞吐量 </li></ul><ul><li>对大文件操作友好(基于 Extent 的分配方式) </li></ul>
    8. 8. Why NOT EXT4? <ul><li>EXT4 也是一款非常好的文件系统 </li></ul><ul><li>性能与 XFS 接近,甚至好一些 </li></ul><ul><li>并且可以从 EXT3 无缝升级 </li></ul><ul><li>But ...... </li></ul><ul><li>我们没有运维 EXT4 的经验 </li></ul>
    9. 9. XFS Tips <ul><li>分配组( Allocation Groups ) </li></ul><ul><li>延时分配( Delay Allocation ) </li></ul><ul><li>多线程 DirectIO </li></ul><ul><li>全 B+ Tree 管理空间 </li></ul>
    10. 10. EXT3 vs XFS(1) 硬件环境 CPU : Intel Xoen 5520 内存: 24G 硬盘: 10*15k SAS RAID10 MySQL : 5.1.40 Enterprise
    11. 11. EXT3 vs XFS(2) 硬件环境 CPU : Intel Xoen 5520 内存: 24G 硬盘: 10*15k SAS RAID10 MySQL : 5.1.40 Enterprise
    12. 12. Why Percona <ul><li>Percona 的优势 </li></ul><ul><li>对 SSD 设备有专门的优化 </li></ul><ul><li>对 Flashcache 有 SQL 层接口 </li></ul><ul><li>允许 XtraDB 静态编译 </li></ul><ul><li>支持多种页大小 </li></ul><ul><li>提供额外的监控参数 </li></ul><ul><li>有被生产环境考验过( SOHU ) </li></ul><ul><li>Percona 存在的问题 </li></ul><ul><li>引入第三方补丁较多,可能存在 Bug (可以接受) </li></ul>
    13. 13. New Future(1) <ul><li>文件格式 </li></ul><ul><li>Compressed 结构: CPU 换 IO </li></ul><ul><li>Dynamic 结构: ROW 中不存大字段前缀 </li></ul><ul><li>IO 参数 </li></ul><ul><li>IO 容量: innodb_io_capacity </li></ul><ul><li>IO 线程数: innodb_read_io_threads( 预读 ) 、 innodb_write_io_threads( 赃页回写 ) 、 innodb_use_purge_thread( 清理 UNDO) </li></ul><ul><li>赃页刷新方式 </li></ul><ul><li>innodb_adaptive_checkpoint (XtraDB) </li></ul><ul><li>innodb_adaptive_flushing (InnoDB Plugin) </li></ul>
    14. 14. New Future(2) <ul><li>扩展性 </li></ul><ul><li>增强多处理机性能( About 24 Cores ) </li></ul><ul><li>拆分 Buffer Pool Mutex ( buf_pool_mutex 、 LRU_list_mutex 、 flush_list_mutex 、 page_hash_latch 、 free_list_mutex 、 zip_free_mutex 、 zip_hash_mutex ) </li></ul><ul><li>功能 </li></ul><ul><li>可变页大小( innodb_page_size ) </li></ul><ul><li>可控的 Insert Buffering 和 Adaptive Hash Index </li></ul><ul><li>可配置多回滚段( innodb_extra_rsegments ) </li></ul><ul><li>快速 Warn Up ( innodb_buffer_pool_shm_key 、 XTRA_LRU_DUMP/XTRA_LRU_RESTORE ) </li></ul><ul><li>快速创建索引和索引快速重命名 </li></ul>
    15. 15. New Future(3) <ul><li>监控 </li></ul><ul><li>扩展 information_schema </li></ul><ul><ul><li>INDEX_STATISTICS </li></ul></ul><ul><ul><li>TABLE_STATISTICS </li></ul></ul><ul><ul><li>USER_STATISTICS </li></ul></ul><ul><li>扩展 InnoDB 统计 </li></ul><ul><ul><li>INNODB_TABLE_STATS </li></ul></ul><ul><ul><li>INNODB_INDEX_STATS </li></ul></ul><ul><li>For Example </li></ul><ul><ul><li>可以获取未使用过的索引 </li></ul></ul><ul><ul><li>可以获取索引被用于访问的行数 </li></ul></ul><ul><ul><li>可以获取当前锁定信息 </li></ul></ul><ul><ul><li>可以获取用户连接统计信息 </li></ul></ul><ul><ul><li>…… </li></ul></ul>
    16. 16. Percona Performance 每秒处理 50~75 万行读取 每秒处理 2.5K~5K Query 每秒网卡吞吐 400~750Mbps
    17. 17. Why Handler Socket <ul><li>SQL 执行的 Oprofile </li></ul><ul><li>samples % app name symbol name </li></ul><ul><li>259130 4.5199 mysqld MYSQLparse(void*) </li></ul><ul><li>196841 3.4334 mysqld my_pthread_fastmutex_lock </li></ul><ul><li>106439 1.8566 libc-2.5.so _int_malloc </li></ul><ul><li>…… </li></ul><ul><li>63435 1.1065 mysqld JOIN::optimize() </li></ul><ul><li>55825 0.9737 vmlinux wakeup_stack_begin </li></ul><ul><li>55054 0.9603 mysqld MYSQLlex(void*, void*) </li></ul><ul><li>50833 0.8867 libpthread-2.5.so pthread_mutex_trylock </li></ul><ul><li>49602 0.8652 ha_innodb_plugin.so.0.0.0 row_search_for_mysql </li></ul><ul><li>…… </li></ul><ul><li>46499 0.8111 libc-2.5.so malloc </li></ul>
    18. 18. Why Handler Socket <ul><li>HandlerSocket 执行的 Oprofile </li></ul><ul><li>samples % app name symbol name </li></ul><ul><li>984785 5.9118 bnx2 /bnx2 </li></ul><ul><li>847486 5.0876 ha_innodb_plugin.so.0.0.0 ut_delay </li></ul><ul><li>545303 3.2735 ha_innodb_plugin.so.0.0.0 btr_search_guess_on_hash </li></ul><ul><li>317570 1.9064 ha_innodb_plugin.so.0.0.0 row_search_for_mysql </li></ul><ul><li>…… </li></ul><ul><li>206057 1.2370 HandlerSocket.so dena::hstcpsvr_worker::run_one_ep() </li></ul><ul><li>183330 1.1006 ha_innodb_plugin.so.0.0.0 mutex_spin_wait </li></ul><ul><li>175738 1.0550 HandlerSocket.so dena::dbcontext:: cmd_find_internal(dena::dbcallback_i&, dena::prep_stmt const&, ha_rkey_function, dena::cmd_exec_args const&) </li></ul><ul><li>…… </li></ul><ul><li>149611 0.8981 ha_innodb_plugin.so.0.0.0 row_sel_store_mysql_rec </li></ul>
    19. 19. HS vs MC vs SQL 硬件环境 CPU : Intel Xoen 5520 内存: 24G 硬盘: 10*15k SAS RAID10 MySQL : 5.1.48
    20. 20. Our Solution(1)
    21. 21. Our Solution(2) <ul><li>RAID 卡 </li></ul><ul><li>关闭预读:预读效果不佳,直接读取磁盘 </li></ul><ul><li>关闭磁盘 Cache : RAID 卡缓存已经缓冲了写操作,磁盘 Cache 无电池 </li></ul><ul><li>条带:默认 64K ,调整为 1M </li></ul><ul><li>Linux </li></ul><ul><li>IO 调度: /sys/block/sdb/queue/scheduler ,默认 cfq ,调整为 deadline </li></ul><ul><li>减少预读: /sys/block/sdb/queue/read_ahead_kb ,默认 128 ,调整为 16 </li></ul><ul><li>增大队列: /sys/block/sdb/queue/nr_requests ,默认 128 ,调整为 512 </li></ul><ul><li>NUMA 策略: numactl --interleave=all 或 --cpunodebind=0 --localalloc </li></ul>
    22. 22. Our Solution(3) <ul><li>Flashcache </li></ul><ul><li>Block Size=4K :与 SSD 设备页对齐 </li></ul><ul><li>dirty_thresh_pct = 90 :一个 SET 内 90% 都是脏块则刷新 </li></ul><ul><li>write_merge = 1 :写入合并,提升写磁盘的性能 </li></ul><ul><li>fast_remove = 1 :解除绑定时无需将脏块写入磁盘 </li></ul><ul><li>Percona </li></ul><ul><li>页设置: innodb_page_size=4096 、 innodb_fast_checksum=1 </li></ul><ul><li>刷新策略: innodb_adaptive_checkpoint=3 、 innodb_flush_neighbor_pages=0 </li></ul><ul><li>IO 容量: innodb_io_capacity>10000 </li></ul><ul><li>IO 线程: innodb_read_io_threads = 1 、 innodb_write_io_threads = 16 </li></ul>
    23. 23. Our Solution(4) <ul><li>监控 </li></ul><ul><li>Fusion-IO ( fio-status ): </li></ul><ul><ul><li>Logical bytes written :逻辑写 </li></ul></ul><ul><ul><li>Logical bytes read :逻辑读 </li></ul></ul><ul><ul><li>Physical bytes written :物理写 </li></ul></ul><ul><ul><li>Physical bytes read :物理读 </li></ul></ul><ul><li>Flashcache ( dmsetup status ): </li></ul><ul><ul><li>read hit percent :读命中 </li></ul></ul><ul><ul><li>write hit percent :写命中 </li></ul></ul>
    24. 24. <ul><li>Q&A </li></ul><ul><li>E-Mail: PengLiXun@gmail.com </li></ul>

    ×