我正在生成数据(100GB 文件),这些数据最终通过 10Gb 网络上的 NFS v4.2 复制到服务器。这些文件存储在许多硬盘上,采用 XFS 格式(每个目标驱动器一个副本)。
当复制任务正在运行时:
- 客户端内存占用巨大(可能超过 64GB,它会占用尽可能多的内存)。
- 但服务器上几乎没有使用任何内存。
我想减少客户端的内存使用量,因为它们不断产生数据,这会减慢它们的速度。相反,服务器基本上不使用。
我猜是因为服务器上的硬盘速度很慢,所以客户端会缓冲尽可能多的数据,以减少复制阻塞。我无法更改硬件设置。
有什么方法可以强制服务器缓存更多数据? 我倾向于优先使用服务器内存而不是客户端内存。
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。
答案1
我想减少客户端的内存使用量,因为它们不断地产生数据,这会降低它们的速度。
您怎么知道的?大多数客户端内存都在页面缓存中,这是完全正常的,即使改善服务器上的缓冲也无法阻止客户端积极缓存此数据。
您是否尝试过刷新页面缓存(作为测试)并查看应用程序在不使用页面缓存的情况下的运行情况?
NFS 具有所谓的“接近打开”一致性,这意味着当您没有主动打开文件时,数据和元数据的内容实际上只能保证稳定(也就是说,另一个客户端可以在另一个系统上更改文件而您却一无所知)。
由于这种一致性限制,NFS 客户端系统应用程序依赖页面缓存来确保在必要时可以读回数据。
话虽这么说,如果不知道您在服务器上发生了什么,那么/etc/exports
将更多数据卸载到服务器上的一种方法可能是确保使用sync
mount 选项在客户端上挂载 NFS,并在服务器上使用 mount 选项导出路径async
。
这将确保在客户端将写入提交给服务器,而服务器在将数据提交到磁盘之前始终回复“完成”。
这会影响客户端的吞吐量,因为您会因为在客户端验证每个请求而导致延迟,但服务器会缓冲更多数据,因为它不会等待数据先进入磁盘。您可能还想调整dirty_write_centisecs
服务器上的其他位,以允许它将更多数据缓冲到写回中。
但问题在于——这可能会导致客户端速度变慢,并在服务器崩溃时降低服务器的完整性。如果服务器崩溃,您可能会丢失数据。
此外,这不会影响 NFS 无法真正控制的客户端页面缓存的内存使用情况。
总而言之,我怀疑减少客户端的内存使用量(如果您在此处测量的是页面缓存)是否会提高客户端的性能。
答案2
不,强制使用较少的内存可能会使速度变慢,而不是变快。您已经在 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 不足,我不建议采取行动。