我正在生成最终通过 NFS v4.2 在 10Gb 网络上复制到服务器的数据(100GB 文件)。这些文件存储在许多 HDD 上,采用 XFS 格式(每个目标驱动器一个副本)。
当复制任务正在运行时:
- 客户端内存使用量很大(可能超过 64GB,它需要尽可能多的内存)。
- 但是服务器上几乎没有使用内存。
我想减少客户端的内存使用量,因为它们会不断产生数据并且会减慢它们的速度。相反,服务器主要是未使用的。
我想由于服务器上的 HDD 速度很慢,客户端会缓冲尽可能多的数据以减少副本阻塞。我无法更改硬件设置。
有没有办法强制服务器缓存更多数据? 我宁愿优先使用服务器内存而不是客户端内存。
NFS 配置:
10.0.3.1:/ /mnt/field nfs nfsvers=4.2,noatime,nodiratime,_netdev,noauto,x-systemd.automount,x-systemd.mount-timeout=10 0 0
/etc/exports
:
/mnt 10.0.0.0/16(rw,async,fsid=0,no_subtree_check,crossmnt)
服务器上的网卡配置:
MTU 9000
rinbuffer tx 512, rx 1024
客户端网卡配置:
MTU 9000
rinbuffer tx 1024, rx 512
编辑: 根据要求,/proc/meminfo:
客户端服务器 - - - -------------------------
此客户端上的内存使用情况的监视器:
网络使用:
注意:客户端使用大 tmpfs (100GB) 来计算。我认为这个 tmpfs 永远不会从可用内存计数中减去。
编辑2:
网络和内存使用之间的相关性在另一个客户端上更为明显(我应该从那个开始)。此客户端不使用任何 tmpfs。
你怎么会知道这事?大多数客户端内存都在页面缓存中,这是完全正常的,即使改进服务器上的缓冲也不会阻止该数据客户端的积极缓存。
您是否尝试过刷新页面缓存(作为测试)并查看您的应用程序在不使用页面缓存的情况下如何执行?
NFS 具有所谓的“接近打开”一致性,这意味着数据和元数据的内容只有在您没有主动打开文件时才能真正保证稳定(也就是说,另一个客户端可以在另一个客户端上更改文件)系统,你不会更聪明)。
由于这种一致性限制,NFS 客户端系统应用程序依赖页面缓存来确保数据可用于在必要时进行回读。
/etc/exports
话虽如此,但在不知道将更多数据卸载到服务器的一种方法中发生了什么的情况下,可能是确保您使用sync
mount 选项在客户端上安装 NFS,并在服务器上使用 mount 选项导出路径async
。这将确保在客户端将写入提交到服务器,而服务器将始终在将数据提交到磁盘之前回复“完成”。
这将影响客户端的吞吐量,因为您会由于验证客户端上的每个请求而导致延迟,但是服务器将缓冲更多的数据,因为它不会等待数据首先降落在磁盘上。您可能还想
dirty_write_centisecs
在服务器上旋转和其他位,以允许它缓冲更多数据到写回中。不过问题就在这里——这可能会导致客户端速度变慢,并在崩溃时降低服务器的完整性。如果服务器崩溃,您可能会丢失数据。
此外,这不会影响 NFS 无法真正控制的客户端上页面缓存的内存使用。
总而言之,我怀疑减少客户端内存使用量(如果它是您在此处测量的页面缓存)将提高您的客户端性能。
不,强制使用更少的内存可能会使事情变慢,而不是更快。您已经在 188 GB 的快速 DRAM 上消费,不妨使用它。
客户端主机有 188 GB MemTotal,其中 162 GB 用于缓存。实际上内存需求很低,注意 123 GB MemAvailable 可以很快释放。40 GB 的 Shmem 中的大部分可能是 tmpfs。
由于 Cached + Shmem 加起来超过 MemTotal,我怀疑 tmpfs 被计算了两次,分别是共享内存和缓存。还将解释 Cached 减去 Shmem 如何近似于 MemAvailable,无法释放缺少持久存储的 tmpfs。
服务器端,15 GB 并更改 MemTotal,缓存中的 13 GB。此主机上有大量可用内存。据推测,它所做的大部分工作都是为文件服务,而不是其他很多内存需求。
如果没有开销证据,例如繁重的 vmscan 活动或 MemAvailable 运行不足,我不建议采取行动。