ファイルサーバ

【比較】NFSとCIFS/SMBの仕組みと違い,速度

ファイル共有プロトコル NFS と CIFS/SMB の歴史と特徴

NAS (Network Attached Storage) とは、IP ネットワーク越しにファイル格納場所にアクセスする方式のストレージ全般を指します。

NAS と似た言葉に SAN (Storage Area Network) ストレージがありますが、NAS と SAN ストレージの違いについては以下をご参照ください。

【図解】ファイルストレージとブロックストレージの仕組みと違い ~接続方法やメリット/デメリット~
ファイルストレージとブロックストレージ ストレージは大きく分けて 2 種類ありま...

上の記事にもある通り、NAS は自分のディスクの中でファイルシステムを構築し、NAS の OS 自体がファイルシステムを認識し、リモートの OS からは NFS や CIFS/SMB といったファイル共有プロトコルを介してファイル単位でアクセスされます。

NFS は主に UNIX/Linux 系の OS で発展したファイル共有プロトコルです。1984年にサン・マイクロシステムズにより規格が発表されて以来、発展を続け、現在の最新バージョンは 4.2 です。

一方、CIFS/SMB は Windows OS で発展したファイル共有プロトコルです。IBM が前身を作り、その後に Microsoft や Intel, 3COM 等とともに規格化されたプロトコルです。

初期は CIFS (読み方: しふす、Common Internet File Systems) という名称でしたが、SMB (読み方: えすえむびー、Server Message Block) バージョン 2 が登場して以来、『SMB1.0 = 拡張された CIFS』というのが MS の公式見解です。

[MS-SMB]: Introduction
The Server Message Block (SMB) Version 1...

The extended CIFS Protocol is known as the Server Message Block (SMB) Version 1.0 Protocol.

なので基本的には CIFS は古い呼び方で、SSL/TLS の SSL に当たるような存在でしょう。

SMB の最新バージョンは 3.1.1 です。

どちらも NAS としてよく使われるものですが、どのように異なるのでしょうか。

NFS と CIFS/SMB の特徴と違い

結論としては、NFSv3 までは「UNIX/Linux のマシン同士を手軽に共有する」という「マシンベース」の考え方でしたが、NFSv4 では CIFS/SMB と同様、「ユーザがファイルへアクセスする」という「ユーザベース」のコンセプトになり、だいぶ似てきました。

比較表を以下に示します。

CIFS/SMBNFSv4NFSv3
仕様MS にて公開
CIFS / SMB
RFC にて公開
v4.2=RFC7862
v4.1=RFC7530
v4=RFC3530
RFC にて公開
RFC1813
プロトコルポートTCP/445TCP/2049TCP&UDP/2049+動的
認証モデルユーザベースユーザベースマシンベース
認証方式NTLM
Kerberos v5
AUTH_SYS (UNIX 認証)
RPCSEC_GSS (Kerberos v5)
AUTH_SYS (UNIX 認証)
メッセージ認証
(通信改ざん検知)
オプション (SMB暗号化)
AES128-GCM/CCMにより
メッセージ認証+通信暗号化
オプション (krb5i, krb5p)
krb5i=メッセージ認証のみ、
krb5p=メッセージ認証+通信暗号化
なし
通信暗号化なし
ファイルロックNativeにサポートNativeにサポートlockd, statdにて実現
(別機構)

※アクセス制御に関してはあくまでプロトコルでの制御の話であり、実際にはこれに加えてサーバ内ファイルシステム (NTFS, XFS, ext4 等) のアクセス権にも制御されます。

Windows と Linux の実装状況

Windows と Linux のクライアント、サーバで NFS と SMB の両方に対応しています。つまり混在環境は実現できます。ただし、Windows クライアントでは NFS は v3 まで、Windows サーバでは NFS v4.1 までしか対応しておらず、Windows 系はやはり SMB が強いです

混在環境でのファイルサーバを作るなら SMB のほうがお勧めです。

2020年12月現在の Windows, CentOS (Linux) での各プロトコルのバージョン対応状況を下表に示します。

