同じサーバー上の NFS/CIFS ディレクトリ間のコピーが遅い

同じサーバー上の NFS/CIFS ディレクトリ間のコピーが遅い

長文になると思いますが、どうかご容赦ください。この問題は他の人にも当てはまる可能性がありますので、回答をいただければ幸いです。賞金の有効期限が切れそうだったので、プレゼントすることにしました。

クライアント (Ubuntu) から NFS サーバー (Debian) にコピーしたり、NFS サーバーからコピーしたりすると、ギガビットが最大になります。ただし、同じサーバー上の 2 つのディレクトリ間でコピーすると、速度は 30 MB/秒未満から 100 MB/秒を超えるまで変動します。ほとんどの場合、速度は 50 MB/秒程度です。

同じコピーを NFS サーバー (ローカル ディスク) 上で直接実行すると、100 ~ 150 MB/秒、場合によってはそれ以上の速度になります。この NFS エクスポートと、同じサーバーの同じディレクトリからエクスポートされた CIFS 共有間のファイル コピーも同様に遅く、同じサーバーの CIFS 経由の 2 つのディレクトリ間のコピーも遅くなります。iperfクライアントとサーバー間の双方向速度は 941 Mb/940 Mb です。

NFS がサーバー上で非同期を使用していることを確認しました。また、ZFS データセットの同期を無効にし、ZFS キャッシュとログ デバイスを削除してみました。

ログとキャッシュ デバイス用の SSD を備えた 4x2TB ディスクの非常に高速な ZFS ストライプ ミラーでテストしました。

NFS サーバーの仕様:

Debian 8.2 コア 4Ghz AMD-FX
32GB ram
ZFS raid 10、SSD キャッシュ/ログ
17GB ARC
4x2GB WD red ドライブ
Intel 82574L NIC

テストクライアント:

Ubuntu 15.04、Core2Quad 2.4Ghz
8GB ram
SSD
Intel 82574L NIC

これが現在の設定です。これは/pool2/Media私がテストしてきた共有です。

/etc/fstabクライアント側:

UUID=575701cc-53b1-450c-9981-e1adeaa283f0 /               ext4        errors=remount-ro,discard,noatime,user_xattr 0       1
UUID=16e505ad-ab7d-4c92-b414-c6a90078c400 none            swap    sw              0       0 
/dev/fd0        /media/floppy0  auto    rw,user,noauto,exec,utf8 0       0
tmpfs    /tmp    tmpfs   mode=1777       0       0


igor:/pool2/other     /other        nfs         soft,bg,nfsvers=4,intr,rsize=65536,wsize=65536,timeo=50,nolock
igor:/pool2/Media       /Media          nfs     soft,bg,nfsvers=4,intr,rsize=65536,wsize=65536,timeo=50,nolock,noac
igor:/pool2/home        /nfshome        nfs     soft,bg,nfsvers=4,intr,rsize=65536,wsize=65536,timeo=50,nolock

/etc/exportsサーバー上 (igor):

#LAN
/pool2/home 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
/pool2/other 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
/pool2/Media 192.168.1.0/24(rw,async,no_subtree_check,no_root_squash)
/test 192.168.1.0/24(rw,async,no_subtree_check,no_root_squash)

#OpenVPN
/pool2/home 10.0.1.0/24(rw,sync,no_subtree_check,no_root_squash)
/pool2/other 10.0.1.0/24(rw,sync,no_subtree_check,no_root_squash)
/pool2/Media 10.0.1.0/24(rw,sync,no_subtree_check,no_root_squash)

zpool ステータス:

  pool: pool2
 state: ONLINE
  scan: scrub repaired 0 in 6h10m with 0 errors on Sat Oct  3 08:10:26 2015
config:

        NAME                                                 STATE     READ WRITE CKSUM
        pool2                                                ONLINE       0     0     0
          mirror-0                                           ONLINE       0     0     0
            ata-WDC_WD20EFRX-68AX9N0_WD-WMC300004469         ONLINE       0     0     0
            ata-WDC_WD20EFRX-68EUZN0_WD-WCC4MLK57MVX         ONLINE       0     0     0
          mirror-1                                           ONLINE       0     0     0
            ata-WDC_WD20EFRX-68AX9N0_WD-WCC1T0429536         ONLINE       0     0     0
            ata-WDC_WD20EFRX-68EUZN0_WD-WCC4M0VYKFCE         ONLINE       0     0     0
        logs
          ata-KINGSTON_SV300S37A120G_50026B7751153A9F-part1  ONLINE       0     0     0
        cache
          ata-KINGSTON_SV300S37A120G_50026B7751153A9F-part2  ONLINE       0     0     0

