Chinaunix首页 | 论坛 | 博客
  • 博客访问: 550116
  • 博文数量: 36
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1749
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-20 16:13
个人简介

中国科学院大学计算机硕士,曾在新浪爱彩数据库组带DBA团队,现居新加坡。wx: lihui_dba

文章分类

全部博文(36)

文章存档

2020年(2)

2019年(3)

2017年(7)

2016年(1)

2015年(7)

2014年(11)

2013年(5)

分类: Mysql/postgreSQL

2013-10-16 10:20:42

背景知识:

1.在计算机系统中,cache几乎无处不在,CPU、LINUX、MYSQL、IO等系统中均能见到cache的身影。Cache是容量与性能之间取平衡的结果,以更低的成本,获得更高的收益。

2.在计算机硬件发展的几十年来,传统的机械硬盘逐步成为整个系统的瓶颈,性能增长十分缓慢。对于依赖IO性能的应用Flash disk(SSD/FusionIO等)的出现,改变了这一切。

  Flash disk将硬盘从机械产品变成了电气产品,功耗更小,性能更好,时延更优。但新的技术还存在一些问题,价格以及稳定性。

前言:

Flashcache是Facebook技术团队的一个开源项目,最初是为加速MySQL设计。Flashcache通过在文件系统(VFS)和设备驱动之间新增了一次缓存层,来实现对热门数据的缓存。

Flashcache在内核的层次:


一般用SSD作为介质的缓存,通过将传统硬盘上的热门数据缓存到SSD上,然后利用SSD优秀的读性能,来加速系统。这个方法较之内存缓存,没有内存快,但是空间可以比内存大很多。

Flashcache最初的实现是write backup机制cache,后来又加入了write through和write around机制:

write backup: 先写入到cahce,然后cache中的脏块会由后台定期刷到持久存储。
 
 write through: 同步写入到cache和持久存储。
 
 write around: 只写入到持久存储。

谁适合用Flashcache
 读多写少。
 高压力备库。
 数据量很大(例如4TB),热门数据也很大(800GB),不必要或者不舍得全部买内存来缓存。

谁不适合用Flashcache
数据量不大的话,一般Flashcache就没什么用武之地了,内存就可以帮你解决问题了。
 另外Flashcache的加入也使得系统的复杂度增加了一层,如果你坚持KISS原则(Keep it simple, Stupid!),也可以弃用之。

基本原理图


安装

1.环境说明:

 使用的是CENTOS5.8的系统
 [root@localhost ~]# cat /etc/issue
 CentOS release 5.8 (Final)
 [root@localhost ~]# uname -a
 Linux localhost 2.6.18-308.el5 #1 SMP Tue Feb 21 20:06:06 EST 2012 x86_64 x86_64 x86_64 GNU/Linux

2.检查依赖的rpm包,一般都已安装

  rpm-build redhat-rpm-config unifdef

3.下载并安装kernel的源码包

 1)下载源码包
 [www@localhost www]$wget  2)安装源码包
 [root@localhost www]# rpm -i kernel-2.6.18-308.el5.src.rpm 
 [root@localhost www]# cd /usr/src/redhat/SPECS/
 [root@localhost www]# rpmbuild -bp --target=`uname -m` kernel.spec 2> prep-err.log | tee prep-out.log
 3)准备模块编译
 [root@localhost SPECS]# cd /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18-308.el5.x86_64/
 [root@localhost linux-2.6.18-308.el5.x86_64]# make oldconfig
 [root@localhost linux-2.6.18-308.el5.x86_64]# make prepare
 [root@localhost linux-2.6.18-308.el5.x86_64]# make modules_prepare

4.编译flashcache

 1)可到github下载  2)安装并加载Flashcache模块
 [root@localhost flashcache-master]# make install
 [root@localhost flashcache-master]# insmod /lib/modules/2.6.18-308.el5/extra/flashcache/flashcache.ko
 [root@localhost flashcache-master]# lsmod |grep flashcache

flashcache配置

1.首次创建Flashcach设备

 请注意,设备上的文件将会被清空
 首先确保hdd的分区没有被挂载,如果挂载了,卸载之
 [root@localhost flashcache-master]# umount /dev/sda5
 [root@localhost flashcache-master]# flashcache_create -p back cachedev /dev/sdb /dev/sda5 
 这样Linux就虚拟除了一个带缓存的块设备:
 [root@localhost flashcache-master]# ls -lah /dev/mapper/cachedev
 [root@localhost mapper]# mkfs.ext3 cachedev 

