SSD原理及写放大
固态硬盘(Solid State Disk、Solid State Drive,简称SSD)是一种以存储器Flash作为永久性存储器的存储设备。固态盘常见接口有SATA及PCI-Express接口的加速卡。
1. SLC、MLC、TLC闪存区别
Flash的最小存储单元是晶浮栅晶体管,固态盘中,在存储单元晶体管的栅(Gate)中,注入不同数量的电子,通过改变栅的导电性能,改变晶体管的导通效果,实现对不同状态的记录和识别。
能读写两种状态的晶体管的Flash的存储单元称为单层式存储(SLC),能读写四种状态的晶体管的Flash的存储单元称为多层式存储MLC,能读写六种状态的晶体管的Flash的存储单元称为三层式存储TLC。TLC也称作3-bit MLC。SLC、MLC及TLC的读写速度依序从快至慢(约4:2:1),使用寿命依序从长至短(约6:3:2),成本依序从高至低,需要纠错比特数(ECC)则是相反地从低至高(同一制程下1:2:4。不过ECC也受制程的影响,同一种芯片,越小尺度的制程需要越多的纠错比特)。SLC的状态简单,所以读取很容易,MLC有多种状态,读取时,容易出错,需要校验,速度相对较慢。实际MLC的状态识别过程比上述复杂很多,读取一次MLC的功耗比SLC大很多。由于材料本身的缘故,SLC可以接受10万次级的擦写,而MLC材料只能接受万次级擦写操作,所以MLC的寿命比SLC少很多。但是,也是最重要的,由于MLC中的信息量大,同一个存储单元,信息量是SLC的N倍,所以相同容量的磁盘,MLC类型Flach成本更低,存储单元体积更小,这也导致市面上多数固态盘都采用了MLC型的Flash颗粒。SLC由于其特性,仅在高端的高速存储设备中使用。目前固态硬盘的主流从SLC芯片转到MLC芯片。
Flash颗粒是大量浮栅晶体管的阵列,一般的U盘中会有1-2粒Flash颗粒,视容量而定;在SSD硬盘中,常见会有更多粒Flash颗粒,并且Flash颗粒可以同时进行读写,所以一般固态硬盘的容量越大,Flash的颗粒也就越多,性能也就越好。
2.SSD的写放大
SSD的硬盘有page和block的概念。Page大小为4K,Block大小为512K(即128个Block)。
SSD一次写的单位是page即512K,为什么不像磁盘一样,每次写一个比特呢,主要原因是为了防止电子干扰,保证数据的稳定和准确。
写的时候,SSD的Write只能写到空的page上,对于之前写过的page,必须先进行一次Erase。而Erase的单位是Block,所以如果一个page的数据删掉之后,要想再写到这个page上,必须经过以下三步:
(1)将在同一个Block的其他Page读出来。
(2)将整个Block 擦除。
(3)将整个Block的数据写下去。
因为一个写动作要操作三次,严重降低了效率,这个过程叫做SSD的写放大,也叫写惩罚。
解决写放大主要有两个方案:
(1)预留空间
一般固态硬盘上都有一块保留空间,消费机级的SSD在7-10%,企业级的SSD保留空间在20%以上,甚至有些产品有100%的保留空间。使用保留空间的好处是,随时都能保证有未使用的空间,减少写放大,SSD的芯片在空闲的时候,再对删除的块进行清除。所以写入频繁的时候,保留空间越多的SSD性能越好。
(2)使用Trim
TRIM是现在公认的解决写放大的比较好的方案。TRIM位于操作系统层。操作系统使用TRIM命令来通知SSD某个page的数据不需要了,可以回收了。
支持TRIM的操作系统和以往的主要区别是删除一个Page的操作不同。在磁盘时期,删除一个page,之后在文件系统的记录信息里将该page的标志位设置为可用,但是并没有将数据删除。使用SSD且支持TRIM的操作系统,在删除一个page时,会同时通知SSD这个page的数据不需要了,SSD内部有一个空闲时刻的垃圾收集进程,在空闲时刻SSD会将一些空闲的数据集中到一起,然后一起Erase。这样每次写操作,就在已经Erase好了的Page上写入新的数据。越是新的操作系统对Trim特性支持的越好。
SSD在KVM中的使用,性能测试环境
(1)硬件
测试服务器一
HP DL380G7 内存24G CPU Intel(R) Xeon(R) E5620 @ 2.40GHz
Intel 320 160G *8 RAID 10
测试服务器二
联想 510G7 内存8G CPU Intel(R) Xeon(R) E5506 @ 2.13GHz
Intel 320 300G *2 RAID 1
测试服务器三
HP DL380G6 内存16G CPU Intel(R) Xeon(R) E5520 @ 2.27GHz
Intel 320 160G *4 RAID 10
(2)软件
宿主机系统:centos 6.x
测试工具:所有linux系统使用fio ,所有windows 系统使用iometer
(3)测试准备工作
为保证测试准确性,做了以下工作:
1)关闭所有测试服务器的lvm缓存
Vim /etc/lvm/lvm.conf
write_cache_state = 0
sed -i s/write_cache_state\ =\ 1/write_cache_state\ =\ 0/g /etc/lvm/lvm.conf
rm /etc/lvm/cache/* -rf
2)拔掉所有测试服务器的RAID卡电池
3)修改内核的缓存机制,定时清空缓存
编辑crontab ,每分钟执行以下命令:
echo 3 >> /proc/sys/vm/drop_caches
echo 1 > /proc/SCSI/sg/allow_dio
4)因为SSD有写放大问题,先将SSD写满,在进行测试,所有SSD测试前,先使用脚本反复写满数据10次。
for (( i=0; i<10; i++))
{
echo $i;
dd if=/dev/zero of=/dev/datavg/sdc1 bs=10M;
}
2.测试结果
(1)物理机上5种使用方式最大性能测试

(2)不同系统的虚拟机性能测试对比
1)Hp 服务器4 块160GB硬盘 RAID 10 虚拟机测试

2)联想 2 块 RAID 1 虚拟机测试

(3)分布式文件系统上虚拟机测试性能测试
初步测试了使用SSD搭建GlusterFS和DRBD两种分布式文件系统.

3.测试结论
综合上面的测试结果,可以得出以下结论:
* 使用ssd在读方面可以达到数万以上的iops,在写方面可以达到数千左右的iops,相对机械硬盘有很大的优势;
* 在kvm虚拟化中,为了充分发挥ssd性能,虚拟机磁盘,应该使用裸设备映射,而不是qcow2的文件系统。
Flashcache介绍
Flashcache是一款针对Linux系统的块设备缓存的工具,可以编译为内核模块,使用DeviceMapper实现。原理是用高速设备做缓存,把数据先缓存到高速设备上,到一点阀值,在写到低速设备上。因为高速设备一般比较昂贵,Flashcache目标是综合高速设备和低速设备的优势
Flashcache支持writeback,、writethrough、writearound、Writeonly四种缓存方式。
(1)Flashcache 缓存方式
Writethrough 是一种比较安全的方式,所有的写操作写到ssd并且立即写到机械硬盘,所有的读操作都被缓存。
(2)Writearound缓存方式
是一种非常安全的方式,数据不写到ssd,直接写到机械硬盘,所有的读都被缓存。
(3)Writeback缓存方式
Writeback 速度快,但是牺牲掉一定的安全,数据只写到ssd,并按照一定的策略刷到到机械硬盘,所有的读都被缓存。
(4)Writeonly缓存方式
Writeback的一个变种,只缓存写,读不缓存。
Writethrough 和 Writearound 缓存方式不受设备移除或者重启影响。Writeback缓存会被设备移除或者重启影响。
Flashcache安装与使用
(1)安装
Flashcache官方网址为https://github.com/facebook/flashcache。安装方式如下:
wgethttps://github.com/facebook/flashcache/archive/master.zip
cd flashcache-master/
cd src/
make
(2)使用
flashcache_命令主要有以下几个:
qflashcache_create,创建一个新的flashcache卷
qflashcache_destroy,删除flashcache卷
qflashcache_load,加载flashcache卷
Flashcache性能测试
测试环境
硬件:
测试服务器
联想 510G7 内存8G CPU Intel(R) Xeon(R) E5506 @ 2.13GHz
Sas 146*3 RAID0
Intel ssd 3700 200G *1 RAID 0
软件:
宿主机系统:centos 6.3 内核版本2.6.32-279.22.1.el6.x86_64
测试工具 所有linux系统使用fio ,所有windows 系统使用iometer
配置
用sdc 做sdb的缓存:
# flashcache_create -p back cachedev /dev/sdc /dev/sdb
cachedev cachedev, ssd_devname /dev/sdc, disk_devname /dev/sdb cache mode WRITE_BACK
block_size 8, md_block_size 8, cache_size 0
Flashcache metadata will use 1192MB of your 24016MB main memory
查看运行状态:
flashstat
======================================================================================================
Flashstat: a tool for flashcache status per second
Author : NinGoo(seaman.ning@gmail.com)
Version : 0.3
======================================================================================================
SSD Device: /dev/sdc Disk Device: /dev/sdb Cache Mode: WRITE_BACK
Capacity: 303998M Block Size: 4K Meta Block Size: 4096b
Total Blocks: 77823488 Cached Blocks: 9 Cached Percent: 0
Set Numbers: 512 Dirty Blocks: 0 Dirty Percent: 0
cache_all: 1 reclaim_policy: FIFO dirty_thresh_pct: 20
max_clean_ios_set: 2 max_clean_ios_total: 4 skip_seq_thresh: 0K
time read/s write/s diskr/s diskw/s ssdr/s ssdw/s uread/s uwrit/s metaw/s clean/s repl/s wrepl/s hit% whit% dwhit%
03-13 14:51:20 0 0 0 0 0 0 0 0 0 0 0 0 0|10 0|0 0|0
fdisk -l /dev/mapper/cachedev 可以看到一个设备:
Disk /dev/mapper/cachedev: 146.8 GB, 146778685440 bytes
255 heads, 63 sectors/track, 17844 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0002da0a
使用
可以当一个块设备来使用,划分pv、vg、lv
# pvcreate /dev/mapper/cachedev
Physical volume "/dev/mapper/cachedev" successfully created
# vgcreate ssdcachetest /dev/mapper/cachedev
Volume group "ssdcachetest" successfully created
# lvcreate -L 100G -n ssdcache_test_lv1 ssdcachetest
Logical volume "ssdcache_test_lv1" created
删除
dmsetup remove cachedev
flashcache_destroy /dev/sdc
测试结果
Sas 146G *3 raid0 Ssd 200G*1 raid0 flashcache
4K随机读 1751 89572 24517
4K随机写 297 22775 5742
1M随机读 121 192 165
1M随机写 21 133 117
Hp 4 块 raid 10 虚拟机测试
Win03 Win08 Centos5.6 Centos6.2
4k随机读 5709 6692 12945 12030
4k随机写 3176 4414 1910 2497
Lv 4k随机读 40 42 51 59
Lv 4k随机写 54 65 35 51
测试结论
使用flashcache在读写方面可以达到数千的iops,是一种性价比比较高的ssd和机械硬盘组合的方式;
在kvm虚拟化中,为了充分发挥flashcache性能,虚拟机磁盘,应该使用裸设备映射,而不是qcow2的文件系统。
DM-cache配置与性能测试
DM-cache介绍和使用
DM-cache是一个 device-mapper级别的用高速存储设备做低速存储设备缓存的解决方案,主要应用就是用ssd做机械硬盘的缓存,达到的性能和容量之间的平衡。
DM-cache主要的创建步骤如下:
测试环境中/dev/sdd为SSD硬盘,300GB,/dev/sdb为SAS硬盘,600GB。
1先确定要使用的SSD缓存的大小:
使用blockdev --getsize64命令:
blockdev --getsize64 /dev/sdd
300035497984
假设要将sdd全部用作缓存,sdd是300G,通过命令取得的大小是300035497984字节。
2 确定metadata的大小
metadata的大小的计算公式是:4 MB + ( 16 bytes * nr_blocks )
nr_blocks就是设备块数量
默认缓存的块大小是256KB,即262144字节,那么元数据大小计算方法是:
4194304 + (16*300035497984/262144)=22507017.5
换算成扇区:
22507017.5/512=43959.0185546875
近似等于43960
3创建matadata分区
dmsetup create ssd-metadata --table '0 43960linear /dev/sdd 0'
dd if=/dev/zero of=/dev/mapper/ssd-metadata
4计算剩余的扇区
300035497984/512-43960=585962872
5创建ssd缓存设备
使用元数据剩余的空间
dmsetup create ssd-blocks --table '0 585962872 linear /dev/sdd 43960'
6确定低速设备的扇区数
blockdev --getsz /dev/sasvg/saslv1
629145600
7创建缓存设备,并且是256kb的缓存块大小
dmsetup create home-cached --table '0 629145600 cache /dev/mapper/ssd-metadata /dev/mapper/ssd-blocks /dev/sasvg/saslv1 512 1 writeback default 0'
8校验设备
ls -l /dev/mapper/home-cached
lrwxrwxrwx 1 root root 7 Jan 6 00:52 /dev/mapper/home-cached -> ../dm-8
dmsetup status /dev/mapper/home-cached
0 629145600 cache 8 2272/5495 512 4/1144458 72 19 0 0 0 4 0 1 writeback 2 migration_threshold 2048 mq 10 random_threshold 4 sequential_threshold 512 discard_promote_adjustment 1 read_promote_adjustment 4 write_promote_adjustment 8
9使用设备
mkdir /cache
mkfs.ext4 /dev/mapper/home-cached
mount /dev/mapper/home-cached /cache
df -h
/dev/mapper/home-cached 296G 65M 281G 1% /cache
10删除设备
umount /dev/mapper/home-cached
dmsetup table home-cached
0 1048576000 cache 252:3 252:4 252:0 512 1 writeback default 0
dmsetup table home-cached
0 629145600 cache 253:6 253:7 253:3 512 1 writeback default 0