errors: No known data errors

  pool: pool3
 state: ONLINE
  scan: scrub repaired 0 in 3h13m with 0 errors on Sat Oct  3 05:13:33 2015
config:

        NAME                                        STATE     READ WRITE CKSUM
        pool3                                       ONLINE       0     0     0
          ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E5PSCNYV  ONLINE       0     0     0

errors: No known data errors

/pool2 bonnie++ サーバーの:

バージョン 1.97 ------ シーケンシャル出力 ------ -- シーケンシャル入力 -- ランダム --
同時実行 1 - チャネルあたり - --ブロック-- -書き換え- - チャネルあたり - --ブロック-- --シーク--
マシンサイズ K/秒 %CP K/秒 %CP K/秒 %CP K/秒 %CP K/秒 %CP /秒 %CP
イゴール 63G 100 99 187367 44 97357 24 325 99 274882 27 367.1 27

ボンディング

ボンディングを試してみたところ、直接接続のバランス RR ボンディングで、読み取り速度 220 MB/秒、書き込み速度 117 MB/秒、コピー速度 40 ~ 50 MB/秒が得られました。

ボンディング付き iperf

[ ID] インターバル転送帯域幅 Retr
[ 4] 0.00-10.00秒 1.10 GBytes 942 Mbits/秒 707送信者
[ 4] 0.00-10.00秒 1.10 GBytes 941 Mbits/秒受信機
[ 6] 0.00-10.00秒 1.06 GBytes 909 Mbits/秒 672送信者
[ 6] 0.00-10.00秒 1.06 GBytes 908 Mbits/秒受信機
[合計] 0.00-10.00秒 2.15 GBytes 1.85 Gbits/秒 1379送信者
[SUM] 0.00-10.00秒 2.15 GBytes 1.85 Gbits/秒受信機

NFS 経由で結合した Bonnie++

バージョン 1.97 ------ シーケンシャル出力 ------ -- シーケンシャル入力 -- ランダム --
同時実行 1 - チャネルあたり - --ブロック-- -書き換え- - チャネルあたり - --ブロック-- --シーク--
マシンサイズ K/秒 %CP K/秒 %CP K/秒 %CP K/秒 %CP K/秒 %CP /秒 %CP
ヘイズ 16G 1442 99 192941 16 89157 15 3375 96 179716 13 6082 77

SSDキャッシュ/ログを削除し、NFS経由でコピーすると、iostatは次のように表示します。

0.80 0.00 67.60 214.00 8561.60 23689.60 229.06 1.36 4.80 14.77 1.64 1.90 53.60
0.80 0.00 54.60 214.20 7016.00 23689.60 228.46 1.37 5.14 17.41 2.01 2.15 57.76
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
1.60 0.00 133.00 385.20 17011.20 45104.00 239.73 2.24 4.31 12.29 1.56 1.57 81.60
自衛隊 0.40 0.00 121.40 385.40 15387.20 45104.00 238.72 2.36 4.63 14.29 1.58 1.62 82.16
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

TMPFS

NFS 経由で tmpfs をエクスポートし、ファイルのコピーを実行しました - 速度は 108 MB/秒でした。サーバーからのローカルでは、410 MB/秒です。

NFS 経由でマウントされた zvol

速度は 50MB/秒未満から 180MB/秒超まで変動しますが、平均すると約 100MB/秒になります。これは私が求めていたものです。この zvol は、私がテストしていたのと同じプール (pool2) 上にあります。このことから、これは ZFS データセット/キャッシュ タイプの問題であると考えられます。

生ディスク読み取りテスト

このコマンドを使用する

dd if=/dev/disk/by-id/ata-WDC_WD20EFRX-68AX9N0_WD-WMC300004469 of=/dev/null bs=1M count=2000

4つのディスクすべてで146~148MB/秒を実現

プール内のディスク使用量が遅く、不均一である

