浅测TokuDB

一. 计划:

TokuDB文档描述其具备的高insert性能、高压缩比、hot schema changes等特性较符合日志类项目的应用场景,耳听眼见终是虚,实测是必须的。

目前TokuDB仅支持MySQL5.5.x与MariaDB5.5.x,相比较之下Percona的支持要好很多,但仍然需要分开下载进行安装。此次的测试内容:MySQL5.6.22(innoDB) Vs. TokuDB for Percona5.6.22。

1. 软硬件环境信息:

虚拟机 ********
CPU CPUX5660  @ 2.80GHz
逻辑CPU个数 4
内存 4G
系统 Red Hat Enterprise Linux Server release 6.1 (Santiago)
内核 2.6.32-131.0.15.el6.x86_64
IO调度 none
文件系统 ext4

2. Linux下简单的物理IO测速:

[[email protected] ~]$ time dd
if=/dev/zero of=test.dbf bs=8k count=600000 oflag=direct
600000+0 records in
600000+0 records
out
4915200000 bytes
(4.9 GB) copied, 381.327 s, 12.9 MB/s
 
real    6m21.335s
user    0m0.292s
sys     0m12.690s

二.  DB安装

1. MySQL5.6.22环境准备

1). DB Config

innodb_buffer_pool_size = 3000M

2). Installing MySQL(略)

[[email protected] ~]# /etc/init.d/mysqld start

2. Pecona5.6.22 and TokuDB环境准备

1). Prerequisites

详见手册9.2.1

安装Jemalloc:

[[email protected] ~]# wget http://www.canonware.com/download/jemalloc/jemalloc-3.6.0.tar.bz2
[[email protected] ~]# tar xjf jemalloc-3.6.0.tar.bz2 
[[email protected] ~]# cd jemalloc-3.6.0
[[email protected] ~]# ./configure
[[email protected] ~]# make && make install
[[email protected] ~]# echo ‘/usr/local/lib‘ > /etc/ld.so.conf.d/local.conf
[[email protected] ~]# ldconfig

2). DB Config

	tokudb_cache_size = 3G
	tokudb_directio = ON
	tokudb_row_format = tokudb_fast
	tokudb_write_status_frequency = 1
	tokudb_read_status_frequency = 1

3). Installing Percona(安装部分略)

[[email protected] ~]# /etc/init.d/perconad start

4). Installing TokuDB Plugin

mysql> INSTALL PLUGIN TokuDB SONAME ‘ha_tokudb.so‘;
ERROR 1123 (HY000): Can‘t initialize function ‘TokuDB‘; Plugin initialization function failed.

4.1). troubleshooting

[[email protected] ~]# vi data/wifimydb01prod.err 
Version: ‘5.6.22-71.0‘  socket: ‘/tmp/mysql.sock‘  port: 3306  Percona Server (GPL), Release 71.0, Revision 726
Transparent huge pages are enabled, according to /sys/kernel/mm/redhat_transparent_hugepage/enabled
2015-01-22 18:44:50 11824 [ERROR] TokuDB: Huge pages are enabled, disable them before continuing

