NFSの書き込みパフォーマンスが低い


20

2つのマシンを10Gbitイーサネットで接続しています。それらの1つをNFSサーバーとし、もう1つをNFsクライアントとします。

TCPを使用したネットワーク速度のテストiperfでは、双方向で〜9.8 Gbit / sのスループットが示されるため、ネットワークは問題ありません。

NFSサーバーのディスクパフォ​​ーマンスのテスト:

dd if=/dev/zero of=/mnt/test/rnd2 count=1000000

結果は約150 MBytes / sであるため、ディスクは書き込みに問題なく動作します。

サーバー/etc/exportsは:

/mnt/test 192.168.1.0/24(rw,no_root_squash,insecure,sync,no_subtree_check)

クライアントは/mnt/test、次のオプションを使用してこの共有をローカルにマウントします。

node02:~ # mount | grep nfs
192.168.1.101:/mnt/test on /mnt/test type nfs4 (rw,relatime,sync,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.102,local_lock=none,addr=192.168.1.101)

NFS共有からクライアントマシンに大きなファイル(〜5Gb)をダウンロードしようとすると、〜130-140 MBytes / sのパフォーマンスが得られます。これはサーバーのローカルディスクのパフォーマンスに近いため、満足です。

しかし、NFS共有に大きなファイルをアップロードしようとすると、アップロードは〜1.5 Mbytes / sで始まり、ゆっくりと最大18-20 Mbytes / sに増加し、増加しなくなります。アップロードが実際に開始される前に、共有が数分間「ハング」する場合があります。つまり、ホスト間のトラフィックがゼロに近くなりls /mnt/test、実行すると1〜2分以内に戻りません。その後、lsコマンドが返され、最初の1.5Mbit / sの速度でアップロードが開始されます。

アップロード速度が最大(18-20 Mbytes / s)に達すると、実行するiptraf-ngとネットワークインターフェースで〜190 Mbit / sのトラフィックが表示されるため、ここではネットワークもサーバーのHDDでもボトルネックになりません。

私が試したもの:

1. 100MbitイーサネットNICのみで接続された3番目のホストでNFSサーバーをセットアップします。結果は類似しています:DLは良好なパフォーマンスとほぼ100Mbitのネットワーク使用率を示し、アップロードは毎秒数百キロバイトより速く実行されないため、ネットワーク使用率は非常に低くなります(によると2.5Mbit / s iptraf-ng)。

2. いくつかのNFSパラメーターを調整しようとしました。

  • sync または async

  • noatime

  • いや hard

  • rsizeそしてwsize私は8192までのいくつかの段階でそれらを減少しようとしたので、私の例では最大であります

3. クライアントマシンとサーバーマシンを切り替えようとしました(以前のクライアントでNFSサーバーをセットアップし、逆も同様です)。さらに、同じ構成のサーバーがさらに6つあるので、異なるバリエーションでそれらを相互にマウントしようとしました。同じ結果。

4. MTU = 9000、MTU = 9000および802.3adリンク集約、MTU = 1500のリンク集約。

5. sysctlの調整:

node01:~ # cat /etc/sysctl.conf 
net.core.wmem_max=16777216
net.core.rmem_max=16777216
net.ipv4.tcp_rmem= 10240 873800 16777216
net.ipv4.tcp_wmem= 10240 873800 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.core.netdev_max_backlog = 5000

同じ結果。

6. ローカルホストからマウントします。

node01:~ # cat /etc/exports
/mnt/test *(rw,no_root_squash,insecure,sync,no_subtree_check)
node01:~ # mount -t nfs -o sync localhost:/mnt/test /mnt/testmount/

そして、ここで同じ結果が得られます。ダウンロード/mnt/testmount/は高速で、アップロード/mnt/testmount/は非常に遅く、22 MBytes / sより速くなく、実際に転送が開始されるまでにわずかな遅延があります。ネットワークスタックが問題なく動作し、問題がNFSにあるということですか?

これらはすべて役に立ちませんでした。結果はデフォルトの構成と大きく異なりませんでした。echo 3 > /proc/sys/vm/drop_cachesすべてのテストの前に実行されました。

3つのホストすべてのすべてのNICのMTUは1500であり、非標準のネットワークチューニングは実行されません。イーサネットスイッチはDell MXL 10 / 40Gbeです。

OSはCentOS 7です。

node01:/mnt/test # uname -a
Linux node01 3.10.0-123.20.1.el7.x86_64 #1 SMP Thu Jan 29 18:05:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

どの設定が欠落していますか?NFSをハングせずにすばやく書き込む方法


