NFS 伺服器作為其自身的客戶端,性能很差
我已經設置了 NFSv4 伺服器。我正在與 VM 場中的 Linux 機器和 Windows 7、8 和 10 機器共享文件,因此我需要與 NFS 和 Samba 1共享文件。過去,我通過配置 NFS 機器來直接訪問底層 ext4 文件系統並配置一個單獨的 Samba 伺服器來安裝 NFS 導出並共享它們2。
我想將文件共享統一到一台伺服器上。至關重要的是,我需要確保 NFS 和 Samba 沒有踩到對方的文件,幸福地忽略了鎖。因此,我必須繼續在 NFS之上使用 Samba,而不是與 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 伺服器機器上。
您的工作負載很可能會因調度而死亡。在將文件系統導出回自身然後再次導出該導出時,您要求在同一系統上進行大量上下文切換。
您可能會看到,將這個工作負載拆分到多個核心(不共享相同 CPU 核心的核心)會導致性能提升,儘管這些系統之間涉及到網路連結。
這可以通過並置的 VM 集輕鬆實現;一台執行 NFS,一台執行 Samba。將這些配置在同一個虛擬機管理程序上應該可以消除大多數網路延遲,並且如果這些虛擬機不共享相同的 CPU 核心,應該可以很好地工作。
NFS 還有一些使用者空間實現——NFS Ganesha 是一種非常常見的實現。然而,Samba 也將負責大量這種重複的使用者空間-核心切換。如果這些工作負載由於某種原因絕對必須共享一個核心,那麼 NFS Ganesha 可能值得測試。
簡而言之,減少同一系統內的上下文切換應該對此有很大幫助。