ZFS メーリング リストの非常に親切な人のおかげで、ディスクをより均等に使用するために何をすべきかがわかりました。

ZFS がミラー 1 を優先する理由は、ミラー 0 がかなりいっぱいになった後に追加されたようで、現在、ZFS はいっぱいのレベルを再調整しようとしているためです。

これを排除して時間がある場合、zfs は繰り返しプールのデータセットを自身の新しいデータセットに送信し、ソースを破棄し、プールのバランスが再調整されるまでこれを繰り返します。

これを修正しました。すべてのディスクでデータが均一になりました。 これにより、NFS 経由のコピー速度は 75 MB/秒になりました。ローカルでは 118 MB/秒です。

質問

私の質問です。質問の 1 つでも答えていただければ、回答を受け入れます。

  1. どうすればこの問題を解決できますか? (NFS 経由のコピーは遅いですが、ローカルでは遅いです)
  2. 1 番に答えられない場合は、Linux 上の ZFS と同等の NFS サーバーでこれを試してみて、比較対象として結果を教えてください。
  3. 1 または 2 に答えられない場合は、NFS 経由の同様の非 ZFS サーバーで同じテストを試すことができますか?

答え1

うーん... いくつか問題に気付きましたし、決定的な証拠も 1 つか 2 つ見つけたと思います。でも、まずはいくつか質問をして、皆さんの答えを推測してみます。一見無関係に思えるデータもいくつか提示しますが、読む価値は十分にあると思います。それでは、どうぞお待ちください... :-)

  • RAID10 では、ストライプ + 冗長ドライブが合計 4 つあると想定しています。
  • そして、Linux autoraid (ハードウェア RAID コントローラーではなく) を使用していること。
  • また、すべての SATA ポートが相互に独立してフル転送速度で双方向に転送でき、すべての SATA ポートが同等の高速性を備えていると想定しています。つまり、1 つの SATA アダプタ/コントローラがあれば、それに接続されているすべてのディスクを定格速度で実行することができます。
  • また、最新のSATA仕様のドライブとコントローラをお持ちだと仮定します。つまり、6.0Gb/sです。つまり、600MB/秒です。控えめに言っても、その半分の300MB/秒だと仮定しましょう。
  • クライアントからサーバーへの通信は NIC に制限されているため (100MB/秒)、ドライブに十分な負荷をかけることができません。
  • NFS-to-NFS を実行するときに NIC よりも高速にするには、localhost を使用していると想定しています。これにより、NIC の制限速度を超えることができます (問題ではないことを示すためにボンディングを行ったとおっしゃったと思います)

問題 1。報告されている転送速度は、高速なローカル間でさえ低いようです。ディスクが高速であれば、150MB/秒以上は期待できます。私の 3 ディスク raid0 システムは 3.0Gb/秒しか出ません (アダプタ制限)。ストライプ化すれば 450 MB/秒になります。あなたのディスク/コントローラは私の 2 倍の速度なので、ローカル間転送では 150MB/秒ではなく 300MB/秒 (ストライプ化のため) になると思います。あるいは、600MB/秒 (議論のために半分になるかもしれない FS オーバーヘッドを除く) になるかもしれません。

  • zpool 情報から、ディスク構成が Western Digital であり、次のようになっていることがわかりました。
ミラー-0
  ata-WDC_WD20EFRX-68AX9N0
  ata-WDC_WD20EFRX-68EUZN0
ミラー1
  ata-WDC_WD20EFRX-68AX9N0
  ata-WDC_WD20EFRX-68EUZN0
  • これをあなたのiostat情報と比較してみましょう。すべてのテストのすべてのドライブのiostat情報があればいいのですが、あなたが提供したものだけで問題を診断できると思います。
  • sdbとsddは最大限に活用されています
  • ご指摘のとおり、これは奇妙な私は期待する全てドライブは RAID10 で使用率と統計のバランスをとる必要があります。これが [私の] 決定的な証拠です。
  • 2 つを組み合わせる。最大容量のドライブは、最大容量でないドライブとは少し異なるモデルです。zpool の順序は sda/sdb sdc/sdd であると推測します (ただし逆の場合もあります)。
  • sda/sdcは68AX9N0です
  • sdb/sddは68EUZN0です

