• 0
  • 0
分享
  • 测试技术分享:存储性能测试漫谈——软件测试圈
  • 恬恬圈 2023-11-08 13:50:55 字数 2294 阅读 1131 收藏 0

  对于存储性能测试,一般有两种方法:

  1. 使用业内比较认可的性能测试工具,比如IOMeter、fio、iozone等。这类工具一般是开源的,应用范围很广泛,使用它们的一个好处是可以快速和其他存储产品做横向对比。哪怕大家是在不同时间、不同地点、不同环境测试的,但只要参数设置差不多,就可以拿来简单对比(如果要做完整对比,必须放在同样的环境中测试)。不足之处是它们只能按照预定义的模式机械测试,大多数情况下无法真实反应实际应用环境的IO模式。

  2. 直接在真实的应用环境中进行性能测试。这种方法测出来的结果,针对特定的场景,具有权威的参考性。不足之处就是搭建环境可能比较麻烦,每个应用的依赖环境都不一样。即使是同样的存储设备,在不同的应用场景,其性能差异也很大。所以这种方法能反应存储产品在特定场景下的实际性能,但有时候并不能确定存储产品的普遍性能。

  使用同样的存储设备,同样的硬盘,当如下条件变化时,性能差异可能会很明显。

  1. 读和写。理论上,机械硬盘的顺序读写性能差不多。但在不同的场景,同样硬盘的读写性能是有差异的。因为写数据的时候,缓存的作用更大,所以写的性能可能更好。但如果使用RAID5,因为写数据有写惩罚,所以在其他条件相同时,读的话性能更好。SSD的读写参数天生就不一样,因为写数据会引起块擦除,所以往往读更快,尤其是随机读。

  2. 顺序IO和随机IO。对于机械硬盘,毫无疑问,顺序读写比随机读写快很多,因为顺序读写少了很多寻道时间,其速度比随机读写高出1到2个数量级。所以,传统的存储需要使用缓存算法(包括按扇区地址的排序以及预读等)来减少寻道时间,提高性能。对于SSD,顺序读写和随机读写差别不是那么大,但是顺序读写一般来说会比随机读写快。实际应用中,纯随机读写很少,即使在文件系统中拷贝大文件,也有一些相对随机的操作,比如修改元数据,跳过一些被占用的扇区等。所以,如何模拟应用程序的随机度,是一个比较头疼的问题。

  3. 块大小(block size)。如果单次IO写入的数据块比较大,比如超过了1MB,性能显然比较好。即使是机械硬盘纯随机写入1MB也如此——单个数据块往往是一次性提交给驱动的,每个块内部的数据一般也是连续的。每秒只需要少量的IO能过去,就能获得较大的带宽,因为带宽=IO大小*IO数,IO数虽然不多,但IO平均大小较大。但也有例外。如果把块大小设置成很大(比如1GB),在系统里面肯定会被拆分成较小的IO发下去,所以性能不会有进一步改善,在应用程序不够完善时反而会导致额外的问题(比如直接就给分配了1GB的内存导致内存有可能不足)。即使前面说的1MB的IO,在很多系统中,也可能会被拆分成2个或者几个IO发下去。如果是顺序读写,4KB的小IO,在操作系统内部也可能会被合并成大的IO,所以这种情况下,性能不会太差,但合并IO等步骤本身需要消耗资源,所以性能也不会太好。需要注意的是,有些时候,评判性能标准不是按读写带宽来看,而是按照每秒的IO数(IOPS)来看。显然,块大小的设置就比较难提高IOPS的值了。

  4. 缓存的影响。当读写缓存比较大时,性能显然会好一些。尤其是进行随机写测试,在写缓存比较大时,刚开始的性能值会非常大(其实就是写到内存的速度),到后来一下子降下来。因此,为了避开缓存的的影响,有时候需要测试direct IO。但在大多数应用场景下,缓存都是需要使用的,我们得了解在缓存起作用的情况下的性能,同时又要跳开刚开始测试阶段的不稳定性能值,那我们可以设置相应的时间参数,不把最开始的一段时间的性能值统计进去。IOMeter的Ramp Up Time就是为这个准备的。有人拿同样的配置测试随机读写,两次测出的值大不一样,其原因就有可能是没有把这个原因考虑进去。即使设置了Ramp Up Time,但其值太小,在缓存还没有写满的时候其时间就到了,也会统计得不准确。

  5. 同步IO和异步IO。同步IO是发一个IO,等确认完成之后,再发下一个IO。这是一个串行的过程。异步IO是发了一个IO,还没有完成,就发下一个IO,IO的处理过程是异步的。显然,异步IO的性能一般会好一些。IOMeter和fio等都能对它们进行测试。IOMeter有一个“# of Outstanding I/Os”的参数,用于设置可以同时发的异步IO的个数。如果要测试出比较好的性能,一般要用异步IO。

  6. 其他影响因子。太多了,无法一一列举。比如多线程、机械硬盘的外圈和内圈等。现在的机械硬盘内部结构很复杂,扇区的物理排布和硬盘的固件有关,但一般可以简单认为,机械硬盘的开始部分(扇区地址较小部分,或者简单认为是外圈)比结尾部分(扇区地址较大部分,或者简单认为是内圈)的速度要快。

  因为有如此多的影响性能的因素,所以,也需要测试工具要提供众多参数来进行设置,以便精准地测试性能的原因。但实际的应用场景可能更复杂,有可能一会儿是大块的顺序读写,一会儿又变得更随机。如果我们能够精准预估应用程序读写存储的模式,理论上也可以用IOMeter等工具来模拟,无非是把配置写得比较复杂而已。但有时候很难预估它的读写模式,所以采用实际的应用环境更具有性能参考意义。因为实际应用环境搭建麻烦,所以,有时候会自己写一些测试工具,尽可能模拟应用场景,然后以比较简单的模式来进行测试,可以有更高的测试效率,以便不断改进系统。


