我们知道intel MLC SSD硬盘随着使用会产生很碎片,随着碎片的增加性能会大大降低。intel的工程师介绍可以使用HPA技术保留一部分空间给SSD硬盘内部使用,这样可以有效的降低碎片。
先介绍一下什么是HPA:
HPA是"host protected area"的缩写,通俗的理解就是设置读取的硬盘最大的扇区号,从而把高端的内容隐藏起来,这个最大的扇区号能够写在硬盘的某个地方,因此即使你把这个硬盘挂到其它机器上,正常情况下你也看不到隐藏的内容,fdisk,pqmaigc之类的工具也把这个硬盘当做一个稍小容量的硬盘。HPA是ATA的标准,ATA-4就包含了HPA,这个标准需要在HDD的 Firmware支持的。
在Linux下使用新版本的hdparm工具可以设置HPA,Rhel5.X下自带的hdparm工具版本太低了,不能设置HPA。可以从sourceforge网站上下载hdparm工具: http://sourceforge.net/projects/hdparm/ ,我下载的版本是hdparm-9.27.tar.gz,下载后放在/usr/src目录下:
#cd /usr/src
#tar zxvf hdparm-9.27.tar.gz
#cd hdparm-9.27
#make
#make install
这样就安装好了新版本的hdparm,
检查hdparm的版本是否是新版本:
#hdparm -V
hdparm v9.27
注意设置HPA会导致硬盘上原先的数据被破坏。
查看HPA的设置:
#hdparm -N /dev/sdh
/dev/sdh:
max sectors = 312581808/312581808, HPA is disabled
可以看到HPA是关闭的。
设置HPA,160G的SSD盘按2^30bytes/GB的话,大小为149GB,我们的的硬盘大小设置为120GB,留29GB给内部使用。
注意:设置HPA时必须保证硬盘没有被使用,同时设置完HPA后需要重新启动机器才能生效。如果设置完后,又需要重新设置HPA,需要把硬盘断电后,再设置,否能可能会设置失败。
#hdparm -N p251658240 /dev/sdh
/dev/sdh:
setting max visible sectors to 251658240 (permanent)
Use of -Nnnnnn is VERY DANGEROUS.
You have requested reducing the apparent size of the drive.
This is a BAD idea, and can easily destroy all of the drive's contents.
Please supply the --yes-i-know-what-i-am-doing flag if you really want this.
Program aborted.
由于这个操作是会导致盘上的数据全部丢失,所以hdparm会警告你,需要加 --yes-i-know-what-i-am-doing ,才会真正设置HPA。
#hdparm -N p251658240 --yes-i-know-what-i-am-doing /dev/sdh
命令中的pNNNNNNN中的P表明是持久化设置。
重新启动Linux。
检查设置是否成功:
#hdparm -N /dev/sdh
/dev/sdh:
max sectors = 251658240/312581808, HPA is enabled
#blockdev --getsize /dev/sdh
251658240
blockdev返回的大小应是设置后的大小。
我测试的160G的intel MLC SSD硬盘的型号为SSDSA2M160,firmware版本为: 02G9,通过设置HPA后,对硬盘进行十几个小时后的8k大小的随机写后得到的硬盘的写IOPS如下:
硬盘的大小 |
149G |
140G |
130G |
120G |
110G |
100G |
90G |
硬盘的写IOPS |
310 |
350 |
850 |
2400 |
2700 |
3050 |
4100 |
注:上表中的容量G是按2^30次方为1G,所以160G的硬盘,实际上是149G大小。