24小时热门版块排行榜    

查看: 1297  |  回复: 2
【奖励】 本帖被评价2次,作者zhangguangping增加金币 1.6
本帖产生 1 个 计算强帖 ,点击这里进行查看

[资源] NFS V2引起的"File size limit exceeded"

NFS协议从诞生到现在为止,已经有多个版本,如NFS V2(rfc1094),NFS V3(rfc1813)(最新的版本是V4(rfc3010)。最早,Sun公司曾将NFS v2设计成为只使用UDP协议,主要原因是当时机器的内存、网络速度和CPU的影响,不得不选择对机器负担较轻的方式。而到了NFS v3,Sun公司选择了TCP协议作为缺省的传输方式。
      
  V3相对V2的主要区别:

  1、文件尺寸

  V2版本最大只支持32BIT的文件大小(4G),而NFS V3版本新增加了支持64BIT文件大小的技术。

  2、文件传输尺寸

  V3版本没有限定传输尺寸,V2版本最多只能设定为8k,可以使用-rsize and -wsize 选项来进行设定(我这边出问题的时候就是一个3.2G的文件拷贝起来就有问题,只能拷贝2.1G左右)

  3、完整的信息返回

  V3版本增加和完善了许多错误和成功信息的返回,对于服务器的设置和管理能带来很大好处。

  4、增加了对TCP传输协议的支持

  V2版本只提供了对UDP协议的支持,在一些高要求的网络环境中有很大限制,V3增加了对TCP协议的支持。UDP有着传输速度快,非连接传输的便捷特性,但是UDP在传输上没有TCP来的稳定,当网络不稳定或者黑客入侵的时候很容易使NFS的 Performance 大幅降低甚至使网络瘫痪。所以对于不同情况的网络要有针对的选择传输协议。

  5、异步写入特性。

  6、改进了服务器的mount性能。

  在Linux上,UDP协议是缺省使用的协议。作为服务器而言,别无选择。但作为客户端,可以使用TCP协议和其它使用TCP的NFS服务器互连。在局域网中使用UDP协议较好,因为局域网有比较稳定的网络保证,使用UDP可以带来更好的性能,RHEL 4.0默认使用V2版本。但是 Linux也可以通过mount option的nfsvers=n进行选择。



        通过上面的叙述,可以看出来,1和2是导致出问题的隐患。隐患在于,能不能在NFS文件系统上创建4GB大小的文件以及在传输文件的时候,允许传输的文件的大小。

        我们的机器是suse-10.2,计算任务在计算节点的磁盘运算。运算完毕后将所有的结果文件拷贝回管理节点用户提交任务的目录下。所有的用户目录都在/home下,并且将/home做了NFS共享给各个计算节点。

        suse-10.2带的NFS组件是nfs-utils 1.0.7,其中包含了Server nfs v2;Server nfs v3;Server nfs v3;Client nfs v2;Client nfs v3;Client nfs v4

其中版本2和版本3都可以使用。版本4报告说不支持。现在不追究为什么版本4不支持的问题,这个也不是本文的目的。

本文的目的是说明在NFS系统上可能出现的一个文件传输失败"File size limit exceeded"错误的原因和解决办法。

如果服务其上存在多个版本的NFS客户端,服务器会根据NFS 服务端的版本,找一个最合适的版本。但是问题是,如果你的客户端机器比服务器机器启动的早的话,这个选择就没有依据了。这个时候,客户端做出的选择可能依据别的设置或者操作系统的默认设置。

我们的问题就是出在这儿。当时开客户端机器的时候,服务端机器还没有开启。所以当启动起来的时候,客户端机器自动选择了Client nfs v2,而服务端是Server nfs v3。这样当后来通过手动挂在上NFS的挂载后,使得客户端和服务端的版本不一致。从而导致由Client nfs v2向服务端是Server nfs v3的NFS文件系统拷贝东西的时候,大文件拷贝失败,出现File size limit exceeded。

解决办法:在客户端将NFS的版本号选择回来。

1.查看服务端可使用的版本号

到服务节点运行:

rpcinfo -p | grep -iE "service|NFS"

返回:

    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs

表示可以使用的版本好有2, 3, 4

2.首先查看者客户端所使用的版本

nfsstat -m

返回
/home from 10.10.10.10:/home
Flags: rw,v3,rsize=32768,wsize=32768,hard,lock,proto=tcp,sec=sys,addr=10.10.10.10

说明用的是版本3.

如果返回来的是v2,则可以通过mount加载的时候指定版本号,如

mount -o nfsvers=3 10.10.10.10:/home  /home

表示加载该挂载点的时候使用NFS V3版本。

在加载之前可以卸载原来的挂载

umount /home

如果显示

/home: device is busy

表示该挂载点正在被使用。

可以直接通过

mount -o nfsvers=3 10.10.10.10:/home  /home

挂载即可,这样就存在两个挂载。

10.10.10.10:/home    1748003360 536289952 1211713408  31% /home
10.10.10.10:/home    1748003360 536289952 1211713408  31% /home

最后的这个生效。但是已经运行的占用第一个挂载的程序可能会使用第一个版本的NFS

总结:为了防止机器启动的时候,选择的NFS的版本不同,挂载的时候明确给出NFS的版本号,这样比较保险.
回复此楼

» 收录本帖的淘帖专辑推荐

学习备用

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

★★★★★ 五星级,优秀推荐

★★★★★ 五星级
2楼2012-06-11 08:26:19
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
简单回复
dalongmao3楼
2012-06-11 08:58   回复  
五星好评  
相关版块跳转 我要订阅楼主 zhangguangping 的主题更新
☆ 无星级 ★ 一星级 ★★★ 三星级 ★★★★★ 五星级
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见