java资料.jpg

作者:coolcoder    

来源:http://www.51testing.com/html/12/n-4473912.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   微信发红包测试用例  功能  1、在红包钱数和红包个数的输入框中只能输入数字;  2、红包最多最少的输入钱数200、0.01;  3、拼手气红包最多可以发多少个红包  4、超过最大拼手气红包是否有提醒;  5、当红包钱数超过最大范围是否有提醒;  6、余额不足时,红包发送失败,或者会不会匹配切换支付方式;  7、红包描述里是否可以输入表情汉字英文数字等;  8、红包描述里最多有多少个字符;  9、发送的红包别人是否能正常领取;  10、发送的红包自己可不可以领取;  11、24小时后别人没有领取的红包是否可以退回原来账户,或者是否还可以领取;  12、用户是否可以多次抢一个红包;  13、...
            11 12 3646
            分享
          • 就在AI绘画突然火热的时候,腾讯看中了一条与画相关的新赛道,即通过文字制作动画视频。Tech星球独家获悉,腾讯正在小范围内测一款名为“玩句”的APP,这是一款创作简易动画视频的产品,用户可以通过“玩句”,利用文字和其中的编辑素材,创作动画视频。内容包括但不限于段子、故事等,用动画表达,做成视频传播,这对创作者们而言,降低了动画视频的创作门槛。“玩句”的开屏页截图Tech星球体验后发现,“玩句”APP是一个动画视频创作类工具产品,创作的内容包括搞笑、段子、科普等,只要是能够用动画表达的内容,都可进行创造。用户进入“玩句”后,会默认进入到创作页面,在该页面,用户可以进行动画创作。具体的玩法是:用户...
            0 0 934
            分享
          • 性能测试是软件开发和应用过程中至关重要的环节。它是评估系统性能、稳定性和可扩展性的有效手段,可以确保软件在真实环境中高效运行。在现代技术快速发展的时代,性能测试的重要性愈发显著。性能测试在软件开发和应用过程中的重要性不可低估。它是保障用户体验、发现潜在问题、提高系统可靠性的关键手段。同时,遵循性能测试的最佳实践,能够确保测试的准确性和可靠性,提高测试效率,为软件开发和应用提供有力的保障。只有重视性能测试,并遵循最佳实践,我们才能构建稳定、高效的应用,满足用户对技术的不断追求和挑战。下面分享几个性能测试中最佳实践,以供参考。# 设定明确的性能目标在开始性能测试之前,首要任务是设定明确的性能目标。...
            0 0 914
            分享
          • 1. 变量和赋值1.1 赋值Python中变量不需要声明,直接定义即可,会在初始化的时候决定变量的类型,使用=来进行初始化和赋值操作,即你给变量赋什么值,变量类型就会跟随变化(动态)name = 'luo' #赋值操作,字符型string print(name) print(type(name))name = 15 #整型int print(name) print(type(name))name =1.5 #浮点型float print(name) print(type(name))1.2 增量赋值...
            0 0 1207
            分享
          • 一、前言在当前主流的前端后端分离模式开发下,拥有一个接口文档并且是好用的接口文档是很有必要的一个东西。PS:?以下观点是真实开发场景下碰到并且悟出来的痛点。1、在项目的开发过程中,有一个接口文档的存在能让前端后端工程师保持的数据信息概念是统一的。例如:”项目需求的接口字段,参数字段。所有只要请求的返回参数记录到文档中的情况后,前后端工程师编写代码的同时就能统一对照接口文档去编写各自的逻辑,那么在各个信息的命名都是统一的情况下,在各自的代码中就不会发生前端在一个需求功能的请求接口命名是与后端返回接口的命名信息不一致的情况。这样可以大大避免了导致排查问题的时候不能很快速的定位问题。2、好的接口文档...
            2 2 942
            分享
      • 51testing软件测试圈微信