問題 2。WD20EFRX + 68AX9N0 + 68EUZN0 を Google で検索すると、次のページが見つかりました。http://forums.whirlpool.net.au/archive/2197640

68EUZN0 ドライブは約 8 秒後にヘッドをパークできるようですが、他のドライブはこの点に関してよりスマートです (またはその逆)。

したがって、NFS キャッシュ + FS キャッシュ + SSD キャッシュを考慮すると、基盤となるドライブはアイドル状態になり、ヘッドをパーキングしている可能性があります。私の推測では、NFS のキャッシュの追加レイヤーが限界を超えている原因です。

FS同期オプションを変更することでこれをテストできます。同期は非同期よりも優れている可能性があります。また、可能であれば、SSDキャッシュをオフにしてテストを再実行してください。目的は、パーキングが確実に機能することです。ない発生して結果を確認します。

ウェブページに記載されているように、駐車遅延間隔を調整できるユーティリティがいくつかあります。それがオプションである場合は、必ず徹底的に調べてください。

アップデート:

あなたの問題は、ストアアンドフォワード(配送保証付き)ネットワークを介したスループットの問題として考えることができます。ないNIC または同等のものについて話しています。

I/O 操作は、構造体に格納される要求 (読み取り/書き込み、buf_addr、buf_len など) を含むパケットのようなものだと考えてください。この要求パケット/構造体は、NFS、ZFS、デバイス ドライバー、SATA コントローラー、ハード ディスクなどのさまざまなキャッシュ レイヤー間で渡されます。各ポイントでは、レイヤーへの到着時間と、要求が次のレイヤーに転送される出発時間があります。

この文脈では、実際に転送が行われるときの実際のディスク転送速度は、リンク速度に似ています。ほとんどの人がディスクについて考えるとき、転送速度のみを考慮し、転送が実際に開始された時間は考慮しません。

ネットワーク ルーターでは、パケットは到着しますが、送信リンクがクリアであっても、すぐに転送されるとは限りません。ルーターのポリシーによっては、ルーターはパケットを少し遅らせて、他のソース (UDP の場合は同じソース) からさらにパケットが到着することを期待し、小さなパケットを 1 つの大きなパケットに集約して、送信リンクでより効率的に送信できるようにすることがあります。

ディスクの場合、この「遅延」は、特定の FS レイヤーのキャッシュ ポリシーによって特徴付けられます。言い換えると、リクエストが T の時点でレイヤーに到着した場合、T+1 でレイヤーを出発して次のレイヤーに T+1 で到着するのではなく、T+n で出発/到着する可能性があります。FS キャッシュ レイヤーは、シーク順序の最適化/ソートを実行できるように、これを実行する場合があります。

表示される動作は、輻輳のためにウィンドウが縮小された TCP ソケットと非常によく似ています。

テストを分割することが重要だと思います。現在、読み取りと書き込みを行っています。そして、どちらが制限要因/ボトルネックであるかはわかりません。テストを読み取りまたは書き込みに分割すると役立つと思います。適切なベンチマーク プログラムでは、おそらくこれを実行します。私が推奨しているのは、[これらは単なる大まかな例であり、使用する正確な引数ではありません] のより洗練されたバージョンです。

書き込みの場合、time dd if=/dev/zero of=/whatever_file count=64g
読み取りの場合、time dd if=/whatever of=/dev/null count=64g
64GB の理由は、物理 RAM の 2 倍になり、ブロック キャッシュの影響を排除するためです。テスト間で sync コマンドを実行します。

これをローカル FS に適用し、NFS で繰り返します。

また、読む/dev/{sda,sdb,sdc,sdd} のそれぞれでテストする

これらのテスト中に iostat を実行します。

物理 RAW ディスクで読み取りテストを実行すると、ハードウェアが実際にどの程度の速度で実行できるかの基準値/最大値が得られることに注意してください。RAW デバイスの読み取りは、ドライブの転送仕様の最大機能に近似している必要があります。予想される書き込み速度は、ハード ディスクの場合と同程度であるはずです。そうでない場合、その理由は? すべてのディスクはほぼ同じ速度でテストされるはずです。ここで私が求めているのは、以前のテストで 2 つのディスクだけが最大速度に達した理由です。

