我已经设置了一个 NFSv4 服务器。我正在与 VM 场中的 Linux 计算机以及 Windows 7、8 和 10 计算机共享文件,因此我需要同时与 NFS 和 Samba 1共享文件。过去,我通过配置一台可直接访问底层 ext4 文件系统的 NFS 计算机并配置一个单独的 Samba 服务器来挂载 NFS 导出并共享它们2来实现这一点。
我想将文件共享统一到一台服务器上。至关重要的是,我需要确保 NFS 和 Samba 不会互相踩踏文件,无视锁。因此,我必须继续使用 Samba在之上NFS 而非在平行下使用 NFS。
这似乎微不足道。NFS 服务器应该简单地安装自己的共享,就像 Samba 服务器所做的那样,然后同一台机器必须运行 Samba 并导出已安装的共享。唯一的不同似乎是流量不需要在两台机器之间通过网络传输。我希望有更好的性能。
相反,NFS 服务器会饱和机器上的 CPU,同时仅 2.5 MB/s表现!
top - 11:34:57 up 15 days, 1:18, 1 user, load average: 32.09, 8.07, 2.74
Tasks: 101 total, 13 running, 88 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.6 us, 93.7 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.7 si, 0.0 st
KiB Mem : 899776 total, 124840 free, 184624 used, 590312 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 261184 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11058 root 20 0 0 0 0 R 11.5 0.0 5:53.84 nfsd
11061 root 20 0 0 0 0 R 11.5 0.0 5:53.88 nfsd
11057 root 20 0 0 0 0 R 11.2 0.0 5:53.72 nfsd
11059 root 20 0 0 0 0 R 11.2 0.0 5:53.78 nfsd
11060 root 20 0 0 0 0 R 11.2 0.0 5:53.80 nfsd
11062 root 20 0 0 0 0 R 11.2 0.0 5:53.86 nfsd
11064 root 20 0 0 0 0 R 11.2 0.0 9:23.40 nfsd
11063 root 20 0 0 0 0 R 10.9 0.0 6:00.00 nfsd
我所知道的唯一表明有问题的其他迹象是,无数行内容被写入 /var/log/messages,看起来或多或少类似于此。
Apr 25 11:35:01 nas kernel: nfsv4 compound op #4/4: 9 (OP_GETATTR)
Apr 25 11:35:01 nas kernel: nfsd: fh_verify(36: 01070001 00060001 00000000 9509b6fe 7a49ad56 5a4d5dbc)
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dbf606a080 opcnt 4 #4: 9: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound returned 0
Apr 25 11:35:01 nas kernel: --> nfsd4_store_cache_entry slot ffff88db7bbae000
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dac5072080 opcnt 4 #2: 22: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound op #3/4: 38 (OP_WRITE)
Apr 25 11:35:01 nas kernel: nfsd: write complete host_err=131072
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dac5072080 opcnt 4 #3: 38: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound op #4/4: 9 (OP_GETATTR)
Apr 25 11:35:01 nas kernel: nfsd: fh_verify(36: 01070001 00060001 00000000 9509b6fe 7a49ad56 5a4d5dbc)
Apr 25 11:35:01 nas kernel: nfsd_dispatch: vers 4 proc 1
Apr 25 11:35:01 nas kernel: nfsv4 compound op #1/4: 53 (OP_SEQUENCE)
Apr 25 11:35:01 nas kernel: __find_in_sessionid_hashtbl: 1555688119:2835816624:106:0
Apr 25 11:35:01 nas kernel: nfsd4_sequence: slotid 5
Apr 25 11:35:01 nas kernel: check_slot_seqid enter. seqid 9615 slot_seqid 9614
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dbf606a080 opcnt 4 #1: 53: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound op #2/4: 22 (OP_PUTFH)
Apr 25 11:35:01 nas kernel: nfsd: fh_verify(36: 01070001 00060001 00000000 9509b6fe 7a49ad56 5a4d5dbc)
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88db7b529080 opcnt 4 #4: 9: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound returned 0
Apr 25 11:35:01 nas kernel: --> nfsd4_store_cache_entry slot ffff88db7bbaf000
Apr 25 11:35:01 nas kernel: nfsd_dispatch: vers 4 proc 1
Apr 25 11:35:01 nas kernel: nfsv4 compound op #1/4: 53 (OP_SEQUENCE)
Apr 25 11:35:01 nas kernel: __find_in_sessionid_hashtbl: 1555688119:2835816624:106:0
Apr 25 11:35:01 nas kernel: nfsd4_sequence: slotid 1
Apr 25 11:35:01 nas kernel: check_slot_seqid enter. seqid 9626 slot_seqid 9625
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88db7b529080 opcnt 4 #1: 53: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound op #2/4: 22 (OP_PUTFH)
Apr 25 11:35:01 nas kernel: nfsd: fh_verify(36: 01070001 00060001 00000000 9509b6fe 7a49ad56 5a4d5dbc)
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dbf606f080 opcnt 4 #4: 9: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound returned 0
Apr 25 11:35:01 nas kernel: --> nfsd4_store_cache_entry slot ffff88db291eb000
Apr 25 11:35:01 nas kernel: nfsd_dispatch: vers 4 proc 1
Apr 25 11:35:01 nas kernel: nfsv4 compound op #1/4: 53 (OP_SEQUENCE)
Apr 25 11:35:01 nas kernel: __find_in_sessionid_hashtbl: 1555688119:2835816624:106:0
Apr 25 11:35:01 nas kernel: nfsd4_sequence: slotid 2
Apr 25 11:35:01 nas kernel: check_slot_seqid enter. seqid 9614 slot_seqid 9613
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dbf606f080 opcnt 4 #1: 53: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound op #2/4: 22 (OP_PUTFH)
Apr 25 11:35:01 nas kernel: nfsd: fh_verify(36: 01070001 00060001 00000000 9509b6fe 7a49ad56 5a4d5dbc)
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dac507e080 opcnt 4 #2: 22: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound op #3/4: 38 (OP_WRITE)
Apr 25 11:35:01 nas kernel: nfsd: write complete host_err=131072
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dac507e080 opcnt 4 #3: 38: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound op #4/4: 9 (OP_GETATTR)
Apr 25 11:35:01 nas kernel: nfsd: fh_verify(36: 01070001 00060001 00000000 9509b6fe 7a49ad56 5a4d5dbc)
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dac5072080 opcnt 4 #4: 9: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound returned 0
Apr 25 11:35:01 nas kernel: --> nfsd4_store_cache_entry slot ffff88dbf65cc000
Apr 25 11:35:01 nas kernel: nfsd_dispatch: vers 4 proc 1
Apr 25 11:35:01 nas kernel: nfsv4 compound op #1/4: 53 (OP_SEQUENCE)
Apr 25 11:35:01 nas kernel: __find_in_sessionid_hashtbl: 1555688119:2835816624:106:0
Apr 25 11:35:01 nas kernel: nfsd4_sequence: slotid 4
Apr 25 11:35:01 nas kernel: check_slot_seqid enter. seqid 9584 slot_seqid 9583
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dac5072080 opcnt 4 #1: 53: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound op #2/4: 22 (OP_PUTFH)
Apr 25 11:35:01 nas kernel: nfsd: fh_verify(36: 01070001 00060001 00000000 9509b6fe 7a49ad56 5a4d5dbc)
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dbf606a080 opcnt 4 #2: 22: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound op #3/4: 38 (OP_WRITE)
Apr 25 11:35:01 nas kernel: nfsd: write complete host_err=131072
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dbf606a080 opcnt 4 #3: 38: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound op #4/4: 9 (OP_GETATTR)
Apr 25 11:35:01 nas kernel: nfsd: fh_verify(36: 01070001 00060001 00000000 9509b6fe 7a49ad56 5a4d5dbc)
我没有通过 127.0.0.1 在本地挂载 NFS 共享。本地 NFS 挂载使用机器本身的私有 IP 地址。我可以更改这一点,但这需要在 NFS 导出定义中增加额外的复杂性,而且我实际上更希望这台机器以与将要挂载 NFS 共享的其他机器完全相同的方式看待自己3。
脚注
- 我知道在 Windows 上使用 NFS 客户端和在 Linux 上使用 Samba 客户端的方法。在这种情况下,这些选项不可行。
- 我知道有关使用 Samba 重新导出 NFS 共享的警告,但我和我认识的许多其他系统管理员经常这样做,没有问题。问题似乎出现在这里,而是因为 NFS 服务器正在安装自己的共享。尽管如此,我很好奇这些警告的确切原因,所以如果你知道,请分享。
- 如果有人能说出整个架构存在根本缺陷的原因,我很乐意听听。我有多年使用两台机器在 NFS 上运行 Samba 的经验,所以我认为我可以切掉 Samba 机器,将 Samba 移动到具有 NFS 自挂载的 NFS 服务器机器上。
答案1
您的工作量很可能因时间安排而枯竭。您要求吨将文件系统导出回其自身,然后再次导出该导出时,在同一系统上进行上下文切换。
您可能会发现,将此工作负载分散到多个内核(不共享同一 CPU 核心的内核)上可以提高性能,尽管这些系统之间存在网络链接。
这可以通过并置虚拟机集轻松实现;一个运行 NFS,一个运行 Samba。在同一个虚拟机管理程序上并置这些虚拟机应该可以消除大多数网络延迟,并且只要这些虚拟机不共享相同的 CPU 核心,就可以很好地工作。
NFS 也有用户空间实现 - NFS Ganesha 是一种非常常见的实现。但是,Samba 还将负责大量这种重复的用户空间-内核切换。如果这些工作负载出于某种原因必须共享内核,则 NFS Ganesha 可能值得测试。
简而言之,减少同一系统内的上下文切换应该会对此有很大帮助。