中国科学院大学计算机硕士,曾在新浪爱彩数据库组带DBA团队,现居新加坡。wx: lihui_dba
分类: 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最初的实现是write backup机制cache,后来又加入了write through和write around机制:
write backup: 先写入到cahce,然后cache中的脏块会由后台定期刷到持久存储。 write through: 同步写入到cache和持久存储。 write around: 只写入到持久存储。
读多写少。 高压力备库。 数据量很大(例如4TB),热门数据也很大(800GB),不必要或者不舍得全部买内存来缓存。
数据量不大的话,一般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
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
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白/黑名单。
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是一个开源的、模块化的、跨平台的多线程性能测试工具,可以用来进行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是测试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是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无法修复。
3.Centos安装Flashcache使用SSD缓存[zt] %E5%AE%89%E8%A3%85flashcache%E4%BD%BF%E7%94%A8ssd%E7%BC%93%E5%AD%98zt/
5.在CentOS启动时自动加载内核模块 http://easwy.com/blog/archives/auto-load-kernel-module-on-boot-in-centos/