1
かなりバランスの取れたテストケースがありますが、サーバー自体にマウントして、そこから書き込みを試みると、NFSスタックまたはネットワークスタックに障害があるかどうかがわかります。また、サーバーとクライアントの切り替え(クライアントからのエクスポート、サーバーへのマウント)を試み、また別のクライアントを使用してみてください。サーバー/クライアントプロセスを追跡しても何も明らかにされませんでしたか?
ダリボルカルロヴィッチ

@DaliborKarlovićstraceを除くすべてを試し、質問に情報を追加しました。localhostからのマウントの動作が遅いため、ネットワークスタックとスイッチに問題はないようです。カーネルスペースNFSを使用して、Operation not permittedstraceをNFSプロセスにアタッチしようとしました。
セルゲイ

これは、ネットワークスタックを完全に除外できることを意味します(ただし、確認のためにstraceをアタッチする必要があります)。特定のバグに見舞われない場合は、rootユーザーとしてプロセスを追跡できます。
ダリボルカルロヴィッチ

@DaliborKarlović確かにルートとしてstraceを試す。任意のユーザー空間プロセスにアタッチできますが、カーネルスペースプロセスにはアタッチできません。しかし、出力からどのような情報を取得できますか?NFSにアタッチしてアップロードを開始すると、数十万行の出力が生成されると思います。ゼロ以外の戻り値に注意する必要がありますか?
セルゲイ

あなたは正しいです、私はそれが非ユーザーランドのプロセスであるとは考えていませんでした。転送の開始時に "ハング"している間に何をしていたかを期待しています。これは、誤って構成された逆DNSルックアップのような些細なことかもしれません。
ダリボルカルロヴィッチ

回答:


3

exportステートメントでsync-optionを使用します。これは、サーバーが実際にディスクに書き込まれた後にのみ書き込み操作を確認することを意味します。回転するディスクがある場合(つまりSSDがない場合)、書き込み操作ごとに平均でディスクの少なくとも1/2回転が必要であり、これがスローダウンの原因です。

非同期設定を使用すると、サーバーは処理されたがディスクにまだ書き込まれていない場合、すぐに書き込み操作をクライアントに確認します。これは、クライアントが発生しなかった操作の確認応答を受け取ったときに停電が発生した場合など、もう少し信頼性が低くなります。ただし、書き込みパフォーマンスは大幅に向上します。

(編集)非同期と同期のオプションを既にテストしているのを見ました。ただし、これがパフォーマンス低下の問題の原因であることはほぼ確実です-かつてはidenticitcalセットアップでもまったく同じ兆候がありました。たぶんあなたはそれをもう一度テストします。サーバーのexportステートメントとクライアントでのマウント操作で同時に非同期オプションを指定しましたか?


+1最も可能性の高い説明は、同期が正しく無効になっていないことです。
デビッドシュワルツ

2

パケットサイズと遅延に関連する問題になる可能性があります。以下を試してください:

レポートは結果を裏付けます。


MTU = 9000のジャンボフレームを試しましたが、結果は同じでした。また、802.3adでリンクアグリゲーションを試みましたが、変更はありません。そこで、これらの設定をすべて元に戻して、できるだけデフォルトの状態に近づけました。また、私はそれを調整しようとしたnet.core.*net.ipv4.*のsysctlが、多分私はあまりにもいくつかの実験を行いました。OK、さらにテストを行って報告します。
セルゲイ

サーバーとクライアントの両方でsysctlの調整をもう一度試みましたが、それは役に立ちませんでした。
セルゲイ

トランスポートプロトコルとしてUDPを試しましたか?
shodanshok

UDP(マウントオプションでproto = udp)を試しましたが、TCPよりも1〜2メガバイト/秒遅くなります。結果は、localhostとリモートホストからの同じマウントでした。
セルゲイ

2

http://veerapen.blogspot.com/2011/09/tuning-redhat-enterprise-linux-rhel-54.html

ハードウェアRAIDを備えたシステムでLinuxスケジューラを構成し、デフォルトを[cfq]から[noop]に変更すると、I / Oが改善されます。

nfsstatコマンドを使用して、読み取り/書き込みの割合を計算します。RAIDコントローラーのキャッシュ率を一致するように設定します。

ワークロードが重い場合は、NFSサーバースレッドの数を増やす必要があります。

no_delayオプションを使用して、遅延なくディスクに書き込むようにnfsスレッドを構成します。

Linuxカーネルにできるだけ早くフラッシュするように指示し、書き込みができるだけ少なくなるようにします。Linuxカーネルでは、ダーティページの書き戻し頻度を2つのパラメーターで制御できます。

より高速なディスク書き込みを行うには、filesystem data = journalオプションを使用し、ファイルアクセス時間の更新を防止します。これにより、追加のデータがディスクに書き込まれます。このモードは、他のすべてのモードよりもパフォーマンスが優れているデータをディスクから同時に読み書きする必要がある場合に最速です

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.