linux iowrite32失败,[转载]linux中cifs传输时出错的处理

CIFS VFS: No response xxx (大概就是这个)

我遇到的这个错误的原因是通过挂载目录传输文件时,每次传输块太大,超过了cifs的缓冲区大小,造成cifs传输延迟。

cifs读的缓冲区大小最大为16K,写的缓冲区大小最大为56K(可用"modinfo cifs"这句命令查看参数取值范围).

只要调小你程序的传输块大小即可,如下(摘自cifs官方文档Performance Considerations一节)。

1) size of file write (wsize). The Linux CIFS client usually sends 56K writes (14 pages) and is

limited to 56K maximum unless mounted forcedirectio.

2) size of file read (rsize). The Linux CIFS client usually sends 16K reads (4 pages). Since CIFS

large network buffers are about 16K in size by default, increasing the rsize would have little

effect unless the setting of module load parameter CIFSMaxBufSize (via insmod) also is

increased.

cifs传输速度的优化

缓冲区调小后,的确是不会报错了,但传输速度却太蜗牛了。

根据cifs官方文档看,可用调相关参数优化速度(通过modprob.conf这个配置文件加载比较简单),大家可以都试一下。

网上找了很久相关信息,最后确定了forcedirectio这个选项可以优化(大家可以看看本文上面的黑底英文,“除非用forcedirectio挂载”)。

我找到linux源码里的fs/cifs下面的readme,看到里面的参数direct像是forcedirectio的参数,但我加了后传输也没有提高。

用"mount.cifs --help"查看选项后才发现direct不是准确的参数,应该是directio 。

附上加参数挂载cifs的格式:

mount -t cifs //192.168.1.1/source 192.168.1.2/destination -o username=myusername,password=mypassword,directio

使用directio参数挂载目录后,传输速度果然提升不少,速度和windows之间对传文件的速度差不多(我是用大小为32K的传输块测试的,能达到15M/s)。

如果要测试的话可以用"dd if=srcfile out=destfile bs=32K"测试,其中bs是在指定传输块大小,我觉得设成32K时的传输速度已经很好了。

哦,对了,记得在读写挂载目录文件时使用read/write函数,而不要使用fread/fwrite函数,使用前两者比后两者传输速度快,这跟程序有关了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值