Tl; dr – 2つの異なるNASおよびAFPを介してSMBへの書き込み速度が60 MB /秒に制限されている理由がわかりませんMacクライアント。比較:同じネットワーク内の古いWindows 7ラップトップは、安定した100 MB /秒を書き込みます。
この質問を初めて読んだ場合は、更新4セクションに進んでください。理由はわかりませんが、単一ファイルの場合はrsync
が低速の主な理由です。
元の質問:Mac OS 10.11.5以降で速度のボトルネックSMB3/NASを見つける
MacOSのrsync --progress -a /localpath/test.file /nas/test.file
とWindowsのコピー情報を使用してテストしました。
NASは、現在のDSM 6.0.2(5.xでもテスト済み)を実行するDS713 +であり、ギガビットイーサネットコンポーネントのみを備えたRAID1に2つのHGST Deskstar NAS SATA 4TB(HDN724040ALE640)を備えています。新しいイーサネットケーブル(少なくともCat5e)。
Macクライアントは、最初は20 MB /秒しか作成しませんでした。しかし、signing_required=no
修正(--- ここ で説明)を適用すると、SMB2およびSMB3を介して書き込み速度が60 MB /秒にプッシュされました。また、AFPは約60 MB /秒を提供します。結果は、プロトコルと(Mac)クライアントによって異なりますが、約5 MB /秒です。
私たちがすでに試したこと:
ネットワーク
ディスク
bs
およびcount
設定(128/8、512M/2、1024/1)を使用したdd if=/dev/zero of=write.test bs=256M count=4
を使用したディスクへの直接書き込み速度をテストしました。結果:約120 MB /秒(ブロックサイズ/カウントによって異なります)SMB/AFP
rsync --sockopts=TCP_NODELAY
(コメント)を試した書き込み速度に大きな変化はありません。設定が実際にロードされていることを再確認し、正しいsmb.confを編集していました。
システム
これはどちらかというとデフォルトの設定であり、派手な改造、クライアント、ネットワークコンポーネントはありません。 Synologyが公開しているメトリックによると、NASは40 MB /秒から75 MB /秒の速度で実行する必要があります。しかし、ボトルネックを見つけることはできません。
クライアント/ NAS
Macクライアントは、MacPro 5,1(標準の有線NIC、10.12.3(16D32)を実行)とMacBookPro10,1(Thunderboltネットワークアダプター、10.11.6を実行)であり、NASから約2mケーブルで、同じ場所で実行されます。テストでは、Windowsラップトップとしてのギガビットスイッチ。
これらのNASの2つは異なる場所にあり、結果は同じです。秒NASは、工場出荷時のデフォルトです(サードパーティのソフトウェアもインストールされていません)。 Synology CloudSyncを介して他のNASと同期する2つのRAID1、EXT4フォーマットのディスク。スイッチを使用せずにNASに直接接続するまで、同じ結果になりました。
重要な更新
MacOS/OS XのSMB実装を除外するために使用された方法は間違っていました。独自のバージョンのSMBを使用することを想定して、仮想マシンを介してテストしましたが、明らかにトラフィックはそのバージョンのSMBを介して実行されているmacOSに渡されます。
Windowsラップトップを使用して、平均100 MB /秒を達成することができました。 10.11および10.12でのSMB実装/更新を示すと、パフォーマンスが低下する可能性があります。 signing_required
がno
に設定されていても。
誰かがアップデートで変更された可能性があり、パフォーマンスに影響を与える可能性のあるいくつかのさらなる設定を指摘できれば素晴らしいでしょう。
pdate 2 –新しい洞察
AndrewHenle コメントの中で、より詳細な洞察を得るためにWiresharkを使用してトラフィックを詳細に調査する必要があると指摘しました。
したがって、私はNASでSudo tcpdump -i eth0 -s 65535 -w tcpdump.dump
を実行し、2つのテストファイルを512 MBと1 GBで転送しました。そしてWiresharkでダンプを検査しました。
私が見つけたもの:
smb_neg=smb3_only
を追加してmacOSに強制的にSMB3を使用させようとしても、機能しないか、少なくとも高速転送につながらなかった。rsync --sockopts=TCP_NODELAY
を実行しても効果がありませんでした(注:デフォルトのack設定3でtcpdumpを実行しました)。.csvファイルとして4つのダンプを作成しました。2つは512 MB(test-2.file)をコピーし、2つは1024 MB(test.file)をコピーしています。 Wiresharkのエクスポートをここからダウンロード (25.2 MB)。それらはスペースを節約するために圧縮され、自明の名前が付けられています。
pdate 3 – smbutil output
コメントで harrymc によって要求されたsmbutil statshares -a
の出力。
==================================================================================================
SHARE ATTRIBUTE TYPE VALUE
==================================================================================================
home
SERVER_NAME server-name._smb._tcp.local
USER_ID 502
SMB_NEGOTIATE SMBV_NEG_SMB1_ENABLED
SMB_NEGOTIATE SMBV_NEG_SMB2_ENABLED
SMB_NEGOTIATE SMBV_NEG_SMB3_ENABLED
SMB_VERSION SMB_3.0
SMB_SHARE_TYPE DISK
SIGNING_SUPPORTED TRUE
EXTENDED_SECURITY_SUPPORTED TRUE
LARGE_FILE_SUPPORTED TRUE
OS_X_SERVER TRUE
QUERYINFO_NOT_SUPPORTED TRUE
DFS_SUPPORTED TRUE
MULTI_CREDIT_SUPPORTED TRUE
--------------------------------------------------------------------------------------------------
これに注意してください:SIGNING_SUPPORTED
がtrue
であることは確かに、構成の設定が機能しないことを意味しません。しかし、それだけがNASによってサポートされています。構成のsigning_required
設定を変更すると、書き込み速度に影響があることをトリプルチェックしました(オンにすると20 MB /秒、オフにすると60 MB /秒)。
pdate 4 – Samba Wars:A New Hope
やや恥ずかしい感じがしますが、ここでの主な問題は、やはり測定です。
rsync --progress -a
の書き込み速度は約30 MB /秒です。 dd
を使用してSMB共有に直接書き込み、time cp /local/test.file /NAS/test.file
を使用すると、約85〜90 MB /秒で高速になり、コピーするための最も速い方法はmacOS Finderが約100であることですMB/s(タイミングまたは速度のインジケータがないため、これも測定するのが最も難しい方法です。誰がそれを必要としているのですか?o_O)。ストップウォッチを使用して、最初に1 GBのファイルをコピーし、次に10 GBのファイルをコピーして測定しました。
この質問の最後の更新以降に試みたもの。
dd
書き込みによるわずか65 MB /秒(rsync
25 MB /秒)。 25 MB /秒を確認したのは、rsyncの調査を開始した瞬間です。それでも65 MB /秒は非常に遅いです。そのため、macOSでのSMBの実装は…まあ、疑問です。man nsmb.conf
です。 オンラインバージョン は古くなっています。そのため、そのうちのいくつかの設定を試しました。
notify_off=yes
validate_neg_off=yes
read_async_cnt=16
write_async_cnt=16
dir_cache_async_cnt=40
protocol_vers_map=4
streams=no
soft=yes
注:smb_neg=smb3_only
は、既に予想したとおり、有効な設定ではありません。 protocol_vers_map=4
は有効な同等のものである必要があります。
とにかく、これらの設定はどれも私たちに違いをもたらしませんでした。
一目でわかる新しい質問
なぜrsyncは1つの(1!)ファイルをコピーするのにそのような高価な方法です。ここで同期/比較することはあまりありませんが、ありますか? tcpdumpは、オーバーヘッドの可能性も示しません。
SMB共有への転送時に、dd
およびcp
がmacOS Finderよりも遅いのはなぜですか? Finderでコピーすると、TCP通信での確認応答が大幅に少なくなるようです。 (再度:delayed_ack=1
などのack設定は、私たちにとって何の違いもありませんでした。)
なぜWindowsはMTUを無視して、送信するTCPパケットが大幅に大きくなり少なくなるため、macOSで可能なすべてのものと比較して最高のパフォーマンスが得られます。
これは、macOSからのパケットの様子です(常に1514)。
"TCP","1514","[TCP segment of a reassembled PDU]"
"TCP","66","445 > 56932 [ACK] Seq=6603 Ack=35239 Win=4505 Len=0 TSval=520980697 TSecr=650208630"
そして、これはWindowsからのものです(サイズはさまざまですが26334まで)
"SMB2","1466","Write Request Len:65536 Off:196608 File: test.file"
"TCP","26334","[TCP segment of a reassembled PDU]"
"TCP","7354","[TCP segment of a reassembled PDU]"
"TCP","54","445 > 49220 [ACK] Seq=6831 Ack=267030 Win=4074 Len=0"
ここで.csv全体をダウンロード (25.2 MB)、ファイル名はコピーされた内容(OS、転送方法、ファイルサイズ)を説明します。
ここで「ピーターファンホーフト」を引用します。何を/どのlinux distに基づいてテストするのかよくわかりませんが。そしてrsyncのバージョンも。ただし、1.パフォーマンスを向上できる可能性がある場合は、-sparseフラグを試すように考えます。 2.彼はNFSプロトコルでテストしましたが、同じ速度の問題を満たしました。そのため、ITはプロトコル(SMB2/3、AFPなど)の理由ではない可能性があります。
Rsyncを使用して、1つのファイルサーバーから別のファイルサーバーにデータをコピーしますNFSを使用して、10Gbリンクでマウントします。 バッファサイズ(簡単なテストとして)を上げるとパフォーマンスが向上することがわかりました。 -sparseを使用すると、2MBpsから100MBpsに50倍のパフォーマンスでパフォーマンスが向上します。
LWN.netには、2010年に投稿された記事であってもパフォーマンスの問題がカーネルに関連する可能性があるという結論があり、NASまたはMacOSでは変更できません。ただし、この記事ではカーネルの問題checksum(私の推測)の計算によって発生する可能性があります。
1つはっきりしている点は、Mythtvシステムのカーネルをアップグレードすることです。一般に、2.6.34および2.6.35-rc3カーネルは、古い2.6.27カーネルよりも優れたパフォーマンスを提供します。しかし、いじくり回しても、rsyncは、100MiB/s以上でコピーする単純なcpに勝ることはできません。実際、rsyncは単純なローカルコピーのために本当に多くのCPUパワーを必要とします。最も高い頻度では、cpは、rsyncの70 + 55秒と比較して、0.34 + 20.95秒のCPU時間しか必要としませんでした。
また、コメントにはこれが含まれています:
Rsync 常に確認転送された各ファイルが、ファイル全体のチェックによって受信側で正しく再構築されたことに注意してくださいchecksumファイルの転送時に生成されます
pdate 1:私の間違い、この説明は--checksumに対するものです。ここで確認してください:[--checksumオプションの説明を改善しました。]PS、3つ以上のリンクを投稿する評判がありません。
しかし、rsyncのmanページから同じ説明が見つからないので、誰かが太字の下で話していると思います:
Rsyncは、サイズまたは最終変更時刻に変更されたファイルを検索する"quick check"アルゴリズム(デフォルト)を使用して転送する必要があるファイルを検出します。ファイルのデータを更新する必要がないことをクイックチェックが示している場合、他の保持されている属性の変更(オプションで要求される)は、宛先ファイルに対して直接行われます。
したがって、cp/tar/catと比較してください。rsyncを使用して小さなファイルまたは大きなファイルの束をコピーすると、パフォーマンスの問題が発生する可能性があります。しかし、rsyncのソースコードを読み取ることができないため、これが最終的な理由であることを確認できません。
私の考えはチェックし続けることです:
旗
--statsこれは、rsyncにファイル転送に関する詳細な統計のセットを出力するように指示します。これにより、rsyncアルゴリズムがデータに対してどの程度効果的であるかを知ることができます。
--debug = FLAGSこのオプションを使用すると、表示したいデバッグ出力をきめ細かく制御できます。個々のフラグ名の後にレベル番号を付けることができます。0はその出力を無音にすることを意味し、1はデフォルトの出力レベルです。番号が大きいほど、そのフラグの出力が大きくなります(高いレベルをサポートするものの場合)。 -debug = helpを使用して、使用可能なすべてのフラグ名を確認してください、それらが出力する内容、および詳細レベルが上がるたびに追加されるフラグ名。
最後に、この補足記事を読んで知識を深めることをお勧めします。
"ネットワークを介して大量のデータを転送する方法" moo.nac.uci.edu/~hjm/HOWTO_move_data.html
私が正しく覚えていれば、Rsync/sshはsmbが暗号化しない接続を暗号化します。ファイルが1つしかない場合、一方のシステムはそのファイルを読み取ることができ、もう一方のシステムは読み取れない可能性があります。また、MTUが1514を超えるには、「giants」/「Jumbo Frames」パケットを有効にする必要があることに注意してください。パケットをさらに削減する必要があるという事実は、パケットを「再パック」するオーバーヘッドがあることを意味する場合があります。 2番目に注意する点は、「giants」/「Jumbo Frames」を両端で、またすべての間で有効にする必要があることです。
1514は通常のイーサネットフレームです。 6k-9kフレームは、OS /アプリケーションに応じて、ジャイアントまたは「ジャンボフレーム」と呼ばれます
私のNAS(VMはNASの1つであるVMを備えたPC)とsftp(sshfsを使用)を備えた私のステーション(PC)との間の平均80MB /秒と、中間のデバイスはmicrotik 2011です(truスイッチチップのみ)
MTUは2つのポイント間でネゴシエートされ、パスに沿って異なる容量で複数のMTUが存在する可能性があること、およびMTUが利用可能な最小のサイズになることを覚えておいてください。
編集:SMBは、ファイル転送ではあまり効率的ではありません。