马上开始。

http://www.cnblogs.com/afa2010

 

cifs传输时出错的处理

linux中使用cifs模块挂载windows共享目录,传输文件时可能会报错:

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这个配置文件加载比较简单),大家可以都试一下。

http://pserver.samba.org/samba/ftp/cifs-cvs/linux-cifs-client-guide.pdf

 

网上找了很久相关信息,最后确定了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函数,使用前两者比后两者传输速度快,这跟程序有关了。

文明转载呀!记得保留地址!http://www.cnblogs.com/afa2010

posted on 2010-08-24 15:54  afa2010  阅读(3458)  评论(0编辑  收藏  举报