存储 频道

实测为王!探究SSD固态硬盘性能下降谜题

  创建ext4文件系统

  在研究如何在SSD上创建ext4文件系统时,我发现了ext4主要维护者(Theodore Ts'o)的博客,Theodore Ts'o的博客详细介绍了如何将英特尔SSD格式化成ext4文件系统,第一步是分区,命令如下:

  [root@test64 ~]# fdisk -H 224 -S 56 /dev/sdd

  这里的-H参数指的是“头”数量,-S参数指的是每磁带的扇区数量,fdisk总是把任何硬盘当作旋转机械硬盘对待,因此有些参数对SSD硬盘来说是没有任何意义的,根据Theodore的建议,我使用下面的命令创建了一个ext4文件系统:

  [root@test64 ~]# mke2fs -t ext4 -E stripe-width=32 resize=500G /dev/sdd1

  “stripe-width=32”是Theodore推荐的,据说对性能有帮助,“resize=500G”将文件系统大小限制在500GB以内,因为文件系统超过500GB空间浪费就很大,至于文件系统,当然选择了ext4。

  我从以下三个方面测试了这块SSD:

  1、 吞吐量
  2、 IOPS
  3、 元数据

  第一个测试侧重于SSD的带宽容量,第二个测试侧重于响应I/O请求的速度,第三个测试更侧重于文件系统。测试吞吐量和IOPS我选择了IOzone,测量元数据性能我使用了Metarates。

  IOzone

  IOzone是最流行的吞吐量基准测试工具,部分原因是因为它是开源的,是用很朴实的ANSI C编写的(我没有讽刺它的意思),也许更重要的是它能执行一些不常见的基准测试,它支持单线程,多线程和多客户端测试。IOzone的基本思想是将给定的文件分解成记录,记录以某种方式写入或读取,直到达到文件大小,因此IOzone可以执行许多种类的测试,本文将用到下面这些测试类型:

  

  这是一个相当简单的测试,模拟写入新文件,由于需要为文件创建新的元数据,大多数时候,写入新文件的速度要比重写现有文件要慢,使用指定长度(可由用户指定,也可由IOzone自动指定)的记录写文件,直到达到文件总长度。

  重写

  这个测试和写测试类似,但测试的是已存在文件的写入性能,由于文件已经存在,元数据也就创建好了,因此重写性能普遍要比写入性能要好,它首先打开已存在的文件,将文件指针置于文件的开头,然后使用指定长度的记录写入到打开的文件描述符,直到达到文件的大小,最后关闭文件,更新元数据。

  

  这个测试读取已存在的文件,它读取整个文件,一次一个记录。

  重读

  这个测试读取最近读取过的文件,它非常有用,因为操作系统和文件系统会在缓存中保留最近读取文件的内容,因此重读的性能也要好于读取的性能,但如果文件的大小远远大于缓存,则重读的效果并不佳,因为缓存装不下整个大文件,最终还是要从磁盘上寻找文件对应的存储块。

  随机读

  这个测试随机访问文件中的任意位置,它的性能受多种因素的影响,包括操作系统缓存,磁盘数量和它们的配置,磁盘寻道延迟,磁盘缓存等。

  随机写

  随机写测试是测试随机写入文件任意位置时的性能,文件始终处于打开状态,直到写满文件。

  反向读取

  这是一个特殊的文件系统测试,它反向读取一个文件,如MSC Nastran就会反向读取文件,部分文件系统和操作系统不能检测到这种访问模式,因此也无法提高访问性能,在这个测试中,打开一个文件,文件指针向前移动一个记录,读取文件时就需要向后读取一个记录,然后文件指针又向后移动两个记录,依此类推,完成文件的读取的操作。

  改写记录

  这个测试是测试写和重写文件中的一个特殊点时的性能,这个测试非常有趣,因为它可以突出文件系统和/或操作系统内的“热点”功能,如果热点足够小,可以适应各种缓存大小,如CPU数据缓存,TLB,操作系统缓存,文件系统缓存等,那么性能将会非常好。

  跨越式读取

  这个测试以一种跨越式方法读取一个文件,例如,你可以先零偏移读取长度为4KB的文件内容,然后向前搜索200KB再读取4KB的文件内容,再向前搜索200KB,依此类推,按照相同的跨度向前读取,两次读操作之间的距离(这里是200KB)叫做步幅,如果步幅和RAID条带配置不一致,就容易产生性能问题。

  fwrite

  这个测试是测量使用库函数fwrite()写入文件的性能,fwrite()是一个二进制流函数,一般情况下,它执行的是缓冲区写入操作,缓冲区位于用户空间(不属于系统缓存),这个测试首先在用户空间缓冲区中创建记录长度大小的缓冲区,然后写入到磁盘,重复这个动作,直到整个文件创建好,这个测试和创建一个新文件的写入测试类似,关键还是看元数据的性能。

  frewrite

  这个测试和fwrite类似,但它测试的是库函数frewrite(),理想情况下,它的性能应该比fwrite要好,因为它使用的是现有文件,不用担心元数据性能。

  fread

  这个测试是测量库函数fread()读取文件的性能,它打开一个文件,以记录长度将文件内容读取到用户空间的缓冲区中,重复这个操作,直到整个文件全部读入。

  freread

  这个测试和reread测试类似,但它使用的是fread()库函数,它读取最近打开的文件,因此可以使用文件系统或操作系统的缓冲区提高读取性能。

  虽然还有其它测试选项,但这里列举的已经够多了基本上覆盖了大部分应用程序的访问模式。

  对IOzone来说,系统规格是相当重要的,因为它们会影响到命令行选项,特别是,系统内存容量是很重要的,因为它对缓存效率的影响是很大的,如果问题大小足够小以适应文件系统或操作系统缓存(或部分),结果可能会完全不一样,例如,在只有1GB内存的系统上和在有8GB内存的系统上运行相同大小的问题,其结果会有很大的差异。

  在这篇文章中,缓存的影响是有限的,如果运行非常大的问题,并强制操作系统消除几乎所有缓存,缓存影响是不能完全消除的,减少缓存影响最好的办法是使文件比主内存更大,这里选择的文件大小是16GB,相当于主内存的两倍,我们是根据以往的经验和网上流传的一些说法选择的。

  我们测试了四种记录大小:1MB、4MB、8MB和16MB,总文件大小为16GB,因此分别有16000、4000、2000和1000条记录,执行测试的命令如下:

  ./IOzone -Rb spreadsheet_output_1M.wks -s 16G -r 1M > output_1M.txt
  The command line for the second record size (4MB) is,
  ./IOzone -Rb spreadsheet_output_4M.wks -s 16G -r 4M > output_4M.txt
  The command line for the third record size (8MB) is,
  ./IOzone -Rb spreadsheet_output_8M.wks -s 16G -r 8M > output_8M.txt
  The command line for the fourth record size (16MB) is,
  ./IOzone -Rb spreadsheet_output_16M.wks -s 16G -r 16M > output_16M.txt

0
相关文章