Linux NFS性能调优和优化方法
NFS性能调整可以分为三个不同的区域。
在本教程中,我们将分别讨论它们。
首先让我们看一下这些分类。
- 影响NFS的基础磁盘相关性能
- 基于NFS应用程序的性能
- 最后是与网络相关的NFS调优(NFS是一种严重依赖网络的技术)
调整NFS服务器和NFS客户端都很重要,因为它们是参与此网络文件系统通信的人。
因此,让我们从一些安装命令选项开始,这些选项主要用于从客户端调整NFS性能。
挂载命令块大小设置以提高NFS性能
服务器和客户端用于在它们之间传递数据的数据量和大小非常重要。
大多数NFS版本都有此设置的默认值。
但是,我们始终可以调整这些值以适合需求。
我们将使用与上一教程相同的NFS服务器和客户端。
假设我们已在一个NFS客户端系统上安装了NFS共享。
让我们看一下该安装的默认属性。
[root@theitroad2 ~]# mount 192.168.0.103:/data /mnt
[root@theitroad2 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 38G 5.6G 31G 16% / tmpfs 252M 0 252M 0% /dev/shm 192.168.0.103:/data 38G 2.8G 34G 8% /mnt [root@theitroad2 ~]#
让我们看一下NFS客户端默认选择安装此共享的属性和选项。
我们可以从文件/proc/mounts轻松获得该信息。
[root@theitroad2 ~]# cat /proc/mounts 192.168.0.103:/data /mnt nfs rw,vers=3,rsize=32768,wsize=32768,hard,proto=tcp,timeo=600,retrans=2,sec=sys,addr=192.168.0.103 0 0 [root@theitroad2 ~]#
我们还将从上述文件中获得有关系统中已挂载的其他文件系统的详细信息,但是为了避免混淆,我仅向我们显示了有关已挂载的NFS共享的详细信息。
详细信息显示了在客户端上安装特定共享时使用的默认选项。
rw告诉文件系统已以读/写模式挂载
vers = 3这意味着我们正在使用NFS版本3进行此挂载
rsize = 32768&wsize = 32768这指定了每个RPC数据包在读取和写入时所占用的数据块的大小。
调整它们有时会提高性能,有时还会降低性能。
让我们看看为什么。
必须始终通过保持网络容量以及客户端和服务器的处理能力和性能来调整rsize和wsize。
因此,假设我们决定减小安装中rsize和wsize的大小。
减少RPC数据包的读写大小,将增加需要通过网络发送的网络IP数据包的总数。
这意味着,如果我们有1 MB的数据,将其划分为相等的32KB块将增加块的数量,如果将其划分为相等的64KB块,则将减少块的数量。
这意味着,如果减小这些值,则需要通过网络发送大量IP数据包;如果增大这些值,则必须通过网络发送较少数量的IP数据包。
因此,我们修改此参数的决定必须始终取决于网络功能。
如果假设NFS服务器和客户端上有1个千兆端口,并且连接这些服务器的网络交换机也具有1G端口的能力,那么我建议将这些参数调整为更高的值。
我们可以在挂载时轻松地修改rsize和wsize值,如下所示(可设置的最大值为65536,这取决于我们当前使用的内核版本)。
[root@theitroad2 ~]# mount 192.168.0.104:/data /mnt -o rsize=65536,wsize=65536
就像上面显示的mount命令一样,我们可以在NFS中修改rsize和wsize选项。
否则,我们可以在fstab挂载条目中对其进行永久修改。
为我们选择一个合适的rsize和wsize值的最佳方法是将它们更改为不同的值,并进行读/写性能测试。
然后选择可以提供最佳性能的值。
我们可以参考我们在linux中进行的读/写性能测试,以测试速度。
修改NFS的网络MTU大小
MTU代表最大传输单位。
它可以在一个以太网帧中传递的最大数据量。
大多数计算机都将它们配置为默认值1500字节。
要获取NIC卡上MTU的当前值,可以运行以下命令。
[root@theitroad2 ~]# netstat -i Kernel Interface table Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth0 1500 0 227 0 0 0 235 0 0 0
或者,我们也可以从Linux中的ifconfig命令获取MTU的值。
假设rsize和wsize值为8 KB,并且我们使用的是1500字节的MTU大小,则由于最大大小为1500字节,因此在发送时数据仍然会碎片化。
在这种情况下,如果我们将MTU大小修改为9000字节,它将能够发送整个8kb的读/写数据,而不会在一帧中分段。
但是要完成任务,我们需要将服务器和客户端的MTU更改为相同的值。
在Linux中更改MTU非常简单。
我们可以指定所需的接口卡配置文件的MTU大小。
假设我们需要更改eth0接口的MTU。
我们只需要编辑文件/etc/sysconfig/network-scripts/ifcfg-eth0,然后添加“ MTU = 9000”行
否则,我们也可以借助ifconfig命令更改MTU,如下所示。
[root@theitroad2 ~]# ifconfig eth0 mtu 9000 up [root@theitroad2 ~]# ifconfig eth0 Link encap:Ethernet HWaddr 08:00:27:55:D1:CC inet6 addr: fe80::a00:27ff:fe55:d1cc/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:9000 Metric:1
注意:在生产网络中更改MTU的大小很有风险,因为它有时会影响我们当前正在运行的应用程序。
而且,某些ISP也不接受大于其指定MTU大小的帧。
NFS中的timeo和retrans选项
在服务器响应延迟或者服务器无响应的情况下,以上两个选项会影响客户端对服务器重试的次数。
NFS中的timeo选项决定客户机在得出必须重新传输数据包的结论之前需要等待的时间。
默认值为0.7(以给定的秒数的十分之一计算。
因此,如果给定5 timeo值,则意味着客户端将等待5/10秒,然后再决定是否需要重新发送数据包。
)
第二个选项retrans决定客户端超时的总次数,以防超时(在等待了我们提供的timeo秒之后)。
因此,如果我们将retrans值设置为3,则客户端将重新发送RPC数据包3次(并且每次将等待timeo秒),然后得出服务器不可用的结论,并向我们显示一条消息“服务器不可用”。
回应”。
同样在消息发出后,计数器将重置,客户端仍将继续尝试(具有相同的timeo和retrans值)。
我们可以在mount命令中将timeo和retrans值修改为一个选项,如下所示。
[root@theitroad2 ~]# mount 192.168.0.102:/data /mnt -o timeo=5,retrans=4 [root@theitroad2 ~]#
如果要查看当前nfst统计信息以重新发送数据包,则可以使用nfsstat命令,如下所示。
[root@theitroad2 ~]# nfsstat -r Client rpc stats: calls retrans authrefrsh 5 0 0
在经过调整的网络上,客户端会收到服务器的答复,但会有所延迟(由于重新传输的频率太高),我们可以增加timeo值。
这将导致性能略有提高。
NFS服务器上的NFS线程数
使用NFS时需要注意的另一个重要因素是NFS服务器上可用的NFS线程总数。
如果我们有大量访问NFS服务器的客户端,那么最好增加NFS服务器上的线程数。
我们可以通过以下命令查看NFS服务器上的当前线程数。
[root@theitroad1 ~]# ps aux | grep nfs root 4794 0.0 0.0 0 0 ? S< 03:18 0:00 [nfsd4] root 4795 0.0 0.0 0 0 ? S 03:18 0:00 [nfsd] root 4796 0.0 0.0 0 0 ? S 03:18 0:00 [nfsd] root 4797 0.0 0.0 0 0 ? S 03:18 0:00 [nfsd] root 4798 0.0 0.0 0 0 ? S 03:18 0:00 [nfsd] root 4799 0.0 0.0 0 0 ? S 03:18 0:00 [nfsd] root 4800 0.0 0.0 0 0 ? S 03:18 0:00 [nfsd] root 4801 0.0 0.0 0 0 ? S 03:18 0:00 [nfsd] root 4802 0.0 0.0 0 0 ? S 03:18 0:00 [nfsd]
如果我们计算nfsd进程的总数,它将为8(这是默认数目)。
这意味着,如果我们有大量的客户端访问此NFS服务器,则它们将在操作上遇到一定程度的滞后。
让我们将此数字增加到更高的数字,例如20。
我们可以在/etc/sysconfig/nfs文件中修改此值。
# Number of nfs server processes to be started. # The default is 8. RPCNFSDCOUNT=16
修改该值后,我们需要重新启动nfs服务。
现在,我们应该在进程列表中得到16个而不是8个。
NFS挂载中的异步和同步
这是两个值,这些值确定如何应客户端请求将数据写入服务器。
两者都有自己的优点和缺点。
首先让我们了解一下NFS挂载中的异步和同步。
在NFS客户端上执行的任何操作都会转换为RPC等效操作,以便可以使用RPC协议将其发送到服务器。
因此,如果我们在NFS中使用async选项,则服务器在调用RPC操作进行写入时,会首先将该操作转换为VFS(虚拟文件系统)操作,以将数据写入基础磁盘系统中。
一旦VFS句柄对基础磁盘执行了写操作,即使在未确认写操作已完成之前,服务器也已准备好接受进一步的RPC写操作。
在这种情况下,NFS服务器通过减少完成写入操作所需的时间来提高写入性能。
但是这种方法有时会导致数据丢失和损坏,因为NFS服务器甚至在基础磁盘系统完成其工作之前就开始接受更多的写操作。
使用同步选项将执行相反的操作。
在这种情况下,服务器将仅在成功完成写操作后才回复(这意味着仅在将数据完全写入磁盘后才回复)。
如果我们要处理关键数据,那么我将永远不建议使用async选项,但是在数据不是那么重要的情况下,async是一个不错的选择。
[root@theitroad2 ~]# mount 192.168.0.101:/data /mnt -o rw,async
同样,如上图所示,我们也可以根据需要使用同步选项。
我们可以通过在fstab中输入一个条目来使该安装永久化。
192.168.0.101:/data /mnt nfs rw,async 0 0
调整输入和输出套接字队列以提高NFS性能
通过网络传输大文件需要服务器和客户端上的大量内存。
但是,默认情况下,Linux机器永远不会为此目的分配大量内存,因为它也需要为其他应用程序提供内存。
如果我们有大量的输入和输出通过网络,则可以进一步调整它并分配更高的内存。
有两个值可以修改以对其进行调整。
一个是套接字输入队列,另一个是套接字输出队列。
输入队列是需要处理的请求排队的地方。
输出队列是发出请求的一侧排队的地方。
我们已经看到,增加服务器上NFS服务器线程的数量可以提高性能。
假设服务器上有16个线程,每个线程都在处理来自不同客户端的请求。
它们每个都使用相同的套接字输入和输出队列(甚至服务器上的其他应用程序也将使用此队列来处理其请求。
)。
这意味着,如果输入和输出套接字队列的大小更大,那么所有线程都可以有效地发送和接收数据。
我们可以通过修改sysctl.conf文件来修改这些值,或者,如果需要,我们可以直接在/proc中修改文件(修改后需要重新启动nfs服务器)
echo 219136 > /proc/sys/net/core/rmem_default echo 219136 > /proc/sys/net/core/rmem_max
我们还可以通过修改wmem_default和wmem_max值来修改输出队列,如下所示。
echo 219136 > /proc/sys/net/core/wmem_default echo 219136 > /proc/sys/net/core/wmem_max
我们在/proc文件系统中修改的任何内容都是临时的,因为它的值存储在内存中,该值不会在重新启动后持续存在。
我们可以通过在sysctl.conf中创建一个条目来使这些条目永久化,如下所示。
[root@theitroad2 ~]#echo 'net.core.wmem_max=219136' >> /etc/sysctl.conf [root@theitroad2 ~]#echo 'net.core.rmem_max=219136' >> /etc/sysctl.conf
NFS服务器中的基础磁盘配置
在服务器上作为NFS共享公开的基础DISK的配置和构成在性能中起着重要作用。
如果NFS共享位于RAID阵列上,则可以根据配置的RAID级别提高读取和写入性能。
最好的RAID级别始终是RAID10.
但是,由于使用的磁盘数量众多,因此成本很高。
如果我们想要一个不错的读取速度,那么我们可以始终选择RAID级别5或者6.
但是RAID 5和RAID 6的写入速度有点慢。
通过连续执行读/写性能测试,调整本文中建议的每个参数,以达到最佳的调整水平。