热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

浅测TokuDB

一.计划:TokuDB文档描述其具备的高insert性能、高压缩比、hotschemachanges等特性较符合日志类项目的应用场景,耳听眼见终是虚,实测是必须的。目前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测速:

[ming.liu@mydbprod52 ~]$ 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(略)

[root@mydbprod52 ~]# /etc/init.d/mysqld start

2. Pecona5.6.22 and TokuDB环境准备

    1). Prerequisites

详见手册9.2.1

安装Jemalloc:

[root@mydbprod52 ~]# wget http://www.canonware.com/download/jemalloc/jemalloc-3.6.0.tar.bz2
[root@mydbprod52 ~]# tar xjf jemalloc-3.6.0.tar.bz2 
[root@mydbprod52 ~]# cd jemalloc-3.6.0
[root@mydbprod52 ~]# ./configure
[root@mydbprod52 ~]# make && make install
[root@mydbprod52 ~]# echo ‘/usr/local/lib‘ > /etc/ld.so.conf.d/local.conf
[root@mydbprod52 ~]# 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(安装部分略)

[root@mydbprod52 ~]# /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

[root@mydbprod52 ~]# 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‘
......

[root@mydbprod52 ~]# 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

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

    3.2) Installing Gnuplot 

[root@mydbprod52 ~]# yum install gnuplot

四. 测试

    4.1) INSERT( innodb单表)测试

        a) 测试脚本

[ming.liu@mydbprod52 ~]$ /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

[ming.liu@mydbprod52 ~]$ 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) 绘图

[ming.liu@mydbprod52 ~]$ 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

[ming.liu@mydbprod52 ~]$ 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

[ming.liu@mydbprod52 ~]$ gnuplot innodb_insert_mygraph

        c) 图示

技术分享

    4.2) INSERT( tokudb单表)测试

        a) 测试脚本

[ming.liu@mydbprod52 ~]$ /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

[ming.liu@mydbprod52 ~]$ 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) 绘图

[ming.liu@mydbprod52 ~]$ 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控制与争用对测试过程的影响。

浅测TokuDB


推荐阅读
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
author-avatar
新野野
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有