修改Cosbench源码 支持s3的 http range request 测试场景

在视频点播的业务应用场景中,用户使用了ffmpeg工具做视频实时转码用。 而ffmpeg使用range 请求。而Cosbench不支持这种测试场景,所以需要修改源码支持这种测试场景。

HTTP 协议介绍:

HTTP 请求头 Range

请求资源的部分内容(不包括响应头的大小), 单位是byte,即字节,从0开始.

如果服务器能够正常响应的话,服务器会返回206 Partial Content的状态码及说明. 如果不能处理这种Range的话,就会返回整个资源以及响应状态码为200 OK.(这个要注意,要分段下载时,要先判断这个)

Range 请求头格式

Range: bytes=start-end

例如:

Range: bytes=10-:第10个字节及最后个字节的数据 Range: bytes=40-100:第40个字节到第100个字节之间的数据.

注意,这个表示[start,end],即是包含请求头的start及end字节的,所以,下一个请求,应该是上一个请求的[end+1, nextEnd]

响应头

Content-Range

Content-Range: bytes 0-10/3103

这个表示,服务器响应了前(0-10)个字节的数据,该资源一共有(3103)个字节大小。

分段下载

利用这个特点,我们可以使用分段下载(多线程下载,分布式下载)

思想:先请求一个HEAD方法的请求,获取总文件大小, 然后启用多线程并发下载不同的分片。

代码库:https://github.com/BodihTao/cosbench

修改后重新编译的安装包: http://s3.yyclouds.com/public/cosbench.zip

配置文件:

is_range_request=true;range_start=4096;range_end=10240;

<?xml version="1.0" encoding="UTF-8" ?>
<workload name="s3 test 1 node read" description="sample benchmark for s3">

  <storage type="s3" config="accesskey=xxx;secretkey=xxxx;is_range_request=true;range_start=4096;range_end=10240;endpoint=http://tj-s3.yyclouds.com;path_style_access=true" />

    <workflow>

    <workstage name="init">
      <work type="init" workers="16" config="cprefix=s3testqwer;containers=r(1,2)" />
    </workstage>

    <workstage name="prepare">
      <work type="prepare" workers="16" config="cprefix=s3testqwer;containers=r(1,2);objects=r(1,24);sizes=u(1,3)MB" />
    </workstage>

    <workstage name="main">
      <work name="main" workers="16" runtime="300">
        <operation type="read" ratio="90" config="cprefix=s3testqwer;containers=u(1,2);objects=u(1,12)"/>
        <operation type="write" ratio="10" config="cprefix=s3testqwer;containers=u(1,2);objects=u(13,24);sizes=u(1,3)MB" />
      </work>
    </workstage>

    <workstage name="cleanup">
      <work type="cleanup" workers="16" config="cprefix=s3testqwer;containers=r(1,2);objects=r(1,24)" />
    </workstage>

    <workstage name="dispose">
      <work type="dispose" workers="16" config="cprefix=s3testqwer;containers=r(1,2)" />
    </workstage>

  </workflow>

</workload>
原文地址:https://www.cnblogs.com/bodhitree/p/6674147.html