在视频点播的业务应用场景中,用户使用了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>