I / O性能基准testingLinux

刚刚用iSCSIbuild立了一个可怜的SAN,并想对其进行基准testing。 Linux的一些很好的I / O性能基准除了:

hdparm -tT /dev/sda1 

如何获得IOPS测量?

谢谢。

我build议使用Bonnie ++进行磁盘性能testing。 这是专门做这样的事情。

至less在Linux上,所有合成基准testing的答案都应该提到fio–它确实是一款瑞士军刀I / O生成器。

简要概述其function:

  • 它可以生成设备或文件的I / O
  • 使用多种不同的方法提交I / O
    • 同步,psync,vsync
    • Native / posix aio,mmap,splice
  • 将I / O排队到指定的深度
  • 指定大小的I / O被提交
  • 指定I / Otypes
    • 顺序/随机
      • 如果I / O是随机的,你可以指定你想要偏移的分布,使其更加真实
    • 读/写或两者的混合物
    • blktracelogging的I / O可以重播

它给你的统计数据涵盖

  • MBytes生成的I / O量
  • 平均带宽
  • 提交/完成延迟与最小值,最大值,平均值和标准偏差
  • IOPS
  • 平均队列深度

function和输出列表继续。

它不会生成一个统一的数字来代表最后的所有内容,但是如果您认真理解存储性能,您将知道单个数字无法解释所有需要了解的内容。 即使Linus Torvalds认为fio是好的:

[J]和Jens的FIO代码。 它做的事情是正确的[…]还有其他的东西是可疑的 – 忘记邦妮或其他传统工具。

我可以build议你阅读这两篇文章/文章:

http://www.linuxinsight.com/how_fast_is_your_disk.html http://www.linuxforums.org/forum/red-hat-fedora-linux/153927-iscsi-raid1-lvm-setup-poor-write-performance.html

尤其是:

首先,我build议你使用更精确和可控的工具来testing性能。 hdparm被devise来改变IDE设备参数,它的testing是相当基本的。 在LVM和iSCSI的复合设备上使用hdparm时,您也无法知道发生了什么事情。 此外,hdparm不会testing写入速度,这与读取速度无关,因为两者(写回caching,预读取和预取algorithm等)都有不同的优化。

我更喜欢使用old&good dd命令,它允许您精确控制块大小,testing的长度和缓冲区caching的使用。 它也给你一个很好的简短的传输速度报告。 您也可以selecttesting缓冲区caching的性能。

另外,要意识到这里涉及到几个层,包括文件系统。 hdparm只能testing对RAW设备的访问权限。

testing命令我build议使用以下命令进行testing:

a)对于原始设备,分区,LVM卷,软件RAID,iSCSI LUN(启动器端)。 为了testing大多数现代设备的批量传输速度,1M的块大小是可以的。 对于TPStesting,请使用像4k这样的小尺寸。 改变计数做一个更现实的testing(我build议长时间的testing来testing持续的速率以防止短暂的干扰)。 “odirect”标志避免了使用缓冲区caching,所以testing结果应该是可重复的。

读testing:dd if = / dev / zero of = / dev / bs = 1M count = 1024 oflag = direct写testing:dd if = / dev / of = / dev / null bs = 1M count = 1024 iflag = direct

具有512x1M块的dd示例输出:复制536870912字节(537 MB),10.1154秒,53.1 MB /秒

写testing是破坏性的!!!!!! 您应该在设备上创build文件系统之前执行此操作! 在原始设备上,请注意分区表将被删除。 您应该强制内核重读该案例中的分区表,以避免出现问题(使用fdisk)。 但是,整个设备和单个分区上的性能应该是相同的。

b)对于文件系统,只需将设备更改为挂载点下的文件名即可。 读取testing:dd if = / dev / zero of = / mount-point / test.dat bs = 1M count = 1024 oflag = direct写入testing:dd if = / mount-point / test.dat of = / dev / null bs = 1M计数= 1024 iflag =直接

请注意,即使访问文件,我们也不使用缓冲区caching。

c)对于networking,只需在服务器之间双向testing原始TCP套接字。 小心防火墙阻止TCP端口5001。

server1#dd if = / dev / zero bs = 1M count = 1024 | netcat 5001 server2#netcat -l -p 5001 | dd = / dev / null

testing层现在您有一个工具来testing每个层的磁盘性能。 只要按照这个顺序:

a)testingiSCSI服务器上的本地磁盘性能。 b)testingiSCSI目标和启动器之间的networkingTCP性能。 c)在iSCSI启动器上testingiSCSI LUN上的磁盘性能(这是iSCSI协议的最终原始性能)。 d)在LVM逻辑卷上testing性能。 e)testing文件系统上的大文件的性能。

负责丢失的层和下一层之间应该有较大的性能差距。 但我不认为这是LVM。 我怀疑文件系统层。

现在可能的问题的一些提示:

a)您没有描述是否在iSCSI LUN上定义了剥离的LVM卷。 如果在iSCSI目标上使用同步写入,剥离可能会造成瓶颈(请参阅下文中的问题)。 请记住,默认的iSCSI目标行为是同步写入(无RAM高速caching)。 b)您没有描述文件的访问模式: – 大量数据的连续传输(100 MB)? – 小块随机访问的序列? – 很多小文件?

我可能是错的,但我怀疑你的系统可能正在遭受“ATIME”问题的影响。 “atime”问题是由于人们渴望参与不熟悉devise决策的性能和含义的操作系统的devise,而在过去几年中遭受的“Linux内核devise的原始思想”的后果。

只是在几个字。 近40年来,UNIX每次对其文件执行单个读/写操作时,UNIX都更新了inode的“上次访问时间”。 缓冲区caching保存一段时间不传播到磁盘的数据更新。 但是,在Linuxdevise中,inode的ATIME的每次更新都必须同步更新,并立即更新到磁盘。 只要意识到交错同步的影响。 在iSCSI协议之上传输操作stream。

要检查这是否适用,只要做这个testing: – 阅读一个长文件(至less30秒),而不使用caching。 当然用dd! – 同时,用“iostat -k 5”监视I / O。

如果您在读取数据的同时观察到一小段连续的写操作,则可能是inode更新。

解决scheme:对于Linux来说,事情变得如此怪异,以至于他们已经为某些文件系统(XFS,EXT3等)添加了一个挂载选项来禁止更新atime。 当然,这使得文件系统的语义不同于POSIX标准。 一些应用程序观察上次访问文件的时间可能会失败(主要是电子邮件阅读器和服务器,如松,榆树,赛勒斯等)。 只需使用“noatime,nodiratime”选项重新安装文件系统即可。 最近的分布还有一个“norelatime”,可以减lessinode的“atime”过时。

请记下这些testing的结果和调查结果。

这取决于磁盘的用途。 最快和最简单的方法是“DD”提到,但我会另外build议iozone猎户座

  1. 在我看来, IOzone在文件系统基准testing中比bonnie ++更为精确
  2. Orion(Oracle提供的“ORacle IO Numbers”)具有很高的可扩展性,即使是非常大的/强大的存储也可以正确地进行基准testing,而且我发现它在扩展数据库存储方面非常有用。 (我收集来自不同磁盘arrays,磁盘控制器和RAIDconfiguration的orion的结果,然后将它们组装起来)

磁盘基准testing:

 $ dd if=/dev/zero of=/tmp/zero bs=1k count=100k 

networking基准testing:

 $ yes | pv | ssh $host "cat > /dev/null" 

除了其他的,你也可以使用邮戳基准