2015-01-22 18:44:50 11824 [ERROR] ************************************************************
2015-01-22 18:44:50 11824 [ERROR]
2015-01-22 18:44:50 11824 [ERROR]                         @@@@@@@@@@@
2015-01-22 18:44:50 11824 [ERROR]                       @@‘         ‘@@
2015-01-22 18:44:50 11824 [ERROR]                      @@    _     _  @@
2015-01-22 18:44:50 11824 [ERROR]                      |    (.)   (.)  |
2015-01-22 18:44:50 11824 [ERROR]                      |             ` |
2015-01-22 18:44:50 11824 [ERROR]                      |        >    ‘ |
2015-01-22 18:44:50 11824 [ERROR]                      |     .----.    |
2015-01-22 18:44:50 11824 [ERROR]                      ..   |.----.|  ..
2015-01-22 18:44:50 11824 [ERROR]                       ..  ‘      ‘ ..
2015-01-22 18:44:50 11824 [ERROR]                         .._______,.
2015-01-22 18:44:50 11824 [ERROR]
2015-01-22 18:44:50 11824 [ERROR] TokuDB will not run with transparent huge pages enabled.
2015-01-22 18:44:50 11824 [ERROR] Please disable them to continue.
2015-01-22 18:44:50 11824 [ERROR] (echo never > /sys/kernel/mm/transparent_hugepage/enabled)
2015-01-22 18:44:50 11824 [ERROR]
2015-01-22 18:44:50 11824 [ERROR] ************************************************************
2015-01-22 18:44:50 11824 [ERROR] Plugin ‘TokuDB‘ init function returned error.
2015-01-22 18:44:50 11824 [ERROR] Plugin ‘TokuDB‘ registration as a STORAGE ENGINE failed.
2015-01-22 18:44:50 11824 [Note] Shutting down plugin ‘TokuDB‘
......

[[email protected] ~]# vi /etc/rc.local
echo never > /sys/kernel/mm/redhat_transparent_hugepage/defrag
echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled

mysql> INSTALL PLUGIN TokuDB SONAME ‘ha_tokudb.so‘;
Query OK, 0 rows affected (0.12 sec)

mysql> INSTALL PLUGIN tokudb_file_map SONAME ‘ha_tokudb.so‘;
Query OK, 0 rows affected (0.00 sec)

mysql> INSTALL PLUGIN tokudb_fractal_tree_info SONAME ‘ha_tokudb.so‘;
Query OK, 0 rows affected (0.00 sec)

mysql> INSTALL PLUGIN tokudb_fractal_tree_block_map SONAME ‘ha_tokudb.so‘;
Query OK, 0 rows affected (0.00 sec)

mysql> INSTALL PLUGIN tokudb_trx SONAME ‘ha_tokudb.so‘;
Query OK, 0 rows affected (0.00 sec)

mysql> INSTALL PLUGIN tokudb_locks SONAME ‘ha_tokudb.so‘;
Query OK, 0 rows affected (0.00 sec)

mysql> INSTALL PLUGIN tokudb_lock_waits SONAME ‘ha_tokudb.so‘;
Query OK, 0 rows affected (0.00 sec)

mysql> SET GLOBAL default_storage_engine=TokuDB;
Query OK, 0 rows affected (0.00 sec)

三. 基测工具准备

3.1) Installing Sysbench

[[email protected] ~]# git clone https://github.com/zatrazz/sysbench.git
[[email protected] ~]# ./autogen.sh
[[email protected] ~]# ./configure --prefix=/usr/local/sysbench --with-mysql-includes=/usr/local/mysql/include --with-mysql-libs=/usr/local/mysql/lib
[[email protected] ~]# make && make install
[[email protected] ~]$ export LD_LIBRARY_PATH=/usr/local/mysql/lib
[[email protected] ~]$ /usr/local/sysbench/bin/sysbench --help

3.2) Installing Gnuplot

[[email protected] ~]# yum install gnuplot

四. 测试

4.1) INSERT( innodb单表)测试

a) 测试脚本

[[email protected] ~]$ /usr/local/sysbench/bin/sysbench --test=/home/ming.liu/sysbench/sysbench/tests/db/insert.lua --mysql-host=localhost --mysql-port=3306 --mysql-user=ming --mysql-password=ming --mysql-db=sbtest4 --num-threads=1 --oltp-tables-count=1 --mysql-table-engine=innodb --oltp-table-size=100000000 prepare

[[email protected] ~]$ time for i in 1 2 4 8 16 32 64 128; do /usr/local/sysbench/bin/sysbench --test=/home/ming.liu/sysbench/sysbench/tests/db/insert.lua --mysql-table-engine=innodb --mysql-host=localhost --mysql-port=3306 --mysql-user=ming --mysql-password=ming --mysql-db=sbtest4 --oltp_tables_count=1 --oltp-table-size=100000000 --rand-init=on --num-threads=${i} --oltp-read-only=off  --rand-type=uniform --max-time=360 --max-requests=0 --percentile=99 run >> sysbench_test_insert_InnoDB.log ; done

b) 绘图

[[email protected] ~]$ cat sysbench_test_insert_innodb.log | egrep " cat|threads:|read/write requests:" | tr -d "\n" | sed ‘s/Number of threads: /\n/g‘ | sed ‘s/\[/\n/g‘ | sed ‘s/[A-Za-z\/]\{1,\}://g‘| sed ‘s/ \.//g‘ | awk ‘{print $1 $4}‘ | sed ‘s/(/\t/g‘ > sysbench_test_insert_innoDB.csv

[[email protected] ~]$ vi innodb_insert_mygraph
# output as png image
set terminal png
 
# save file to "benchmark.png"
set output "sysbench_test_insert_InnoDB_benchmark.png"
 
# graph title
set title "Benchmark for Sysbench"
 
# aspect ratio for image size
set size 1,1
 
# enable grid on y and x axis
set grid y
set grid x
 
# x-axis label
set xlabel "Threads"
 
# y-axis label
set ylabel "read/write(Insert) per sec."
 
# plot data from sysbench.csv

plot "sysbench_test_insert_innoDB.csv" using (log($1)):2:xtic(1) with linesp notitle

[[email protected] ~]$ gnuplot innodb_insert_mygraph

c) 图示

4.2) INSERT( tokudb单表)测试

a) 测试脚本

[[email protected] ~]$ /usr/local/sysbench/bin/sysbench --test=/home/ming.liu/sysbench/sysbench/tests/db/insert.lua --mysql-host=localhost --mysql-port=3306 --mysql-user=ming --mysql-password=ming --mysql-db=sbtest2 --num-threads=1 --oltp-tables-count=1 --mysql-table-engine=tokudb --oltp-table-size=100000000 prepare

[[email protected] ~]$ time for i in 1 2 4 8 16 32 64 128; do /usr/local/sysbench/bin/sysbench --test=/home/ming.liu/sysbench/sysbench/tests/db/insert.lua --mysql-table-engine=tokudb --mysql-host=localhost --mysql-port=3306 --mysql-user=ming --mysql-password=ming --mysql-db=sbtest2 --oltp_tables_count=1 --oltp-table-size=100000000 --rand-init=on --num-threads=${i} --oltp-read-only=off  --rand-type=uniform --max-time=360 --max-requests=0 --percentile=99 run >> sysbench_test_insert_tokudb.log ; done

b) 绘图

[[email protected] ~]$ vi tokudb_insert_mygraph
# output as png image
set terminal png
 
# save file to "benchmark.png"
set output "sysbench_test_insert_tokuDB_benchmark.png"
 
# graph title
set title "Benchmark for Sysbench"
 
# aspect ratio for image size
set size 1,1
 
# enable grid on y and x axis
set grid y
set grid x
 
# x-axis label
set xlabel "Threads"
 
# y-axis label
set ylabel "read/write(Insert) per sec."
 
# plot data from sysbench.csv

plot "sysbench_test_insert_tokuDB.csv" using (log($1)):2:xtic(1) with linesp notitle

c1) 图示1(参数 tokudb_directio = ON)

c2) 图示2(参数 tokudb_directio = OFF)

5. 测试小结

1. TokuDB在写操作(Insert)的表现优于InnoDB,在并发增长的情况下表现亦优于InnoDB。

2. 在此次实际测试中,InnoDB峰值约为11000 per sec,TokuDB峰值约为15000 per sec,并发超过4以后,性能均有不同程度的下降。

3. 在数据压缩方面,同时生成2千万行数据,TokuDB表大小约为3.1G,InnoDB表大小约为4.8G。这里需说明的是测试中TokuDB所启用的压缩选项为’fast’,而InnoDB未启用压缩。InnoDB也具有压缩功能,只不过压缩行为是TokuDB的默认行为。在本文测试中并未使用InnoDB的压缩格式。

4. 对测试造成的影响的问题因素:1. 共享存储的IO控制与争用对测试过程的影响。

时间: 2024-08-09 01:24:01

浅测TokuDB的相关文章

(八)数组以及排序和查找

JavaSE(八) --数组以及排序和查找 一.数组的定义 三种定义方法: int b[]=new int[5]; Int []b=new int[5]; int[] a=new int[5]; (建议使用这种定义方法) //必须规定数组长度,因为在编译的时候就要分配内存. 我们也可以在定义的时候就初始化数组 Int[] a={1,2,3,3,5}; 这默认了数组a的长度是5. 分配内存详情如下: 开辟一块内存,有5个小块,a指向数组的首地址. int[][] b=new int[5][];  

软测理论——浅谈大型web系统架构

动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应用系统通常与数据库系统.缓存系统.分布式存储系统等密不可分. 大型动态应用系统平台主要是针对于大流量.高并发网站建立的底层系统架构.大型网站的运行需要一个可靠.安全.可扩展.易维护的应用系统平台做为支撑,以保证网站应用的平稳运行. 大型动态应用系统又可分为几个子系统: 1)Web前端系统 2)负载均衡系统 3)数据库集群系

60 | 测试专栏特别放送 | 浅谈全链路压测

原文地址:https://www.cnblogs.com/lmx0621/p/10615035.html

浅谈城市规划在移动GIS方面的应用发展

1.概述 城市建设进程加快,城市规划管理工作日趋繁重,各种来源的数据产生各种层出不穷的问题,严重影响城市规划时的准确性,为此全面合理的掌握好各方面的城市规划资料才能做出更加科学的决策.移动端的兴起为规划动态方面提供了极大的便利,各类以无线终端.智能设备.网络通信和移动GIS核心技术的深入发展,可以为规划人员和决策者提供在线离线.定位实时.现状历史等方面分析服务,从而提高城乡规划工作效率. 2.移动GIS技术选型 从目前移动设备发展的情况来看,有Apple.三星.国内手机产品.平板:从操作系统上看

浅谈用ModelSim+Synplify+Quartus来实现Altera FPGA的仿真

浅谈用ModelSim+Synplify+Quartus来实现Altera FPGA的仿真 工作内容: Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合仿真的仿真器.它采用直接优化的编译技术.Tcl/Tk技术.和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核,个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件. Synplify.S

浅谈 产品经理、研发、测试,三个冤家如何高效沟通

浅谈 产品经理.研发.测试,三个冤家的那点事(1) 算上实习时间,参加工作已经五年了,一直在从事软件开发和测试的工作,期间也兼职干过一部分产品经理的事情,对这三者之间的微妙关系,颇有感悟. 1. 先来解读一下这三个岗位的"痛点" 聚会的时候,经常碰到以下几种情况,事后想起来,经常会有逗乐的感脚. 做开发的GG们是这样的: 一聊到自己的项目,两眼开始冒光,同时开启了狂喷模式,blabla一堆高大上的专业术语,一方面骂测试人员不懂技术,提的bug根本就不是关键问题,高级的bug他们根本就发

单元测试之覆盖率浅谈

一.什么是代码覆盖率 代码覆盖是软件测试中的一种度量,描述程式中源代码被测试的比例和程度,所得比例称为代码覆盖率.一般我们用工具做的代码覆盖率的计算方法是: 代码覆盖率 = 被测代码行数 / 参测代码总行数 * 100% 二.度量方式 代码覆盖程度的度量方式是有很多种的,这里介绍一下最常用的几种: 1. 语句覆盖/行覆盖(StatementCoverage) 这是一种较为常用且具有代表性的指标,度量的是被测代码中所有语句是否被执行到. 2.判定覆盖(DecisionCoverage) 度量程序中

浅谈探索性测试

今天学习时看了一篇谈探索性测试的文章.有一点感触. 探索性测试如果在测试策略层面应该和应变式的测试策略相符合. 暂且不谈探索性测试的方法以及那些利弊. 只是简单的打个比喻,反应一下我对探索性测试的认知. 农村的孩子以前都放农忙假,要求学生去拾麦穗(好像语文课本里还有相关内容,叫颗粒归仓). 探索性测试就像捡麦穗,刚割完的麦子,确实能捡到不少丢的麦穗. 但是都捡过一遍甚至几遍了,再去捡,就捡的少了. 我们平时做探索性测试的关键也在此,只做一遍. 探索这个词是最能反映人类智慧的词,很费脑细胞,不要把

浅谈双线程dp (nyoj61 nyoj712)经典【传字条】和【探 寻 宝 藏】

浅谈双线程dp 先看问题: 传纸条(一) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以通过传纸条来进行交流.纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n).从小渊传到小轩的纸条只可以向下或者向右传递,从小轩