免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3858 | 回复: 11
打印 上一主题 下一主题

[Linux] 多线程中用write对u盘写数据速率极低,如何解决? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-12 12:55 |只看该作者 |倒序浏览
开发环境:  ubuntu 12.04
开发目的:  通过usb提供的接口函数,对u盘进行实时写入数据;
u盘:        usb2.0
操作顺序: 先挂载,而后对挂载点进行数据的写入
usb驱动: 支持三种速率,而我用的是高速模式
目前问题: 通过write函数对u盘写数据,并实时写入数据到设备,发现其速率非常底,每秒只有6.5M左右,请问各位大侠有什么方法让写入速度大大提高呢?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2015-08-12 13:52 |只看该作者
回复 1# jianghong_023


    你用多大的块写数据的?

论坛徽章:
0
3 [报告]
发表于 2015-08-12 13:57 |只看该作者
回复 2# MMMIX
谢谢……
为了减少u盘的读写次数, 每次写20M

   

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2015-08-12 14:01 |只看该作者
回复 3# jianghong_023


    每次写完都要把数据 flush 到 U 盘么?

如果写个小例子单纯测试写入呢, 速度如何?

论坛徽章:
0
5 [报告]
发表于 2015-08-12 14:07 |只看该作者
回复 4# MMMIX


是的,每次都会flush 到 U盘,写小程序测试过,写20m的时间在2.654583秒~3.783128秒之间,这个时间仅仅只是计算write写入20M到u盘的时间

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2015-08-12 14:21 |只看该作者
回复 5# jianghong_023


    去掉 flush 呢? 例如写个 2G 的文件, 只在最后 flush 一次. 如果没有大变化, 那估计就是硬件本身的原因了.

论坛徽章:
0
7 [报告]
发表于 2015-08-12 14:44 |只看该作者
回复 6# MMMIX

刚才做了一下实验,在写完后才fsync,用两个usb做测试,发现连续写入时,随写入的次数不断增加,写入设备时间就越长
最长可达7.200431秒
   

论坛徽章:
0
8 [报告]
发表于 2015-08-12 14:58 |只看该作者
本帖最后由 jianghong_023 于 2015-08-12 15:24 编辑

回复 6# MMMIX

实例:
// write into usb device
void *writre_devU(void *arg){
        int cntw,cpsize;
        cpsize = BUFFER_CACHE_20M;
        float timeuse;
       
        struct timeval tpstart,tpend;
        // from cache_buff write into usb device ...
        pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, NULL);
        pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
       
        while(1){
                       
                        printf("first  cuont %d \n",tmp_size_cuont);
                        pthread_mutex_lock(&shareMem_lock);
                        pthread_cond_wait(&cache_cond,&shareMem_lock);
                       
                        if(integer_val == tmp_size_cuont)
                        {
                                cpsize = modulo_val*BUFFER_SIZE_1M;
                                pthread_cancel(threadWriteUdev_2cpy);
                                printf("finish 1\n");
                                initial_bus_map->map_base[(bus_intf_BASE + 6)/sizeof(unsigned char)] = initial_bus_map->bus_inttt.usb_dir; // 停止操作
                                pthread_cancel(thread_cache_Copy);
                                write(fdw, cache_buff, cpsize);
                                fsync(fdw);
                                pthread_mutex_unlock(&shareMem_lock);
                                break;
                               
                        }else{
                       
                        gettimeofday(&tpstart,NULL); // 开始计算程序运行时间

#if 1
                                while((cntw = write(fdw, cache_buff, cpsize)) != 0){
                                        if(cntw < 0)
                                        {
                                                 perror("write error");
                                                 pthread_mutex_unlock(&shareMem_lock);
                                                 break;
                                        }
                                        else if(cpsize == cntw)  
                                                break;
                                        else if(cntw > 0)        
                                        {
                                                cache_buff += cntw;        
                                                cpsize -= cntw;
                                                                                       
                                        }
                                }
#endif
                }
                pthread_mutex_unlock(&shareMem_lock);
                        gettimeofday(&tpend,NULL);  
                        timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+ (tpend.tv_usec-tpstart.tv_usec);
                        timeuse/=1000000;
                        printf("\t Time : %f   \n",timeuse);
                //fsync(fdw);
                tmp_size_cuont++;
                printf("end frist \n");       
        }// end while
        fsync(fdw);
        tmp_size_cuont = 0;
        resultKey = 1;
        pthread_exit(NULL);
}// end void *writre_devU(void *arg)


   

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
9 [报告]
发表于 2015-08-12 17:38 |只看该作者
回复 8# jianghong_023


    建议你还是弄个单纯点的测试用例, 把多线程, 锁之类的因素排除掉, 单纯的测试一下你的 USB 设备的写入速度.

论坛徽章:
0
10 [报告]
发表于 2015-08-12 18:12 |只看该作者
回复 9# MMMIX
谢谢,我直接用 time if=/dev/zero of=/dev/sda1 bs=1M count=20 重复写数据1000次,时间在2.5700~5.7340秒之间,这个设备确实速度很慢慢

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP