NFS 使用 RPC 来进行客户端和服务器之间的通信。而在 RPC 的底层,NFS 使用 TCP 来进行数据的可靠传输,以便客户端和服务器之间能够有效地传输文件和进行远程调用(默认为TCP,也可调整为udp)
1.首先服务器端启动RPC服务portmap,并开启portmap的111端口。
2.服务器端启动NFS服务,并向RPC注册端口信息。
3.客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口。
4.服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
5.客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输(网络传输基于TCP)。
当客户端读取或写入文件时,它会向服务端发送相应的文件访问请求,随后服务端会将文件数据通过网络传输给客户端,或者接收客户端发送的写入数据。
如果 /etc/exports 和 /etc/fstab 中都定义了对同一共享目录的参数,那么 /etc/exports 中的参数会优先生效。
这是因为 /etc/exports 是 NFS 服务器用于指定共享目录和访问控制参数的主要配置文件,而 /etc/fstab 是用于指定本地文件系统挂载点和选项的文件。
/data *(rw,async,no_root_squash,no_subtree_check,insecure)
ro 只读访问
rw 读写访问
sync 同步写入,强制写操作等待数据同步到磁盘后再返回成功
async 异步写入,不必等待数据真正写入磁盘就返回成功,资料会先暂存于内存中,而非直接写入硬盘
secure NFS通过1024以下的安全TCP/IP端口发送
insecure NFS通过1024以上的端口发送
wdelay(默认) 延迟写入,如果有多个客户端要对同一个共享目录进行写操作,则将这些操作集中执行。对有很多小的IO写操作时,使用该选项可以有效的提高效率
no_wdelay 不延迟写入,如果有多个客户端要对同一个共享目录进行写操作则立即写入。当设置了async选项时,no_wdelay选项无效,应与sync配合使用
hide 在NFS共享目录中不共享其子目录
no_hide 共享NFS目录的子目录
subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check 和上面相对,不检查父目录权限
root_squash root权限转换为nobody
no_root_squash root权限保留不转换
all_squash 所有用户权限都转换为nobody
no_all_squash 用户权限保留,前提UID、GID一致
root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squas root用户具有根目录的完全管理访问权限
anonuid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的UID
anongid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的GID
NFS没有用户认证机制,且数据在网络上传送的时候是明文传送,一般只能在局域网中使用。不需要输入账号密码,NFS 一般是 IP 认证,定义好可访问该NFS的机器ip地址即可。
NFSv4 引入了身份认证和加密机制,可提供更高的安全性。NFSv4 支持基于 Kerberos 的身份认证,为每个连接实现了加密,并且提供了更为灵活的权限控制。
(1)当设置all_squash时:访客时一律被映射为匿名用户(nfsnobody);
(2)当设置no_all_squash时:访客被映射为服务器上相同uid的用户,因此在客户端应建立与服务端uid一致的用户,否则也映射为nobody。root除外,因为root_suqash为默认选项,除非指定了no_root_squash。
(1)默认值。当设置root_squash时:访客以root用户访问NFS服务端时,被映射为nobody用户;
(2)当设置no_root_squash时:访客以root用户访问NFS服务端时,被映射为root用户。以其他用户访问时同样映射为对应uid的用户,因为no_all_squash是默认选项。
exportfs -s 查看 nfs 服务已加载的配置情况。
exportfs -rv 重载 /etc/exports。
nfsstat -s #查看服务器端nfs统计信息
badcalls: 表示在 RPC 调用中遇到的错误次数。
null: 表示空操作的数量,这个数字应该很小,因为空操作通常不会占据太多比例。
compound: 组合操作的数量,在 NFSv4 中,多个操作可以被组合成一个复合操作,这里统计的是复合操作的数量。
对于操作数量超过 1% 的操作,特别是超过 5% 的操作可能需要更详细地关注和优化:
access: 该操作的数量为 4272032,占比 1%。access 操作用于检查文件的访问权限,频繁的 access 操作可能会导致性能问题,因此需要注意是否有不正常的频繁访问行为。
getattr: 该操作的数量为 19389625,占比 7%。getattr 操作用于获取文件属性,如果 getattr 操作频繁,也可能会导致性能问题,需要注意是否有过多的文件属性获取操作。
sequence: 该操作的数量为 106195445,占比 42%。sequence 操作用于客户端和服务器之间的顺序号处理,这个操作占据了统计中最大的比例,可能需要进一步调查,以确定该操作是否正常,并检查是否有异常的序列操作频率。
test_stateid: 该操作的数量为 81656010,占比 32%。test_stateid 操作用于在服务器上测试状态 ID,频繁的状态测试操作可能会影响性能,需要注意是否有过多的状态 ID 测试操作。
getfh: 该操作的数量为 4257319,占比 1%。getfh 操作用于获取文件句柄,用于标识文件在 NFS 服务器上的唯一位置。如果 getfh 操作频繁,可能需要进一步了解具体的使用场景和原因,以确定是否符合预期。
open: 该操作的数量为 2923718,占比 1%。open 操作用于打开文件或目录。如果 open 操作频繁,可能需要进一步了解具体的文件访问模式和使用方式,以确定是否可以优化或改进操作。
lookup 和 lookup_root: 这两个操作的占比分别为 2% 和 0%。lookup 操作用于查询目录并返回文件或目录句柄。lookup_root 操作是查询根目录的操作。如果这两个操作频繁,可能需要进一步了解文件系统结构和访问模式,以确定是否可以优化或改进操作。
1.建议所有 NFS 用户禁用 NFS 服务器委派功能。这是为了避免Linux 内核错误,该错误会导致 NFS 客户端因大量TEST_STATEIDNFS 消息产生的网络流量 过多而急剧减慢 。
服务器端关闭leases 委派(以下是临时调整,永久生效修改/etc/sysctl.conf):
echo 0 > /proc/sys/fs/leases-enable #fs.leases-enable用于在 NFS 服务器上启用或禁用租约功能。 在 NFS 服务器上启用了租约功能后,客户端可以请求租约来锁定文件,并指定锁定的类型(共享锁或独占锁)。通过租约,服务器可以确保同时只有一个客户端持有特定文件的独占访问权限,或者多个客户端持有共享访问权限。
sysctl -w fs.leases-enable=0
ps:如果重新挂载为 4.0,我们可能不会看到该问题,因为它会避免 TEST_STATEID。
2.调整nfsd数量:
/etc/default/nfs-kernel-server文件是nfs-kernel-server服务的系统配置文件. // RPCNFSDCOUNT=8 nfsd 数量
/etc/nfs.conf文件是NFS服务器的全局参数文件。 // [nfsd]中threads字段 默认8 nfsd数量
如果需要更改内核nfsd的相关参数,就需要修改/etc/default/nfs-kernel-server文件,如果需要更改NFS服务器的共享或权限等设置,就需要修改/etc/nfs.conf文件。
/etc/nfs.conf中:
[mountd]
# threads=1
[nfsd]
# threads=8
nfsd线程:
nfsd线程是负责处理客户端请求的守护进程线程,其中nfsd表示NFS守护进程(NFS daemon)。它主要负责处理客户端对NFS服务器上共享的文件系统的访问请求,包括读取、写入、删除、修改文件等操作。
nfsd线程通过监听客户端的NFS请求,并创建相应的工作线程来处理这些请求,实现对远程文件系统的数据访问和管理。
mounted线程:
mounted线程是mountd服务(NFS mount服务)的线程,它负责处理客户端对NFS服务器上文件系统的挂载和卸载请求。
mountd服务是NFS服务器上的一个服务,其主要作用是处理客户端对NFS共享目录的挂载请求,以便客户端可以通过挂载点访问远程文件系统。
NFSD缺省值对于小型系统来说是一个很好的起点,但对于拥有两个以上客户的客户机系统或者拥有两个以上客户机的服务器来说就多半需要增加了。
查看启动的nfsd 进程:
ps -ef | grep nfs
在服务器端,一定要确保有足够的 NFS 内核线程来处理所有客户机.在默认情况Red Hat系统会启动8个线程.对于繁忙的 NFS 服务器,应该提高这个数字,比如32或64.
2-1.可以用 nfsstat -rc 命令评估客户机,了解是否有阻塞的现象,这个命令显示客户机远程过程调用(RPC)统计数据.
例:
# nfsstat -rc
Client rpc stats:
calls retrans authrefrsh
95374234 3432 0
第二列retrans是3432,这表示从上一次系统启动以来出现了3432次重新传输的情况.这个数字比较大,这可能意味着 NFS 守护进程的线程不足以处理所有客户机的请求,就应该考虑增加NFS线程。
2-2.确定更多 NFS 线程是否有助于提高性能的一种方法是cat /proc/net/rpc/nfsd中的数据以了解 NFS 守护进程的负载。以th开头的输出行列出了线程数,最后 10 个数字是秒数的直方图,前 10% 的线程忙碌,后 10%,依此类推。
理想情况下,希望最后两个数字为零或接近零,表示线程正忙并且您没有“浪费”任何线程。如果最后两个数字相当高,应该添加 NFS 守护进程,因为 NFS 服务器已成为瓶颈。如果最后两个、三个或四个数字为零,则可能没有使用某些线程。就我个人而言,如果我的系统有足够的内存,我不介意这种情况,因为我可能已经到了需要更多 NFS 守护进程的地步。
NFS的队列大小
在linux 2.2和2.4内核里,默认的8个nfsd的输入队列大小是64K,2.6内核是108K.下面将设置为较合理的值256K
# echo 262144 > /proc/sys/net/core/rmem_default
# echo 262144 > /proc/sys/net/core/rmem_max
# echo 262144 > /proc/sys/net/core/wmmen_default
# echo 262144 > /proc/sys/net/core/wmmen_max
作为生产 HPC 系统的经验法则,我倾向于在 NFS 服务器上放置不少于 64GB 的内存,因为内存总体上更便宜。你总是可以使用更少的内存,也许是 16GB,但你可能会付出性能代价。但是,如果您的应用程序不执行太多 I/O,那么权衡可能是值得的。
如果您选择使用异步 NFS 模式,您将需要更多内存来利用async ,因为 NFS 服务器将首先将 I/O 请求存储在内存中,响应 NFS 客户端,然后通过让文件系统将其写入稳定存储。因此,您需要尽可能多的内存以获得最佳性能。
nfs挂载参数文档:https://linux.die.net/man/5/nfs
vim /etc/fstab
10.1.1.100:/data /nfs-data/data nfs4 rw,noatime,nodiratime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,noresvport,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.3.1.76,local_lock=none,addr=10.1.1.100 0 0
nfsstat -c #查看客户端nfs统计信息
lookup 操作用于查找指定路径的文件或目录。从数据看,该操作的数量较大,占比 3%。
test_stateid: 该操作的数量为 271710649,占比 65%。test_stateid 操作通常用于测试状态 ID。
1.atime 更新访问时间 这个建议别用,会降低nfs的性能 可以加上noatime
2.auto 能够被自动挂载通过-a选项
3.async 异步挂载 sync同步挂载
sync适用在通信比较频繁且实时性比较高的场合,比如Linux系统的rootfs通过nfs挂载,如果搞成async,当执行大型网络通信程序如gdbserver与client之类,则系统此时会无响应,报一些“NFS is not responding“之类的错误。
当然并非sync就比async好,如果在远程挂载点处进行大批量数据生成,如解压一个大型tar包,此时速度会非常慢,我对比了一下在nfs server端解压只需半分多钟,在client端则要40来分钟,性能严重受到影响。
当改成async后,在client端解压只需4分多钟,虽然比server端慢一些但性能已得到很大改善。所以当涉及到很多零碎文件操作时,选用async性能更高。
vim /fstab
10.1.1.115:/data /data nfs auto,async,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
客户端的async 参数控制的是客户端对服务器的读写操作的处理方式。
4.timeo (超时)选项是 NFS 客户端在重新传输数据包(未收到 ACK)之前在 NFS 服务器上等待的时间量。timeo的值以十分之一秒为单位给出,因此如果timeo为5,则 NFS 客户端将等待 0.5 秒再重新传输。默认值为0.7 (0.07 秒)
5.retrans NFS 客户端将尝试重新传输数据包的次数。如果值为5,客户端将重新发送 RPC 数据包五次,两次尝试之间等待timeo秒。如果在最后一次尝试后 NFS 服务器没有响应,您将收到一条消息Server not responding。NFS 客户端然后重置 RPC 传输尝试计数器并以相同的方式再次尝试(相同的timeo和retrans值)
在拥塞的网络上,您经常会看到 RPC 数据包的重传。一个很好的判断方法是运行
nfsstat -r命令并查找标有retrans的列。如果数量很大,则网络可能非常拥塞。如果是这种情况,您可能希望增加timeo和retrans的值以增加尝试次数和 RPC 尝试之间的时间量。虽然执行此操作会降低 NFS 性能,但它可能有助于平衡网络流量,从而减少拥塞。根据我的经验,摆脱拥塞和丢包可以带来更好、更均匀的性能。
6.wsize/rsize 两个 NFS 客户端选项指定用于写入 ( wsize ) 和读取 ( rsize )的数据块的大小。如果您不指定块大小,则默认值由 NFS 版本和所使用的内核决定。如果您已经运行并配置了 NFS,检查当前块大小的最佳方法是运行命令
cat /proc/mounts 在 NFS 客户端上并查找wsize和rsize值。
减小 rsize 和 wsize 可以在一个比较拥塞的网络上通过向每个 NFS 请求发送较短的包列,从而提高 NFS 性能。但是带来一个副作用,就是需要更多的包在网络上发送数据,增加了网络的通信量,同时在服务器和客户机上都增加了 CPU 的开销。
如果您的 NFS 文件系统是通过一个高速网络挂载的,如 SP Switch,则较大的读/写包能提高 NFS 文件系统的性能。在 NFS V3中,rsize 和 wsize 可以设置最大至 65536,缺省值是 32768。
7.NFS文件缓存:
FS-Cache,它将 NFS 服务器上的文件缓存到本地存储设备上,例如硬盘驱动器或 SSD,加快访问速度。当缓存块不命中时,会从服务器重新获取数据并缓存到本地磁盘下来。
添加缓存文件系统FSCache
缓存文件系统是以客户端为中心的。您可以使用客户端上的缓存文件系统来减少服务器负载。使用缓存文件系统,可以从服务器逐块获取文件。文件被发送到客户端的内存并直接进行操作。数据被写回服务器磁盘。
将缓存文件系统添加到客户端安装可为每个客户端提供本地副本。缓存文件系统的/etc/fstab如下所示:
# device device mount FS fsck mount mount
# to mount to fsck point type pass at boot options
server:/usr/dist cache /usr/dist cachefs 3 yes ro,backfstype=nfs,cachedir=/cache
缓存文件系统适用于以读取为主的文件系统的情况,例如应用程序文件系统。此外,您应该使用缓存文件系统在慢速网络上共享数据。与复制服务器不同,缓存文件系统可以与可写文件系统一起使用,但性能会随着写入百分比的上升而降低。如果写入百分比太高,缓存文件系统可能会降低 NFS 性能。
如果您的网络是通过路由器互连的高速网络,您还应该考虑使用缓存文件系统。
如果 NFS 服务器经常更新,请不要使用缓存文件系统,因为这样做会导致比通过 NFS 操作更多的流量。
要监视缓存文件系统的有效性,请使用cachefsstat命令(在Solaris 2.5 及更高版本的操作环境中可用)。
system# /usr/bin/cachefsstat [-z] path
-z初始化统计信息。您应该在再次执行cachfsstat之前执行cachefs -z(仅限超级用户)以收集缓存性能的统计信息。打印的统计信息反映了统计信息重新初始化之前的统计信息。
path是缓存文件系统挂载的路径。如果不指定路径,则使用所有已安装的缓存文件系统。
如果没有-z选项,您可以以常规 UNIX 用户身份执行此命令。由cachefsstat命令提供的统计信息包括缓存命中和未命中、一致性检查和修改操作:
缓存命中率:缓存命中占总尝试次数的百分比(后面是实际命中和未命中的次数)
一致性检查:执行的一致性检查的数量。接下来是通过的数字和失败的数字。
修改:修改操作的数量,包括写入和创建。
cachefsstat命令的示例是:
system% /usr/bin/cachefsstat /home/sam
cache hit rate: 73% (1234 hits, 450 misses)
consistency checks: 700 (650 pass, 50 fail)
modifies: 321
在前面的示例中,文件系统的缓存命中率应高于百分之三十。如果缓存命中率低于百分之三十,则意味着文件系统上的访问模式是广泛随机的或者缓存太小。
一致性检查的输出意味着缓存文件系统会与服务器进行检查以查看数据是否仍然有效。高失败率(15% 到 20%)意味着感兴趣的数据正在快速变化。高速缓存的更新速度可能比适合高速缓存文件系统的更新速度更快。当您使用一致性检查的输出和修改次数时,您可以了解此客户端或其他客户端是否正在进行更改。
修改的输出是客户端将更改写入文件系统的次数。此输出是了解命中率为何较低的另一种方法。高频率的修改操作可能伴随着大量的一致性检查和较低的命中率。
8.NFS文件属性缓存
属性缓存是在客户端上缓存文件的元数据(如权限、属主、属组、访问时间等信息),以减少对服务器的属性查询次数。
ac / noac
选择客户端是否可以缓存文件属性。如果这两个选项均未指定(或者指定了ac),则客户端会缓存文件属性。
为了提高性能,NFS 客户端缓存文件属性。每隔几秒,NFS 客户端就会检查每个文件属性的服务器版本是否有更新。在客户端再次检查服务器之前,在这些小时间间隔内服务器上发生的更改将不会被检测到。
使用noac选项可以在访问相同文件的 NFS 客户端之间提供更高的缓存一致性,但会带来严重的性能损失。
acregmin=n
NFS 客户端在从服务器请求新属性信息之前缓存常规文件属性的最短时间(以秒为单位)。如果未指定此选项,NFS 客户端将使用最少 3 秒。
acregmax=n
NFS 客户端在从服务器请求新属性信息之前缓存常规文件属性的最长时间(以秒为单位)。如果未指定此选项,NFS 客户端将使用最多 60 秒。
acdirmin=n
NFS 客户端在从服务器请求新属性信息之前缓存目录属性的最短时间(以秒为单位)。如果未指定此选项,NFS 客户端将使用最少 30 秒。
acdirmax=n
NFS 客户端在从服务器请求新属性信息之前缓存目录属性的最长时间(以秒为单位)。如果未指定此选项,NFS 客户端将使用最多 60 秒。
actimeo=n
使用actimeo将所有acregmin、acregmax、acdirmin和acdirmax设置为相同的值。如果未指定此选项,NFS 客户端将使用上面列出的每个选项的默认值。
注意: 如果要更改选项,首先必须卸载 NFS 文件系统,更改选项,然后重新安装文件系统。
mount -a 是一个用于挂载(mount)配置文件 /etc/fstab 中所有已定义但尚未挂载的文件系统的命令。不过这东西开机时已经挂载了,你如果没有修改 fstab 增加新的东西那就肯定没输出。 mount -a 会忽略所有已经完成的操作,也就是开机时 fstab 已经挂载后,而且你没有修改 fstab 。你再运行 mount -a ,他会自动忽略全部 fstab 内容。
将同时发起的NFS请求数量修改为128 重启reboot
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
cat /proc/sys/sunrpc/tcp_slot_table_entries
服务器端+客户端 TCP参数设置:
NFS 客户端和 NFS 服务器有很多TCP 参数可以调整。Internet 上的许多文章都讨论了 NFS 和一般网络流量的 TCP 调整选项。确切的值因您的具体情况而异。在这里,我想讨论两个提高 NFS 性能的选项:系统输入和输出队列。
增加输入和输出队列的大小允许通过 NFS 传输更多数据。实际上,您正在增加可以存储数据的缓冲区的大小。内存中可以存储的数据越多,NFS 处理它的速度就越快(即排队的数据越多)。NFS 服务器 NFS 守护进程共享相同的套接字输入和输出队列,因此如果队列较大,则所有 NFS 守护进程都有更多缓冲区并且可以更快地发送和接收数据。
对于输入队列,要修改的两个值是/proc/sys/net/core/rmem_default(读取队列的默认大小,以字节为单位)和/proc/sys/net/core/rmem_max(最大大小读取队列(以字节为单位)。这些值很容易修改:
echo 262144 > /proc/sys/net/core/rmem_default
echo 262144 > /proc/sys/net/core/rmem_max
这些命令将读取缓冲区大小更改为 256KiB(基数 2),这是 NFS 守护进程共享的。您可以对 NFS 守护程序共享的写入缓冲区执行相同的操作:
echo 262144 > /proc/sys/net/core/wmem_default
echo 262144 > /proc/sys/net/core/wmem_max
更改这些值后,您需要重新启动 NFS 服务器才能使它们生效。但是,如果您重新启动系统,这些值将消失并使用默认值。要使这些值在重新启动后仍然存在,您需要在/etc/sysctl.conf 文件中配置。
请注意,增加缓冲区大小并不一定意味着性能会提高。这只是意味着缓冲区大小更大。您将需要使用各种缓冲区大小测试您的应用程序,以确定增加缓冲区大小是否有助于提高性能。
另外nfs处理大量小文件导致的性能不佳:事实上,小文件性能实际上是许多文件性能问题,即当我们在一个文件夹中有大量文件,或者最终只有数百万甚至数十亿个文件时。最好加上缓存,减少网络交互频率。
iostat命令是IO性能分析的常用工具
apt install sysstat
iostat
-c: 显示CPU使用情况
-d: 显示磁盘使用情况
--dec={ 0 | 1 | 2 }: 指定要使用的小数位数,默认为 2
-g GROUP_NAME { DEVICE [...] | ALL } 显示一组设备的统计信息
-H 此选项必须与选项 -g 一起使用,指示只显示组的全局统计信息,而不显示组中单个设备的统计信息
-h 以可读格式打印大小
-j { ID | LABEL | PATH | UUID | ... } [ DEVICE [...] | ALL ] 显示永久设备名。选项 ID、LABEL 等用于指定持久名称的类型
-k 以 KB 为单位显示
-m 以 MB 为单位显示
-N 显示磁盘阵列(LVM) 信息
-n 显示NFS 使用情况
-p [ { DEVICE [,...] | ALL } ] 显示磁盘和分区的情况
-t 打印时间戳。时间戳格式可能取决于 S_TIME_FORMAT 环境变量
-V 显示版本信息并退出
-x 显示详细信息(显示一些扩展列的数据)
-y 如果在给定的时间间隔内显示多个记录,则忽略自系统启动以来的第一个统计信息
常用命令行:
iostat -d -k 1 10 #查看TPS和吞吐量信息(磁盘读写速度单位为KB),每1s收集1次数据,共收集10次
iostat -d -m 2 #查看TPS和吞吐量信息(磁盘读写速度单位为MB),每2s收集1次数据
一个系统的吞度量(承压能力)与request对CPU的消耗、外部接口、IO等等紧密关联。单个reqeust 对CPU消耗越高,外部系统接口、IO影响速度越慢,系统吞吐能力越低,反之越高。
系统吞吐量几个重要参数:QPS(TPS)、并发数、响应时间。 QPS(TPS):每秒钟request/事务 数量 并发数:系统同时处理的request/事务数 响应时间:一般取平均响应时间
QPS(TPS)= 并发数/平均响应时间
iostat -d -x -k 1 10 #查看设备使用率(%util)、响应时间(await)等详细数据, 每1s收集1次数据,总共收集10次
r/s:每秒从设备读取的请求数量(读取操作/秒)
rkB/s:每秒从设备读取的数据量(以千字节为单位)
rrqm/s:每秒从磁盘请求读取的请求数量(合并读请求/秒)
%rrqm:合并的读请求所占总请求数的百分比
r_await:平均每个读请求的等待时间(毫秒)
rareq-sz:单个读请求的平均大小(以千字节为单位)
w/s:每秒向设备写入的请求数量(写入操作/秒)
wkB/s:每秒向设备写入的数据量(以千字节为单位)
wrqm/s:每秒从磁盘请求写入的请求数量(合并写请求/秒)
%wrqm:合并的写请求所占总请求数的百分比
w_await:平均每个写请求的等待时间(毫秒)
wareq-sz:单个写请求的平均大小(以千字节为单位)
d/s:每秒向设备发出的丢弃请求的数量(数据丢失/秒)
dkB/s:每秒从设备丢弃的数据量(以千字节为单位)
drqm/s:每秒从磁盘请求丢弃的请求数量(合并丢弃请求/秒)
%drqm:合并的丢弃请求所占总请求数的百分比
d_await:平均每个丢弃请求的等待时间(毫秒)
dareq-sz:单个丢弃请求的平均大小(以千字节为单位)
f/s:每秒从设备请求失败的数量(失败操作/秒)
f_await:平均每个失败请求的等待时间(毫秒)
aqu-sz:设备请求数队列长度的平均值(调度器队列长度)
%util:设备的活动时间百分比(设备繁忙的时间比例)
iostat -c 1 10 #查看cpu状态,每1s收集1次数据,总共收集10次
将 CPU 的执行时间划分为若干个时间片,每个进程在一个时间片内轮流使用 CPU,当时间片用完后,系统将CPU分配给下一个进程
%user: 表示用户级别的 CPU 使用率,即用于执行用户进程的CPU时间百分比。
%nice: 表示调整过优先级的用户级进程的CPU使用率,这些进程的优先级通过"nice"命令或相关接口调整过。 Nice值的范围从-20到+19(不同系统的值范围是不一样的),正值表示低优先级,负值表示高优先级,值为零则表示不会调整该进程的优先级。
%system: 表示系统级别的 CPU 使用率,即用于执行内核系统进程的 CPU 时间百分比。
%iowait: 表示 CPU 由于等待 I/O 操作而闲置的时间百分比,包括等待磁盘 I/O、网络 I/O 等。
%steal: 表示当宿主机是一个虚拟化服务器时,被其他虚拟操作系统占用("偷取")的 CPU 时间百分比。
%idle: 表示 CPU 空闲时间的百分比,即 CPU 没有执行任何任务的时间百分比。
拓展:
top命令(推荐htop 可以看每个核的cpu使用率) cpu 百分比参数含义:%Cpu(s): 0.1 us, 0.2 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
us (user):表示用户空间程序执行的时间百分比。
sy (system):表示系统内核程序执行的时间百分比。
ni (nice):表示执行“nice”命令调整过优先级的用户空间程序的时间百分比。 Nice值的范围从-20到+19(不同系统的值范围是不一样的),正值表示低优先级,负值表示高优先级,值为零则表示不会调整该进程的优先级。
id (idle):表示 CPU 空闲时间的百分比。
wa (wait):表示 CPU 等待 I/O 操作的时间百分比。
hi (hardware interrupts):表示 CPU 处理硬件中断的时间百分比。
si (software interrupts):表示 CPU 处理软件中断的时间百分比。
st (steal):表示当宿主机是一个虚拟化服务器时,被其他虚拟操作系统占用("偷取")的 CPU 时间百分比。
性能分析
I/O瓶颈
如果%iowait的值过高,表示硬盘可能存在I/O瓶颈。还需结合其他参数具体分析,解释如下:
%iowait是%idle的一个子集,其计算方法是这样的:
如果 CPU 此时处于 idle 状态,内核会做以下检查 - 1、是否存在从该 CPU 发起的一个未完成的本地磁盘IO请求 - 2、是否存在从该 CPU 发起的网络磁盘挂载的操作
如果存在以上任一情况,则 iowait 的计数器加 1,如果都没有,则 idle 的计数器加 1。
也就是说: 如果当前有进程在等待 I/O 请求的话,那么增加 iowait 的时间。如果当前没有进程在等待 I/O 请求的话,那么增加 idle 的时间。
所以正确解释是:有进程在等待 IO,被阻塞了,并且当前系统是空闲的,没有其他进程在运行。
内存不足
%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU在等待分配内存,此时应加大内存容量
CPU资源不足
如果%idle值持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU
IOPS 计算
计算方式: r/s+w/s
I/O per second,即每秒钟可以处理的I/O个数。
随机读写频繁的应用(一般指I/O小于64KB的应用场景),如小文件存储(图片)、OLTP数据库、邮件服务器,关注随机读写性能,IOPS是关键衡量指标。
吞吐量 计算
计算方式: rkB/s+wkB/s
顺序读写频繁的应用,传输大量连续数据,如电视台的视频编辑,视频点播VOD(Video On Demand),关注连续读写性能。数据吞吐量是关键衡量指标。
其他IO分析工具:
pidstat -d 1 -p 500 //按进程展示io信息 -d 间隔1s -p 指定进程号
iotop //监视系统中各进程磁盘 I/O 活动,可排序
iperf3 -s //服务器端监听5201
客户端测试:
iperf3 -c 10.1.1.100 -P 1 -n 1000M // -P 传输线程总数 -n 传输数据总量
网卡的带宽速率维持在80Mbits/sec左右,而测试的服务器是千兆网卡,这个测试值也基本合理。
在输出的最后,iperf还给出了总的数据发送、接收量,并给出了带宽速率平均值。通过这些值,基本可以判断网络带宽是否正常,网络传输状态是否稳定。
interval传输间隔 Transfer传输数据量 Bitrate传输速率 Retr 重试 Cwnd拥塞窗口
Connecting to host 10.1.1.115, port 5201
[ 5] local 10.3.1.172 port 51808 connected to 10.1.1.115 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 9.57 MBytes 80.3 Mbits/sec 0 199 KBytes
[ 5] 1.00-2.00 sec 11.7 MBytes 97.8 Mbits/sec 0 199 KBytes
[ 5] 2.00-3.00 sec 9.67 MBytes 81.1 Mbits/sec 0 199 KBytes
[ 5] 3.00-4.00 sec 11.5 MBytes 96.2 Mbits/sec 1 222 KBytes
[ 5] 4.00-5.00 sec 7.25 MBytes 60.8 Mbits/sec 0 222 KBytes
[ 5] 5.00-6.00 sec 8.56 MBytes 71.8 Mbits/sec 0 222 KBytes
[ 5] 6.00-7.00 sec 8.30 MBytes 69.6 Mbits/sec 0 222 K
dd if=/dev/zero of=/tmp/testfile bs=1G count=1
nfs挂载 10.1.1.115/data /nfs-data/data
测试写入速度:dd if=/dev/zero of=/data/testfile bs=1G count=1
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 42.0247 s, 25.6 MB/s
测试读取速度:dd if=/nfs-data/data/testfile of=/dev/null bs=10M count=1
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.972609 s, 1.1 GB/s
if=文件名:输入文件名,默认为标准输入。即指定源文件。
of=文件名:输出文件名,默认为标准输出。即指定目的文件。
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
/dev/null,它是一种特殊的虚拟设备,用于写入而不是读取,写入/dev/null的任何内容都会从操作系统中消失,可以把它视为一个“黑洞”。
/dev/zero,它也是一种特殊的虚拟设备,用于读取而不是写入,当读取该文件时,他会提供无限的空字符null。
NFS日志是NFS服务器生成的日志,常常用于分析NFS服务的性能和问题,如拥有瓶颈的文件系统或网络故障等。NFS日志记录了NFS服务器和客户端之间交换的信息和事件,这些信息和事件可以帮助管理员分析和诊断系统问题。
/var/log/syslog:这个日志文件是系统的主要日志文件,包括了各种系统事件和服务的日志信息。NFS的相关信息也会记录在这个文件中。
/var/log/auth.log:这个日志文件主要用于记录认证和授权相关的日志信息。如果在NFS的设置中启用了身份验证机制(如基于用户或主机的身份验证),那么相关的日志信息会记录在这个文件中。
NFS日志的格式通常是: 时间戳 | 主机名 | 进程号 | 消息级别 | 消息内容
Sep 15 18:38:51 localhost kernel: [ 2.221981] nfsd: last server has exited
在这个例子中,事件发生的时间为9月15日18点38分51秒;事件发生在名为localhost的主机上;事件所涉及的进程号是内核;消息级别为“kernel”,表示事件的严重程度为内核级别;消息内容是“nfsd: last server has exited”,表示NFS服务器的最后一个服务器已退出。
NFS日志通常记录了NFS服务器和客户端之间的交互信息和事件,主要包括以下几个方面:
(1)连接信息:NFS服务器和客户端的连接信息,如IP地址、主机名等。
(2)文件访问信息:NFS客户端对NFS服务器上的文件进行的访问操作,如读、写、删除等。
(3)缓存信息:NFS客户端对文件进行缓存的操作,如缓存文件的读、写、刷新等。
(4)错误信息:NFS客户端请求NFS服务器时所产生的错误信息,如访问权限错误、NFS服务器忙等。