`
CharlesCui
  • 浏览: 427794 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[roadrunner]测试网络块存储nbd读写性能

阅读更多
并发读写性能测试请执行:
引用
ruby vbd_kv.rb -nbd /dev/nbd0,/dev/nbd1,/dev/nbd2,/dev/nbd3,/dev/nbd4,/dev/nbd5,/dev/nbd6,/dev/nbd7,/dev/nbd8,/dev/nbd9 -size 1073741824


roadrunner会根据传入的nbd参数数量启动相应的进程独立访问不同的nbd。

单个nbd(vm)读写性能测试执行:
引用
ruby vbd_kv.rb -nbd /dev/nbd11 -size 10737418240


require "rubygems"
require File.join(File.dirname(__FILE__),'..','lib','roadrunner')
# require "roadrunner"

#-----------------------------Argv prepare.--------------------------------#

def args(key)
  ARGV.each_with_index do |arg, i|
    return ARGV[i+1] if "-#{key}" == arg
  end
  nil
end

unless args('nbd') && args('size')
  p "[ruby ]#{$0} -nbd /dev/nbd[0-x][,/dev/nbd[0-x],/dev/nbd[0-x]] -size 10240000"
  exit 1
end

#-----------------------------Logger prepare.--------------------------------#

$log ||= Logger.new(STDOUT)

NBD=[]

args('nbd').split(',').each do |n|
  NBD << 
      begin
        f=File.open(n,"rb+")
        f.sync=true
        f
      rescue Exception => e
        $log.error "Can't open #{args('nbd')}!"
        exit -1
      end
end

`echo '' > /root/nbd/sanbo/1.log`

#--------------------------------VBD KV integration test---------------------------------#

class ValidateError < Exception;end

class Kv_vbd
  class << self
    def seq_read(nbd,fs)
      $log.debug("Entry seq_read, ARGV => #{ARGV.inspect}")
      begin
        nbd.rewind# if nbd.eof?
        
        loop {
          #tmp=rand(fs/10000)
          # $log.debug("seq_read:reading #{tmp} bytes from #{nbd}")
          #tmp=nbd.readpartial(tmp)
          #break if nbd.eof?

	  nbd.sysread(1280000)
        }
        
        $log.info("seq_read done.#{fs} bytes read #{nbd}.")
      rescue Exception => e
	if nbd.eof?
	  return nbd.eof?
	else
          $log.error("#{nbd} read error!")
	  raise Exception,e.to_s
	end
      end
      # validate(nbd,fs)
    end

    def seq_write(nbd,fs)
      $log.debug("Entry seq_write, ARGV => #{ARGV.inspect}")
      begin
        nbd.rewind# if nbd.eof?
        
        # bs=1024*1024
        bs=1024
        data='x'*bs
        
        $log.debug("seq_write:writing #{bs} bytes into #{nbd} everytime.")
        
        (fs/bs).times {|t|
          nbd.syswrite(data)
          nbd.flush
          # `sync` if t%10240 == 0
        }
        (nbd.syswrite('x'*(fs%bs));nbd.flush) unless fs%bs == 0
        
        $log.info("ruby io done.sync will exec.")
        `sync`
        # signature(nbd,fs)
        
        $log.info("seq_write done.#{fs} bytes write into #{nbd}.")
      rescue Exception => e
        $log.error("#{nbd} write error!")
      end
      dirty_watcher(nbd,fs)
    end
    
    def signature(nbd,fs)
      $log.debug("Entry signature, ARGV => #{ARGV.inspect}")
      
      nbd.rewind
      nbd.seek(10)
      nbd.syswrite('c')
      
      nbd.seek(-10, IO::SEEK_END)
      nbd.syswrite('c')
      
      begin
        @MD5=`md5sum #{nbd.path}`.match(/(^[a-z0-9A-Z]*)[\s|\t].*$/)[1]
        $log.info("#{nbd.path} md5sum => #{@MD5}")
      rescue Exception => e
        $log.error("md5sum exec error! "+e.to_s)
      end
      
    end
    
    def validate(nbd,fs)
      $log.debug("Entry validate, ARGV => #{ARGV.inspect}")
      
      nbd.rewind
      nbd.seek(10)
      unless (tmp=nbd.sysread(1)) == 'c'
        raise ValidateError,"expect File.seek(10, IO::SEEK_END) => 'c',actually get #{tmp}."
      end
      
      nbd.seek(-10, IO::SEEK_END)
      unless (tmp=nbd.sysread(1)) == 'c'
        raise ValidateError,"expect File.seek(-10, IO::SEEK_END) => 'c',actually get #{tmp}."
      end
      
      
      raise ArgumentError,"No md5sum checked! @MD5 => #{@MD5}" unless @MD5
      _m=`md5sum #{nbd.path}`.match(/(^[a-z0-9A-Z]*)[\s|\t].*$/)[1]
      $log.info("Expect md5sum is #{@MD5}.")
      $log.info("Actually md5sum is #{_m}")
      unless @MD5 == _m
        raise Exception,"md5sum check failed!" 
      end
      
      $log.info("Validate Success...")
    end
    
    # size => get nbd device size used at Linux system
    # return nbd size(Byte)
    # nbd => "/dev/nbd9"
    def size(nbd)
      _s=`ps axf|grep #{nbd}|tail -n1|awk '{print $8}'`.to_i*1024**3
      $log.info("Disk size => #{_s}")
    end
    
    def dirty_watcher(nbd,fs)
      $log.debug("Entry dirty_watcher, ARGV => #{ARGV.inspect}")
      
      dirty=''
      # watch dirty file 10 times,ensure the queue is empty.
      count=10
      begin
        dirty="/tmp/#{`ps axf|grep 'nbd-client .* #{nbd.path}'|tail -n1|awk '{print $9}'`.gsub($/,'')}.dirty"
        loop {
          if IO::read(dirty) == '0'*8
            count-=1
            
            if count == 0
              $log.info("dirty file <#{dirty}> == #{IO::read(dirty)}.Watch over.")
              break
            end
          else
            count=10
          end
          sleep 3
        }
      rescue Exception => e
        $log.error "can't find dirty file => #{dirty}"
        $log.error "ps axf|grep 'nbd-client .* #{nbd.path}' => #{`ps axf|grep 'nbd-client .* #{nbd.path}'`}"
      end
    end
    
  end
