Upcoming SlideShare
×

# MySQL新技术探索与实践

6,550 views

Published on

Published in: Technology
27 Likes
Statistics
Notes
• Full Name
Comment goes here.

Are you sure you want to Yes No
• Woo! nice summary

Are you sure you want to  Yes  No
• 做的很深入，牛B！

Are you sure you want to  Yes  No
Views
Total views
6,550
On SlideShare
0
From Embeds
0
Number of Embeds
1,203
Actions
Shares
0
280
2
Likes
27
Embeds 0
No embeds

No notes for slide
• #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;time.h&gt; #include &lt;math.h&gt; #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&lt;=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&lt;=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*)&amp;x; // get bits for floating VALUE i = 0x5f375a86- (i&gt;&gt;1); // gives initial guess y0 x = *(float*)&amp;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&lt;=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&lt;&lt;&amp;quot;1.PI Test(NULL):&amp;quot;&lt;&lt;timer.get_time()&lt;&lt;endl; timer.begin (); cout&lt;&lt;&amp;quot;\\n2.PI=&amp;quot;&lt;&lt;pi(MAXN)&lt;&lt;endl; timer.end (); cout&lt;&lt;&amp;quot;2.PI Test:&amp;quot;&lt;&lt;timer.get_time()&lt;&lt;endl; timer.begin (); sqrt1(MAXN); timer.end (); cout&lt;&lt;&amp;quot;\\n3.system sqrt Test(NULL):&amp;quot;&lt;&lt;timer.get_time()&lt;&lt;endl; timer.begin (); cout&lt;&lt;&amp;quot;\\n4.sqrt1=&amp;quot;&lt;&lt;sqrt1(MAXN)&lt;&lt;endl; timer.end (); cout&lt;&lt;&amp;quot;4.system sqrt Test:&amp;quot;&lt;&lt;timer.get_time()&lt;&lt;endl; timer.begin (); float s = sqrt3(MAXN); timer.end (); cout&lt;&lt;&amp;quot;\\n5.newton sqrt Test(NULL):&amp;quot;&lt;&lt;timer.get_time()&lt;&lt;endl; timer.begin (); cout&lt;&lt;&amp;quot;\\n6.sqrt2=&amp;quot;&lt;&lt;sqrt3(MAXN)&lt;&lt;endl; timer.end (); cout&lt;&lt;&amp;quot;6.newton sqrt Test:&amp;quot;&lt;&lt;timer.get_time()&lt;&lt;endl; return 0; }
• GCC 编译参数： CC=gcc \\ CXX=gcc \\ CHOST=&amp;quot;x86_64-pc-linux-gnu&amp;quot; \\ CFLAGS=&amp;quot; -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 &amp;quot; \\ CXXFLAGS=&amp;quot;\${CFLAGS}&amp;quot; \\ LDFLAGS=&amp;quot; -ltcmalloc_minimal -lstdc++ &amp;quot; \\ ./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=&amp;quot;-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 &amp;quot; \\ CXXFLAGS=&amp;quot;\${CFLAGS}&amp;quot; \\ CPPFLAGS=&amp;quot; -I/usr/alibaba/icc/include &amp;quot; \\ LDFLAGS=&amp;quot; -L/usr/alibaba/icc/lib/intel64/ -lrt -ltcmalloc_minimal -lstdc++ &amp;quot; \\ ./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>