CentOS8.2 に関しては SMB クライアントは cifs-utils (読み方: しふすゆーてぃるず) 6.8-3.el8、SMB サーバは samba (読み方: さんば) 4.11.2-13.el8 で確認しました。

OSSMBNFS
クライ
アント
サーバクライ
アント
サーバ
Windows10v3.1.1v3.1.1v3- (非対応)
Windows Server 2019v3.1.1v3.1.1v3v4.1
CentOS 8.2.2004v3.1.1v3.1.1v4.2v4.2

速度

じゃあ速度はどうなのよ?ということで検証してみました。

結論としてはほぼ変わらない、という結果でした。(やや smb が速いか)

以下の条件で検証してみました。

  • Windows Server 2019 で CIFS/SMB サーバとNFS サーバを設定
  • Windows 10 と CentOS8.2 を CIFS/SMB クライアント, NFS クライアントとして設定
  • クライアントからサーバへマウントし、ファイルをアップロード/ダウンロードしたときに掛かった秒数を計測
  • ファイルは [ 500MiB を 1 ファイル] [1MiB を 500 ファイル] の 2 パターン
  • 5回計測し、平均値を算出
  • CentOS8.2 での NFS クライアントの挙動としてキャッシュを使う動きが見られたため、ダウンロード実施後に echo 3 > /proc/sys/vm/drop_caches でキャッシュをクリアしました。

結果は以下の通りです。Win 10 は NFS v3 までしか対応していないため、パフォーマンスは悪いです。プロトコルとしての比較なら CentOS での結果を比較を見るのがよいでしょう。

クライ
アント
サーバProtocolUp/DownData秒数
(5回平均)
win10win2019smb v3.1.1Upload500MiB*1ファイル1.494
1MiB*500ファイル4.666
Download500MiB*1ファイル1.642
1MiB*500ファイル4.380
nfs v3Upload500MiB*1ファイル5.444
1MiB*500ファイル13.158
Download500MiB*1ファイル4.858
1MiB*500ファイル13.826
cent8.2smb v3.1.1Upload500MiB*1ファイル3.394
1MiB*500ファイル5.62
Download500MiB*1ファイル2.002
1MiB*500ファイル2.772
nfs v4.1Upload500MiB*1ファイル3.712
1MiB*500ファイル5.864
Download500MiB*1ファイル1.996
1MiB*500ファイル3.154

同様に、サーバを CentOS8.2 にして計測した結果を示します。

クライ
アント
サーバProtocolUp/DownData秒数
(5回平均)
win10cent8.2smb v3.1.1Upload500MiB*1ファイル2.512
1MiB*500ファイル5.354
Download500MiB*1ファイル1.554
1MiB*500ファイル4.036
nfs v3Upload500MiB*1ファイル2.908
1MiB*500ファイル24.266
Download500MiB*1ファイル2.176
1MiB*500ファイル2.862
cent8.2smb v3.1.1Upload500MiB*1ファイル4.540
1MiB*500ファイル6.130
Download500MiB*1ファイル1.958
1MiB*500ファイル2.868
nfs v4.2Upload500MiB*1ファイル4.624
1MiB*500ファイル6.166
Download500MiB*1ファイル1.566
1MiB*500ファイル2.182

なお、検証環境は以下の通りです。

[ Virtual BOX を動作させるホスト PC ]

  • CPU: Intel(R) Core(TM) i7-10750H CPU @ 2.60GHz 2.59 GHz
  • Mem: 32 GB
  • SSD: INTEL SSDPEKNW010T9
  • OS: Windows 10 Home (20H2)
  • VirtualBOX: 6.1.14 r140239 (Qt5.6.2)

[ VM のリソース (クライアント/サーバ共通) ]

  • CPU: 2 core
  • Mem: 4 GB
  • Disk: Windows = 50 GB, CentOS = 8 GB

今回の構成ではこのような結果になりましたが、ネットワーク遅延 (RTT) のある環境、アクセス制御をおこなった環境などでは異なるかもしれませんのでごめんあそばせ。

コメント

タイトルとURLをコピーしました