end


#--------------------------------RoadRunner---------------------------------#

rr=RoadRunner.new
rr.mode,rr.users,rr.iterations='p',NBD.size,1

rr.log=$log

#['seq_write','signature','seq_read','validate'].each_with_index{|s,i|
#['seq_read'].each_with_index{|s,i|
['seq_write','signature'].each_with_index{|s,i|
  ts_proc=proc{
    # Kv_vbd.send(s,NBD[rr.userId],Kv_vbd.size(NBD[rr.userId].path))
    Kv_vbd.send(s,NBD[rr.userId],args('size').to_i)
  }
  rr.send(s,&ts_proc)
}

rr.run
rr.report

NBD.each{|x|x.close}
0
0
分享到:
评论

相关推荐

    roadrunner汉化补丁

    "RoadRunner汉化补丁"是一个专为RoadRunner软件设计的本地化工具,旨在帮助中国用户更方便地理解和使用这款软件。RoadRunner通常是一款车载多媒体系统软件,它提供了丰富的功能,如导航、音频播放、车辆信息显示等。...

    关于RoadRunner与VTD在场景构建中的对比.docx

    【RoadRunner与VTD在自动驾驶虚拟仿真测试场景搭建中的对比】 在自动驾驶技术的发展过程中,虚拟仿真测试场景的构建起着至关重要的作用。本文主要对比分析了两种常用的虚拟仿真工具——RoadRunner和VTD在场景搭建...

    MATLAB, RoadRunner 和 Sumo 在动力总成预测性能量管理软件测试中的联合仿真应用

    内容概要:本文介绍了 MATLAB, RoadRunner 和 Sumo 在动力总成预测性能量管理软件测试中的联合仿真方法。具体涵盖了动力总成预测性能量管理软件的功能、测试环境的搭建、静态和动态场景的创建以及应用场景。文中详细...

    Go-RoadRunner是Golang的高性能PHP负载平衡器和进程管理器库

    5. **高性能特性**:Go-RoadRunner利用Go语言的并发特性,通过工作池模型实现高并发处理。每个PHP工作进程可以处理多个请求,而不会互相干扰,从而提高了整体性能。 6. **持久连接**:Go-RoadRunner支持HTTP/2协议...

    Road Runner中控软件

    "Road Runner"作为一个中控软件,其主要功能可能包括远程控制、系统监控、任务调度、网络管理等多个方面。远程控制允许用户在不同的设备间进行操作,例如,用户可以在一台电脑上控制另一台电脑,这对于技术支持或者...

    车载电脑中控软件Road Runner

    **车载电脑中控软件Road Runner详解** Road Runner是一款专为车载电脑系统设计的中控软件,它集成了多媒体播放、导航、车辆监控等多种功能,旨在提升驾驶体验并提供丰富的车载娱乐与信息系统。作为一款强大的中控...

    RoadRunner 源码

    1. 数据采集:RoadRunner能够从各种数据源(如数据库、文件、网络API等)高效地抓取数据,支持多种数据格式的读取和解析,确保数据获取的全面性和准确性。 2. 数据处理:在抽取数据后,它提供了预处理功能,如数据...

    Road Runner安装设置图文

    Road Runner安装设置图文

    网页实体抽取工具Roadrunner开源包

    Roadrunner算法,意大利的科学家提出的用于大规模网页信息处理的一个开源工具

    软件测试实验报告(使用LoadRunner进行性能测试实验)

    软件测试实验报告(使用LoadRunner进行性能测试实验) 一、性能测试简介 性能测试是软件测试中的一种重要类型,以评估软件系统在高并发和大负载下的性能和可扩展性。LoadRunner是一款成熟的性能测试工具,广泛应用...

    roadrunner-bundle:在您的Symfony应用程序中集成了RoadRunner工作人员

    安装运行以下命令: composer require baldinof/roadrunner-bundle如果您不使用Symfony Flex: 在您的内核中注册Baldinof\RoadRunnerBundle\BaldinofRoadRunnerBundle 复制默认的RoadRunner配置文件: cp vendor/...

    laravel-roadrunner:简单的Laravel-Roadrunner桥

    Laravel-Roadrunner 简单的Laravel- 桥 安装 $ composer require hunternnm/laravel-roadrunner 如果需要-发布配置文件以更改实现(即重置器等) ...用法 该软件包已准备好进行生产,并且包含一个简单的bin/road...

    roadrunner-symfony:Symfony和RoadRunner之间的简单桥梁,没有PSR7层(HttpClient)

    RoadRunner &lt;-&gt; Symfony桥Symfony和RoadRunner之间没有PSR7层(HttpClient)的简单桥梁。安装使用Composer要求此库composer req updg/roadrunner-symfony 创建psr-worker.php文件并将此内容添加到其中&lt;?...

    roadrunner-laravel:RoadRunner⇆Laravel桥

    $ composer require spiral/roadrunner-laravel " ^4.0 " 需要已安装的composer ()。 之后,您可以使用下一个命令“发布”软件包配置文件( ./config/roadrunner.php ): $ ...

    roadrunner-docs:RoadRunner应用程序服务器文档(自动同步到网站)

    目录RoadRunner是开源(由MIT许可)的高性能PHP应用程序服务器,负载平衡器和进程管理器。 RoadRunner v1.0文档可。 介绍PHP工人调试HTTP和HTTP / 2 HTTP和HTTP / 2 静态内容标头Golang中间件应用服务器CLI命令记录...

    RoadRunner 操作手册

    oadRunner是一个用于生成OpenDrive地图的工具,可以在Carla或其他支持OpenDrive和OpenScenario的模拟器引擎中进行模拟。...可以通过下载安装设置来使用RoadRunner,并且可以将完成的地图导出到不同的模拟器中。

    roadrunner-temporal:Roadrunner的时间PHP-SDK主机进程插件

    Temporal是RoadRunner的官方插件,可在。 阅读有关应用程序服务器安装的更多信息。 要安装PHP-SDK,请执行以下操作: $ composer require temporal/sdk 阅读如何配置worker和init工作流程。 测验 要测试集成,请...

    roadrunner:用Golang编写的高性能PHP应用程序服务器,负载平衡器和流程管理器

    [RR2-BETA] RoadRunner是开放源代码(由MIT许可)的高性能PHP应用程序服务器,负载平衡器和进程管理器。 它支持作为服务运行,并能够在每个项目的基础上扩展其功能。 RoadRunner包括与PSR-7 / PSR-17兼容的HTTP和...

    Roadrunner_outputconverter:将Roadrunner输出图转换为图形采样算法输入,以进行PrecisionRecallF-Score评估

    Roadrunner_outputconverter 将Roadrunner输出地图(RoadMap)转换为图形采样算法输入,以进行精确/调用/ F分数评估 调用python3 Roadrunner_outputconverter.py以及从Roadrunner获得的输出pickle文件名。 ...

    roadrunner-binary:RR发布存储库

    RoadRunner是开放源代码(由MIT许可)的高性能PHP应用程序服务器,负载平衡器和进程管理器。 它支持作为服务运行,并能够在每个项目的基础上扩展其功能。 RoadRunner包括与PSR-7 / PSR-17兼容的HTTP和HTTP / 2服务器...

Global site tag (gtag.js) - Google Analytics