2012-03-21 107 views
1

我是用SATA磁盘对Linux机箱上的同步读取性能进行基准测试。使用单线程读取,奇怪的是更高的QPS(50)在读取300个条目后给出了12ms的平均读取时间,而在读取相同的300个条目之后较低的QPS(1)给出了63ms。有没有解释?为什么更频繁地读取磁盘会使Linux上的每个读取操作更快? QPS1与50

代码和数据如下:

struct Request{ 
    unsigned long long len; 
    unsigned long long offset; 
    int    fd; 
}; 

int read_request(Request* request){ 
    char* buf = (char*)malloc(request->len); 
    off_t of = lseek(request->fd,request->offset,SEEK_SET); 
    assert(of == request->offset); 

    int len = read(request->fd,buf,request->len); 
    assert(len == request->len); 
    free(buf); 
    return 0; 
} 




int read_with_qps(Request* request,int request_num,Files* f,int mode,int qps){ 

    int interval = 1000/qps; 
    struct timeval start,end; 
    for(int i = 0 ; i < request_num ; i++){ 
     gettimeofday(&start,NULL); 
     int ret = read_request(&request[i]); 
     gettimeofday(&end,NULL); 
     int time_used = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_usec - start.tv_usec)/1000; 
     fprintf(stderr,"%lld,offset=%lld,len=%lld, read time:%d,ret=%d,mode=%d\n", 
       end.tv_sec,request[i].offset,request[i].len,time_used,ret,mode); 
     if(time_used < interval){ 
      usleep((interval - time_used) * 1000); 
     } 
    } 
    return 0; 
} 

随着QPS = 50时,输出的采样的样子(忽略时间,这被认为是计算平均时间时,击中页面缓存< 4ms的):

1332233329,offset=1052299215,len=13186, read time:13,ret=0,mode=1 
1332233329,offset=2319646140,len=1612, read time:10,ret=0,mode=1 
1332233330,offset=1319250005,len=5654, read time:12,ret=0,mode=1 
1332233330,offset=2520376009,len=2676, read time:12,ret=0,mode=1 
1332233330,offset=2197548522,len=17236, read time:10,ret=0,mode=1 
1332233330,offset=1363242083,len=13734, read time:11,ret=0,mode=1 
1332233330,offset=4242210521,len=2003, read time:17,ret=0,mode=1 
1332233330,offset=1666337117,len=2207, read time:10,ret=0,mode=1 
1332233330,offset=797722662,len=5480, read time:18,ret=0,mode=1 
1332233330,offset=1129310678,len=2265, read time:10,ret=0,mode=1 

QPS = 1,smaple的相同提取物:

1332300410,offset=1052299215,len=13186, read time:19,ret=0,mode=1 
1332300411,offset=2319646140,len=1612, read time:40,ret=0,mode=1 
1332300412,offset=1319250005,len=5654, read time:141,ret=0,mode=1 
1332300413,offset=2520376009,len=2676, read time:15,ret=0,mode=1 
1332300414,offset=2197548522,len=17236, read time:21,ret=0,mode=1 
1332300415,offset=1363242083,len=13734, read time:13,ret=0,mode=1 
1332300416,offset=4242210521,len=2003, read time:43,ret=0,mode=1 
1332300417,offset=1666337117,len=2207, read time:18,ret=0,mode=1 
1332300418,offset=797722662,len=5480, read time:67,ret=0,mode=1 
1332300419,offset=1129310678,len=2265, read time:12,ret=0,mode=1 

内核版本我S:2.6.18-194.el5 SMP x86_64的

$ cat /sys/block/sda/queue/scheduler 
noop anticipatory deadline [cfq] 

感谢您的回复

回答

1

当你发出一束查询的驱动器固件可以排队它们,基于旋转位置以优化的顺序执行它们,头部位置(“电梯搜寻”),所以它不必为每个I/O请求等待完整的寻道时间或磁盘旋转时间。

如果您慢速发出相同的查询,则没有这种优势。

+0

但是读取请求是同步的,即下一次读取在最后一次读取返回之前不会发出。 – Utoah 2012-03-21 03:55:25

+0

对于偏移量,请求的高度随机性如示例输出所示。 – Utoah 2012-03-21 03:58:05

1

blktrace可以肯定地告诉你,但这可能是由于plugging。简而言之,IO请求在被发送到磁盘之前可能会略微延迟,这在许多请求进入并可以合并时非常有用,但是在其他情况下可能并非如此。

+0

这真的很有帮助。谢谢。 – Utoah 2012-05-03 01:48:30