2.使用该设备

 [root@localhost flashcache-master]# mount /dev/mapper/cachedev /data/

3.如何重建flashcache

 umount /data
 dmsetup remove cachedev
 flashcache_destroy /dev/sdb

4.开机自动加载

 开机加载flashcache模块,把下述脚本放到/etc/sysconfig/modules/目录中并赋可执行权限
 flashcache.modules
 #!/bin/sh
 MODULES="flashcache"
 for i in $MODULES ; do
        modprobe $1 >/dev/null 2>&1
 done
  
 开机加载flashcache盘
 在rc.local里添加
 flashcache_load /dev/sdb
 mount /dev/mapper/cachedev /data

5.查询状态

dmsetup status cachedev
dmsetup table cachedev
dmsetup info cachedev

flashcache内核参数设置

dev.flashcache.fast_remove:删除flashcache卷时不同步脏缓存块。这个选项用来快速删除。
dev.flashcache.zero_stats:统计信息归零。
dev.flashcache.reclaim_policy:缓存回收规则。有两种算法:先进先出FIFO(0),最近最少用LRU(1).默认是FIFO。
dev.flashcache.write_merge:启用写入合并,默认是开启的。
dev.flashcache.dirty_thresh_pct:flachcache尝试保持每个单元的脏块在这个n%以下。设置低增加磁盘写入和降低块重写,但是增加了块读取缓存的可用性。
dev.flashcache.do_sync:调度清除缓存中的所有脏块。
dev.flashcache.stop_sync:停止同步操作。
dev.flashcache.cache_all:全局缓存模式:缓存所有和全部不缓存。默认是缓存所有。
dev.flashcache.fallow_delay:清除脏块的间隔。默认60s。设置为0禁止空闲,彻底清除。
dev.flashcache.io_latency_hist:计算IO等待时间,并绘制直方图。
dev.flashcache.max_clean_ios_set:在清除块时,每单元最大写入出错。
dev.flashcache.max_clean_ios_total:在同步所有块时,最大写入问题。
dev.flashcache.debug:开启debug。
dev.flashcache.do_pid_expiry:在白/黑名单上启用逾期的pid列表。
dev.flashcache.pid_expiry_secs:设置pid白/黑名单的逾期。
dev.flashcache.max_pids:最大数量的pid白/黑名单。

flashcache测试

对比测试性能指标

1.IOPS

2.Latency 系统延迟

3.Throughput 吞吐量

4.TMPC

详细测试分类

1.随机读

2.随机写

3.随机读写

4.顺序写

5.TMPC

测试及监测工具

测试工具:

1.sysbench
2.fio
3.tpcc-mysql

监测工具:

1.flashstat
2.iostat
3.top

硬件:

SSD:Intel SSD DC S3700 Series 100GB
sata硬盘:Hitachi HDT721050SLA360 500GB

sysbench测试

sysbench是一个开源的、模块化的、跨平台的多线程性能测试工具,可以用来进行CPU、内存、磁盘I/O、线程、数据库的性能测试。

目前支持的数据库有MySQL、Oracle和PostgreSQL。

我们选择了mysql数据库常见的随机读写及顺序写的场景来进行测试,以观察flashcache给mysql带来的性能提升。

随机读写测试

吞吐量 每秒请求数
flashcache混合盘 114.91Mb/sec 7354.17
sata硬盘 11.656Mb/sec 745.97

随机写测试

吞吐量 每秒请求数
flashcache混合盘 83.167Mb/sec 5322.69
sata硬盘 4.7246Mb/sec 302.38

随机读测试

吞吐量 每秒请求数
flashcache混合盘 47.037Mb/sec 3010.36
sata硬盘 3.2103Mb/sec 205.46

顺序写测试

吞吐量 每秒请求数
flashcache混合盘 122.37Mb/sec 7831.88
sata硬盘 69.073Mb/sec 4420.64

顺序读测试

吞吐量 每秒请求数
flashcache混合盘 127.52Mb/sec 8161.14
sata硬盘 75.198Mb/sec 4812.69

总结:

随机读写场景下,flashcache带来了10倍的性能提升。

随机写为17倍,随机读14.7倍,顺序写为1.78倍,顺序读为1.7倍。

fio测试

FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,

包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等。