計算してみると、32GB で最大転送速度が 600MB/秒だとすると、それを満杯にしたりフラッシュしたりするには最低でも 50 秒かかります。では、パーク タイムアウトはどのくらいに設定すればよいのでしょうか?

また、mem= ブート パラメータを使用してカーネルが許可する物理 RAM の量を減らすことで、状況を少し変えることができます。mem=8g などを試して、どのような効果があるかを確認してください。ブロック レイヤー キャッシュ フラッシュ ポリシーを調整できる /proc エントリもいくつかあります。

また、私のファイルシステムはext4で、noatimeでマウントされています。zfs set atime=off ...

また、システム ログも確認してください。ドライブがセンス エラーを報告し、システムがより低い転送速度を使用するように再構成する場合があります。

また、ドライブの SMART データも確認してください。何か異常な点はありませんか? 特定のドライブでソフト リトライが多すぎるなど。

前にも言ったように、ローカル ディスクのパフォーマンスは期待していたよりもずっと低いです。NFS でシステム全体に取り組む前に、まずその問題を解決する必要があると思います。RAID ディスクの使用率がすべてバランスが取れていて、概ね適切であれば、それほど心配する必要はないでしょう。

私のシステム(WDC ディスクも搭載)は NFS 用に設定されていません(rsync を頻繁に使用します)。今後 1 ~ 2 日間で、緊急にやらなければならないことがあります。その後、試してみる時間があります(私自身も興味があります)。

アップデート#2:

ZFSの不均衡問題についてよく気づきました。これは私の「問題#1」を説明するのに役立ちます。かもしれない再バランス操作によって、NFS のレイテンシ/タイミングが何らかの形で混乱し、「TCP ウィンドウ/バックオフ」動作が発生すると、NFS の不安定さも説明できます。可能性はそれほど高くありませんが、それでも可能性はあります。

rsyncテストではNFSを使用する必要はありません。サーバーにssh接続できる場合はrsyncを使用します。そしてNFS は冗長です。NFS では、cp などを使用するだけです。rsync を実行するには、ssh 経由で基盤となる ZFS に直接アクセスします。これは、NFS マウントがなくても機能します [私が使用する rsync 構成は次のとおりです]:

エクスポート RSYNC_SSH="/usr/bin/ssh"
エクスポート SSH_NOCOMPRESS=1
rsync /wherever1 サーバー:/zfsmount/whatever
これをローカルホストまたはボンディングで実行すると、パフォーマンスが期待どおりになる場合があります(ZFSのアンバランスの問題を除く)。そうであれば、問題は明らかにNFSに絞り込まれます。自体

NFS のカーネル ソースを少し調べてみました。少し調べた限りでは、タイムリーさに関して気に入りませんでした。NFS はリンクが低速だった 80 年代に始まったため、NIC 帯域幅を節約するためのコードが [今でも] たくさんあります。つまり、絶対に必要な場合にのみアクションを「コミット」します。必ずしも私たちが望んでいることではありません。私の空想的なネットワーク ルーター ポリシーのアナロジーで言えば、NFS のキャッシュは「T+n」遅延のキャッシュのようです。

NFS のキャッシュを無効にして、できるだけ早くその要求を ZFS に渡すように、できる限りのことをすることをお勧めします。ZFS をスマートにして、NFS を「ダム パイプ」にします。NFS キャッシュは、本質的に汎用的なものにしかなりません (たとえば、バックアップ ストアが RAID であることや、マウントされているベース FS の特殊な特性についてはあまり認識しません)。ZFS は、RAID とそれを構成するディスクについて詳細な情報を持っています。したがって、ZFS のキャッシュは、選択に関してよりインテリジェントになります。

NFS を同期マウントするようにしてみてはどうでしょうか。これでうまくいくかもしれません。また、noatime について何か見たので、そのオプションもオンにしてください。他の NFS チューニング/マウント オプションがあるかもしれません。NFS がいつもの容疑者であれば、うまく動作するように再構成できると思います。

一方、NFS を制御するオプションがない場合、rsync over ssh は実行可能な代替手段になりますか? 実際の使用例は何ですか? 高性能を必要とする大規模なバルク転送の経路として NFS を使用しているようです ([たとえば] ユーザーのホーム ディレクトリの自動マウント ポイントとしてのみ使用するのではなく)。これは、サーバーへのクライアント バックアップなどのためですか?

関連情報