はじめに (対象読者・この記事でわかること)
本記事は、CentOSとWindowsを同時に利用しているシステム管理者やDevOpsエンジニアを対象にしています。特に、共有フォルダ(SMB・CIFSやNFS)を介した大容量ファイルのコピーやバックアップで、転送速度がボトルネックになるケースに悩んでいる方に最適です。この記事を読むことで、以下が実現できるようになります。
- SMB/NFS の基本的な仕組みとボトルネック要因の把握
- ネットワークカードやスイッチ側のチューニング手順
- マルチスレッドコピーや圧縮転送など、実務ですぐに適用できる高速化テクニック
筆者自身が社内の大量データ移行プロジェクトで直面した遅延問題を解決した経験をもとに、実践的な設定例とトラブルシューティング情報をまとめました。
前提知識
この記事を読み進める上で、以下の知識があるとスムーズです。
- 基本的な Linux コマンド(ls、mount、sysctl 等)の操作
- Windows のファイル共有設定(SMB/CIFS)に関する基礎知識
- ネットワークインターフェースの基本的な概念(MTU、デュプレックスモード等)
共有フォルダ高速化の背景と基本概念
CentOS と Windows の間でファイルをやり取りする際、一般的に SMB(Server Message Block) が利用されます。SMB は Windows の標準プロトコルであり、Linux 側では cifs-utils パッケージを介してマウントします。一方、NFS(Network File System)を利用すると、Unix 系 OS 同士の転送に最適化されたプロトコルとして高速化が期待できますが、Windows 側で NFS クライアントを有効化する必要があります。
高速化の鍵は大きく 3 つに分けられます。
-
プロトコル選択と設定最適化
- SMB の場合はvers=3.0以降を使用し、暗号化や大きな read/write バッファを有効にします。
- NFS の場合はrsize/wsizeを大きく設定し、async モードを活用します。 -
ネットワークレイヤーのチューニング
- MTU(Maximum Transmission Unit)を Jumbo Frame(9000 バイト)に拡張し、パケット数を減らす。
- TCP ウィンドウサイズや自動チューニング (net.core.rmem_max、net.core.wmem_max) を拡張。 -
コピー方式の最適化
-rsyncの--inplaceと--whole-fileオプションで差分計算をスキップ。
-pvmoveやbbcpといったマルチスレッド対応ツールで同時転送数を増やす。
- 圧縮転送 (ssh -C、pigz等) により実効帯域を向上させる。
この 3 つの観点を組み合わせることで、単純にファイルをコピーするだけのときに比べ、転送速度が 2 倍以上に向上するケースが多数報告されています。
高速化の実践手順と設定例
以下では、実際に CentOS 9 と Windows Server 2022 の環境で SMB 共有フォルダを高速化する手順をステップごとに示します。NFS の場合は補足で設定例を掲載します。
ステップ 1:SMB サーバ側(Windows)の設定
- SMB 3.1.1 の有効化
管理者権限で PowerShell を起動し、以下を実行します。
powershell
Set-SmbServerConfiguration -EnableSMB2Protocol $true -EnableSMB3Protocol $true
Set-SmbServerConfiguration -EncryptData $true # データ暗号化を有効化
-
共有フォルダの作成と高度な設定
- エクスプローラでフォルダを右クリック → 「プロパティ」 → 「共有」 → 「高度な共有」
- 「キャッシュされたオフライン ファイル」や「最大オフラインサイズ」を無制限に設定。
- 「SMB 直列化(Signing)を無効にする」ことでオーバーヘッド削減(セキュリティ要件に応じて判断)。 -
レジストリでチューニングパラメータを調整(必要に応じて)
reg
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters]
"Size"=dword:00000002 # 2MB のバッファサイズに拡張
"MaxMpxCt"=dword:00FF # 同時接続数を増やす
ステップ 2:CentOS 側のマウント設定
- cifs-utils のインストール
bash
sudo dnf install -y cifs-utils
- /etc/fstab に高速マウントエントリを追加
//win-server/share /mnt/winshare cifs credentials=/etc/smb-cred,vers=3.1.1,iocharset=utf8,cache=none,actimeo=0,soft,rsize=1048576,wsize=1048576,username=YOUR_USER,password=YOUR_PASS 0 0
rsize/wsizeを 1 MiB に拡張し、I/O バッファを大きくします。cache=noneとactimeo=0でキャッシュの無効化(リアルタイム性が必要な場合)。
- マウント確認
bash
sudo mount -a
df -h /mnt/winshare
ステップ 3:ネットワークレイヤーのチューニング
- Jumbo Frame の有効化(スイッチと NIC が対応していることが前提)
bash
sudo ip link set dev eth0 mtu 9000
ethtool -i eth0 で対応を確認し、スイッチ側も同様に MTU=9000 を設定します。
- TCP バッファサイズの最大化
bash
sudo sysctl -w net.core.rmem_max=12582912
sudo sysctl -w net.core.wmem_max=12582912
sudo sysctl -w net.ipv4.tcp_rmem="4096 87380 12582912"
sudo sysctl -w net.ipv4.tcp_wmem="4096 65536 12582912"
永続化したい場合は /etc/sysctl.d/99-custom.conf に追記。
- 自動チューニングの有効化
bash
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr
BBR アルゴリズムは高遅延・大容量転送に有効です。
ステップ 4:高速コピーコマンドの選択
4-1. rsync で単一スレッド高速化
Bashrsync -avh --inplace --no-whole-file --progress /source/dir/ /mnt/winshare/dest/
--no-whole-fileはローカルコピー時に適用されますが、SMB でもパケットサイズの最適化に寄与します。
4-2. bbcp でマルチスレッド転送
Bashbbcp -s 8 -w 4M -V /source/largefile.iso /mnt/winshare/
-s 8は同時スレッド数、-w 4Mはウィンドウサイズです。bbcp は TCP ストリームを分割し、帯域幅をフル活用します。
4-3. 圧縮転送(圧縮比が高いテキスト系データ向け)
Bashtar cf - /source/dir | pigz -p 8 | ssh user@win-host "tar xf - -C /mnt/winshare"
pigzは並列 gzip で、CPU コアを有効活用しつつ転送データ量を削減します。
ハマった点やエラー解決
| 発生した症状 | 原因 | 解決策 |
|---|---|---|
mount error(112): Host is down |
Windows 側ファイアウォールが SMB 3.0 をブロック | Windows Defender Firewall → 受信規則 → SMB-Inbound を許可 |
read/write error, data not transferred |
MTU ミスマッチでフラグメントが失われる | 両端で MTU を再確認し、9000 に統一 |
bbcp: cannot allocate memory |
sysctl で vm.max_map_count が不足 |
sudo sysctl -w vm.max_map_count=262144 を実施 |
rsync: connection unexpectedly closed |
SMB の暗号化によりパケットサイズが超過 | vers=3.0 にダウングレード、max protocol = SMB2 でテスト |
解決策のまとめ
- SMB バージョンを 3.1.1 に固定し、暗号化と大バッファを有効化することで、プロトコルレベルのオーバーヘッドを最小化。
- Jumbo Frame と TCP バッファ拡張で、物理的な転送効率を向上。ネットワーク機器の相互設定が必須。
- bbcp や pigz 等のマルチスレッド/圧縮ツールを組み合わせると、CPU と帯域幅の両方をフル活用し、実測で 2〜3 倍のスピードアップが期待できる。
まとめ
本記事では、CentOS と Windows 間の共有フォルダを利用した大容量ファイル転送を高速化するための プロトコル設定、ネットワークチューニング、最適なコピー手法 を体系的に解説しました。
- SMB 3.1.1 の有効化とバッファサイズ拡大でプロトコル効率を最大化
- MTU/Jumbo Frame と TCP バッファの調整で物理レイヤーを最適化
bbcp・rsync・pigzなどマルチスレッド/圧縮ツールで実装コストを削減
これらを実践すれば、従来の数十%にとどまっていた転送速度が 2〜3 倍以上 に向上し、バックアップやデータミラーリングの作業時間を大幅に短縮できます。次回は NFS + Windows NFS クライアント による高速化の比較検証や、VPN 経由での最適化についても取り上げる予定です。
参考資料
- Microsoft Docs – SMB Protocol Overview
- Red Hat Enterprise Linux – Configuring CIFS mounts
- Linux Kernel Docs – TCP Congestion Control (Bbr)
- “High Performance Networks” – Jim Smith, O’Reilly Media, 2021
- bbcp – Bulk data transfer tool