在测试时,我们分别测试了flashcache混合存储和sata硬盘下的随机读写性能,通过观察IOPS、%util等指标来确定flashcache的性能。

%util:     	一秒中有百分之多少的时间用于 I/O 操作

FIO配置参数:

-direct=0  不绕过机器自带的buffer,因为flashcache本身就是一个大的buffer
-bs=16k    单次io的块文件大小为16k,因为innodb的页大小为16K

随机读测试

命令示例:

[root@localhost fio-2.0.7]# fio -filename=/dev/mapper/cachedev -direct=0 -rw=randread -bs=16k -size=5G -numjobs=1 -group_reporting -name=flashcache_1

测试结果:

随机写测试

命令示例:

[root@localhost ~]# fio -filename=/dev/mapper/cachedev -direct=0 -rw=randwrite -bs=16k -size=5G -numjobs=1 -group_reporting -name=flashcache_1

测试结果:

随机读写测试

命令示例:

[root@localhost ~]# fio -filename=/dev/mapper/cachedev -direct=0 -rw=randrw -bs=16k -size=5G -numjobs=1 -group_reporting -name=flashcache_1

测试结果:

  

tpcc-mysql测试

Tpcc-mysql是percona基于tpcc衍生出来的产品,专用于mysql基准测试,其源码放在bazaar(Bazaar是一个分布式的版本控制系统,采用 GPL 许可协议,可运行于 Windows、GNU/Linux、UNIX 以及 Mac OS 系统之上。Bazaar 由 Canonical 公司(Ubuntu母公司)赞助)上,因此还需要先安装bazaar客户端。

命令示例:

[root@localhost tpcc-mysql]# ./tpcc_start -hlocalhost -d tpcc1000 -u root -pxxx -w 10 -c 1 -r 360 -l 360 -f tpcc_mysql_1

测试结果:

思维实验

参考自《高性能mysql(第3版)》

首先,在数据库下层至少有三层存储,即innodb缓冲池、flashcache设备、磁盘。可能还有SAN或RAID控制器缓存。在上层取不到数据时,依次向下层请求。

其次,超大的flashcache缓存也导致系统需要很久的预热,才可能使热点数据均匀分布。

第三,innodb缓冲池未命中时,去flashcache设备上取数据会产生比较复杂的响应时间。

上述这3个条件可能会导致我们的测试结果并不是非常准确。

实验推导:

用闪存设备做flashcache,命中率会远远快于磁盘检索,但flashcache设备比单独使用闪存设备要慢。

实验结论:

1.系统使用flashcahce比不使用的性能要好很多,相对于磁盘可以提供快得多的访问速度。
2.flashcahce也没有命中的请求会落到磁盘上,但磁盘的IOPS有限,因此,整个系统的性能仍然受限于磁盘。

归根结底,flashcache较适合以读为主的IO密集型负载,并且工作集太大,用内存优化并不经济的情况。

需要注意的问题

1.100G SSD + 2T SATA是一个具有现实参考意义的案例。

2.把Mysql的随机读写与顺序读写分离(即把log直接放在后端的磁盘上,而不能放在mapper盘上),这样性能会提高很多。

3.用来跳过顺序IO的一个参数。

 dev.flashcache..skip_seq_thresh_kb 

4.带有flashcache的机器,在关机时需要耗费大量时间整理脏块。

5.服务器掉电有导致分区损坏的可能,且通过fsck无法修复。

参考文献

1.Flachcache初探 

2.Flashcache安装 How-to 

3.Centos安装Flashcache使用SSD缓存[zt] %E5%AE%89%E8%A3%85flashcache%E4%BD%BF%E7%94%A8ssd%E7%BC%93%E5%AD%98zt/

4.深入浅出Flashcache 

5.在CentOS启动时自动加载内核模块 http://easwy.com/blog/archives/auto-load-kernel-module-on-boot-in-centos/

阅读(9275) | 评论(3) | 转发(0) |
1

上一篇:不断执行的kill脚本

下一篇:mysql错误集锦

给主人留下些什么吧!~~

qingshanli19882014-07-30 09:28:51

362931297:请问正常了没,我这里是正常的

可以了,谢谢

回复 | 举报

3629312972013-11-07 14:22:19

qingshanli1988:不错,好像图片不能显示

请问正常了没,我这里是正常的

回复 | 举报

qingshanli19882013-11-05 14:16:02

不错,好像图片不能显示