nfs client高性能参数设置

简介: linux kernel中sunrpc的实现是单连接和长链接的,为了提高并发性能,在单连接的基础上提供多个slot,通过tcp_slot_table_entries参数设置。slot个数越多,nfs请求并发处理能力越强,如果slot个数很小,而nfs请求又很多,就会在client排队等待。

1、背景

Linux nfs客户端对于同时发起的NFS请求数量进行了控制,若该参数配置较小会导致IO性能较差。可以如下命令配置该参数:

cat /proc/sys/sunrpc/tcp_slot_table_entries

默认编译的内核该参数最大值为256,可适当提高该参数的值来取得较好的性能,以root身份执行以下命令

echo "options sunrpc tcp_slot_table_entries=128" >> /etc/modprobe.d/sunrpc.conf
echo "options sunrpc tcp_max_slot_table_entries=128" >>  /etc/modprobe.d/sunrpc.conf
sysctl -w sunrpc.tcp_slot_table_entries=128

修改完成后,您需要重新挂载文件系统或重启机器。

2、原因分析

下面来分析下tcp_slot_table_entries这个参数是如何影响nfs性能的

nfs协议使用sunrpc通信,linux kernel中sunrpc的实现是单连接和长链接,只有在一些特殊情况下才会新建连接。为了提高并发性能,在单连接的基础上提供多个slot。

nfs client发送请求过程简化如下:

(1)、每个nfs请求首先会分配一个空闲的slot,用来保存buffer和xid等一些环境上下文。
(2)、slot分配成功后,做一些初始化的工作,等待socket可写(send buffer是否满),
(3)、编码,包括slot的xid,nfs请求序列化成xdr。
(4)、调用send_request把编码后的数据包发送到对端。
(5)、收到对端的请求后,从header中解码出xid,根据xid找到对应的slot和上下文。
(6)、请求处理结束后释放slot。

efa4bf2e5647fa92e36bb7a03b78b2a19db793c8
从上述分析和上图中可以看出slot的个数决定了同时处理nfs请求的个数。slot个数越多,nfs请求并发处理能力越强,如果slot个数很小,而nfs请求又很多,就会在client排队等待。而不幸的是linux很多发行版本中,slot个数默认值都是2,所以基本上只有串行处理的能力,即使应用层有再多的并发也没有用。
上述分析做了简化处理,具体可以参考kernel代码实现。linux kernel中,nfs client的实现在fs/nfs/目录下,sunrpc的实现在net/sunrpc/目录下。
相关文章
|
7月前
|
存储 数据管理 Java
基于OSS、NFS构建高性能可扩展的遥感智能解译系统实践之路
该文探讨了构建高性能、可扩展的遥感智能解译系统的架构演进过程。作者强调架构应根据业务场景而定,而非追求单一的“最佳”架构。文章分为五个部分,介绍了从初步的业务场景分析到逐步优化的架构设计。 1. 业务场景描述了服务于地理信息行业的遥感数据管理平台,包括数据湖和遥感智能解译系统的功能和架构设计。 2. 初代系统解决了数据管理和智能解译的基本需求,但存在数据同步效率低下的问题。 3. 自动化阶段通过消息推送和数据接收模块减少了人工干预,将处理时间减半,但仍存在效率和稳定性问题。 4. 高性能阶段引入数据订阅/推送和数据接收Agent,实现了稳定、高速的数据传输,性能提升了6倍。
48847 2
|
存储 Kubernetes 开发工具
k8s 设置nfs的StorageClass
k8s 设置nfs的StorageClass
426 0
|
网络协议 Linux
linux下配置nfs服务器以及设置自动挂载(以centos6.7为例)
NFS(百度百科):NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。
2607 0
|
存储 Kubernetes 容器
利用NFS client provisioner动态提供Kubernetes后端存储卷–安装指南与实践
本文翻译自nfs-client-provisioner的说明文档,本文将介绍使用nfs-client-provisioner这个应用,利用NFS Server给Kubernetes作为持久存储的后端,并且动态提供PV。
3346 0