全部博文(2005)
分类:
2010-03-02 20:15:59
nfs优化篇
1.设置块大小
mount
命令的risize和wsize指定了server端和client端的传输的块大小。如果没有指定,那么,系统根据nfs的版本来设置缺省的
risize和wsize大小。大多数情况是4K(4096bytes),对于nfs
v2,最大是8K,对于v3,在server端设置risize和wsize的限制,最大块大小在kernel的常量
NFSSVC_MAXBLKSIZE,该常量在usr/src/linux2.4/include/linux/nfsd/const.h.所有的2.4
的的client都支持最大32K的传输块。系统缺省的块可能会太大或者太小,这主要取决于你的kernel和你的网卡,太大或者太小都有可能导致nfs
速度很慢。具体的可以使用Bonnie,Bonnie
,iozone等benchmark来测试不同risize和wsize下nfs的速度。当然,也可以使用dd来测试。
#time dd
if=/dev/zero of=/testfs/testfile bs=8k count=1024这是来测试nfs写
#time dd
if=/testfs/testfile of=/dev/null bs=8k 这是测试nfs读
测试时文件的大小至少时系统RAM的两
倍,每次测试都使用umount 和mount对/testfs进行挂载,通过比较不同的块大小,得到优化的块大小。
2.网络传输包的大小
网
络在包传输过程,对包要进行分组,过大或者过小都不能很好的利用网络的带宽,所以对网络要进行测试和调优。可以使用ping -s 2048 -f
hostname进行 ping,尝试不同的package size,这样可以看到包的丢失情况。同时,可以使用nfsstat -o net
测试nfs使用udp传输时丢包的多少。
因为统计不能清零,所以要先运行此命令记住该值,然后可以再次运行统计。如果,经过上面的统计丢包很多。
那么可以看看网络传输包的大小。使用下面的命令:
#tracepath node1/端口号
#ifconfig eth0
比较
网卡的mtu和刚刚的pmtu,使用#ifconfig eth0 mtu 16436设置网卡的mtu和测试的一致。
当然如果
risize和wsize比mtu的值大,那么的话,server端的包传到client端就要进行重组,这是要消耗client端的cpu资源。此外,
包重组可能导致网络的不可信和丢包,任何的丢包都会是的rpc请求重新传输,rpc请求的重传有会导致超时,严重降低nfs的性能。可以通过查看
/proc/sys/net/ipv4/ipfrag_high_thresh和/proc/sys/net/ipv4
/ipfrag_low_thresh了解系统可以处理的包的数目,如果网络包到达了ipfrag_high_thresh,那么系统就会开始丢包,直到
包的数目到达ipfrag_low_thresh。
3.nfs挂载的优化
timeo:如果超时,客户端等待的时间,以十分
之一秒计算。
retrans:超时尝试的次数。
bg:后台挂载,很有用
hard:如果server端没有响应,那么客户端
一直尝试挂载。
wsize:写块大小
rsize:读块大小
intr:可以中断不成功的挂载
noatime:不更
新文件的inode访问时间,可以提高速度。
async:异步读写。
4.nfsd的个数
缺省的系统在启动时,有8个
nfsd进程。
#ps -efl|grep nfsd
通过查看/proc/net/rpc/nfsd文件的th行,第一个是nfsd
的个数,后十个是线程是用的时间数,第二个到第四个值如果很大,那么就需要增加nfsd的个数。
具体如下:
#vi
/etc/init.d/nfs
找到RPCNFSDCOUNT,修改该值,一般和client端数目一致。
然后,重启服务。
#service
nfs restart
#mount -a
5.nfsd的队列长度
对于8个nfsd进程,系统的nfsd队列长度是
64k大小,如果是多于8个,就要相应的增加相应的队列大小,具体的在/proc/sys/net/core/【rw】mem_default和
/proc/sys/net/core/【rw】mem_max。队列的长度最好是每一个nfsd有8k的大小。这样,server端就可以对
client的请求作排队处理。如果要永久更改此值
#vi /etc/sysctl.conf
加入
net.core.
【rw】mem_max=数目
net.core.【rw】mem_default=数目
#service nfs restart
NFS:
网络文件系统
(NFS:Network File System)
网络文件系统(NFS),起初由 Sun 微系统公司进行开发,后经 IETF 扩展,现在能够支持在不同类型的系统之间通过网络进行文件共享。换言之,NFS 可用于不同类型计算机、操作系统、网络架构和传输协议运行环境中的网络文件远程访问和共享。
NFS 使用客户端/服务器架构,并由一个客户端程序和服务器程序组成。服务器程序向其它计算机提供对文件系统的访问,其过程就叫做“输出”。NFS 客户端程序对共享文件系统进行访问时,把它们从 NFS 服务器中“输送”出来。NFS 传输协议用于服务器和客户机之间文件访问和共享的通信,该协议还支持服务器通过输出控制向一组受到限制的客户计算机分配远程访问特权。
NFS 版本2,是 NFS 最早被广泛应用的版本,起初完全运行于 UDP 协议之上,并且不保留状态。几大厂商扩展了 NSF 版本2,使之支持 TCP 传输。NFS 版本3整合了 TCP 传输。使用了 TCP 传输后,使得广域网中的 NFS 应用更为灵活。在继承了以前版本优点的基础之上,目前,NFS 版本4在功能上有如下的改进:
NFS 与 UNIX 系统息息相关,尽管它可以用于任何平台中,如 Macintosh 和 Microsoft Windows 操作系统。服务器消息块协议(SMB)和国际互联网普通文件系统(CIFS)是 NFS 的类似协议,在 Microsoft Windows 平台中,拥有着对等的网络文件系统应用。
名称
结构
注 释
nfstime4
struct nfstime4 {
int64_t seconds;
uint32_t
nseconds;
}
nfstime4 结构类型的数据给出了从通用协议时间(UTC)的1970年1月1日0时计起的秒钟或纳秒的数目。这种数据类型用于计算时间和日期的流逝信息。
time_how4
enum time_how4 {
SET_TO_SERVER_TIME4 = 0,
SET_TO_CLIENT_TIME4
= 1
};
正如属性说明的内容那样,它可用于确定时间数值。
settime4
union
settime4 switch {
case SET_TO_CLIENT_TIME4:
nfstime4 time;
default:
void;
};
正如属性说明的内容那样,它可用于确定时间数值。
specdata4
struct
specdata4 {
uint32_t specdata1;
uint32_t specdata2;
};
本 数据类型表示设备文件类型 NF4CHR 和 NF4BLK 的其它信息。
fsid4
struct
fsid4 {
uint64_t major;
uint64_t minor;
};
本类型数据是文件系 统的标识符,可当作强制型属性使用。
fs_location4
struct fs_location4
{
utf8str_cis server<>;
pathname4 rootpath;
};
用 于推荐属性 fs_locations,它用于对移植和复制的支持。
fs_locations4
struct
fs_locations4 {
pathname4 fs_root;
fs_location4
locations<>;
};
用于推荐属性 fs_locations,它用于对移植和复制的支持。
fattr4
struct fattr4 {
bitmap4 attrmask;
attrlist4
attr_vals;
};
fattr4 结构类型的数据用于表示文件和目录的属性。
change_info4
struct change_info4 {
bool atomic;
changeid4
before;
changeid4 after;
};
本结构类型 CREATE、LINK、REMOVE、RENAME 等运算配合使用,可向用户反映目标文件系统对象所在目录属性的变化。
clientaddr4
struct clientaddr4 {
string r_netid<>;
string
r_addr<>;
};
它作为 SETCLIENTID 运算的一部分,可以指定正占用一个 clientid 的客户计算机的地址,也可以作为 callback registration 的一部分。
cb_client4
struct cb_client4 {
unsigned int cb_program;
clientaddr4
cb_location;
};
客户计算机使用本结构类型的数据来通知服务器回呼地址;包括程序号和客户计算机地址。
nfs_client_id4
struct nfs_client_id4 {
verifier4 verifier;
opaque
id
};
本结构类型的数据是 SETCLIENTID operation 对话的一部分。
open_owner4
Struct open_owner4 {
clientid4
clientid;
opaque wner
};
本结构 类型的数据用于识别开放状态的用户。
lock_owner4
struct lock_owner4 {
clientid4
clientid;
opaque owner
};
本结 构类型的数据用于识别文件锁定状态的用户。
open_to_lock_owner4
struct
open_to_lock_owner4 {
seqid4 open_seqid;
stateid4 open_stateid;
seqid4
lock_seqid;
lock_owner4 lock_owner;
};
本结构类型的数据用于 open_owner4 的第一次完成的锁定操作。它提供 open_stateid 和 lock_owner ,以便于从一个有效的 open_stateid sequence 向一个新的 lock_stateid sequence 开始一次传输。
stateid4
struct stateid4 {
uint32_t seqid;
opaque
other;
};
本结构类型的数据用于客户计算机与服务器之间各种不同的共享机制。
: NFS 版本 4 协议规范
: NFS 版本 3
协议规范
: NFS 版本 2 协议规范