ZFSパフォーマンス:プールまたはファイルシステムに空き領域を保持する必要がありますか?


17

ZFSのパフォーマンスは空き領域の量に大きく依存することを知っています。

プールのパフォーマンスを維持するために、プールの使用率を80%未満に抑えます。現在、プールが非常にいっぱいで、ビジーなメールサーバーなどでファイルシステムが頻繁に更新されると、プールのパフォーマンスが低下する可能性があります。プールがいっぱいになると、パフォーマンスが低下する可能性がありますが、他の問題は発生しません。[...]静的コンテンツのほとんどが95〜96%の範囲であっても、書き込み、読み取り、再同期のパフォーマンスが低下する可能性があることに注意してください。ZFS_Best_Practices_Guide、solarisinternals.com(archive.org)

ここで、ZFSファイルシステムをホストする10Tのraidz2プールがあるとしますvolume。次に、子ファイルシステムを作成し、volume/test5Tの予約を与えます。

次に、NFSごとに両方のファイルシステムをいくつかのホストにマウントし、いくつかの作業を実行します。volume残りの5Tはに予約されているため、5T を超える書き込みはできないことを理解していvolume/testます。

私の最初の質問は、volumeマウントポイントを〜5Tで満たした場合、パフォーマンスがどのように低下​​するかです。ZFSのコピーオンライトやその他のメタデータのためにそのファイルシステムに空きスペースがないので、ドロップしますか?または、ZFSは予約されたスペース内の空きスペースを使用できるため、同じままvolume/testですか?

2番目の質問。次のように設定を変更すると、違いが生じますか?volume現在、2つのファイルシステムがvolume/test1ありvolume/test2ます。両方にそれぞれ3T予約が割り当てられます(クォータはありません)。今、私は7Tをに書きtest1ます。両方のファイルシステムのパフォーマンスは同じですか、それともファイルシステムごとに異なりますか?落ちますか、それとも変わりませんか?

ありがとう!

回答:


9

はい。プールに空きスペースを確保する必要があります。主にコピーオンライトアクションとスナップショット用です。使用率が約85%になるとパフォーマンスが低下します。高くすることもできますが、明確な影響があります。

予約を台無しにしないでください。特にNFSで。それは必要はありません。たぶん、zvolではなく、NFSでは。

しかし、混乱は見られません。10Tを使用している場合、その85%以上を使用しないでください。使用制限するクォータを使用して、共有のサイズを適切に設定します。または、クォータを使用せず、プール全体の使用状況を監視します。


ありがとう!私たちの設定ではクォータを使用する公平な方法はないため、誰もが同じマウントポイントを使用し、スペースを埋めることができるため、パフォーマンスが低下します。私のアイデアは、システム全体が遅くなりすぎないように、予約で空きスペースを確保することでした。しかし、IIUC、私はvolume8.5Tに制限することでこの保証を得ることができ、二度と考えることはありません。あれは正しいですか?
パベル

あなたは..またはただ見ることができました。つまり、NFSであり、zvolではないため、ファイルを削除して8.5TB未満に戻すことができます。
ewwhite

うん、それは...数週間おきにメーリングリストでの議論「..、ファイルサーバはひどく遅いあなたのshをクリーンアップしてください」痛みはこれらを持っているのです
パヴェル・

社会的/管理上の問題に対する技術的解決策:)その量のデータを予想していますか?
ewwhite

Hehe ..はい、これは私たちが直面する非常に一般的な状況です。したがって、このような主張は以下のとおりです。「多くのファイルの作成と削除を持つファイルシステムでは、利用率は保護性能が80%以下に抑えます。」不正確なのは、ファイルシステムではなくプール内の空き領域に関するものだからですか?
パベル

21

パフォーマンスが低下するのは、zpoolが非常にいっぱいになるか、非常に断片化される場合です。この理由は、ZFSで使用されるフリーブロック検出のメカニズムです。NTFSやext3などの他のファイルシステムとは異なり、使用中のブロックと空きブロックを示すブロックビットマップはありません。代わりに、ZFSはzvolを「メタバス」と呼ばれる(通常200)より大きな領域に分割し、各メタスラブに空きブロック情報(スペースマップ)のAVLツリー1を格納します。バランスの取れたAVLツリーにより、要求のサイズに適合するブロックを効率的に検索できます。

このメカニズムは規模の理由から選択されていますが、残念ながら、高レベルのフラグメンテーションやスペース使用率が発生した場合に大きな痛みになることも判明しました。すべてのメタスラブが大量のデータを運ぶとすぐに、プールが空の場合の少数の大きな領域ではなく、多数の空きブロックの小さな領域が得られます。ZFSは2 MBのスペースを割り当てる必要がある場合、すべてのメタスラブのスペースマップの読み取りと評価を開始して、適切なブロックを見つけるか、2 MBをより小さなブロックに分割する方法を見つけます。これにはもちろん時間がかかります。さらに悪いことに、ZFSは実際にすべてのスペースマップを物理ディスクから読み取るため、I / O操作に多大なコストがかかるという事実です。以下のための任意のあなたの書き込みの。

パフォーマンスの低下が著しい場合があります。きれいな写真をお望みなら、Delphixのブログ投稿をご覧ください。いくつかの数字が(単純化されているがまだ有効な)zfsプールから削除されています。グラフの1つを恥知らずに盗んでいます-このグラフの青、赤、黄、緑の線を見てください。時間とともに断片化するKB / s: zpoolのパフォーマンスの低下

これに対する迅速で汚い修正は、従来、メタスラブデバッグモードでしたecho metaslab_debug/W1 | mdb -kw実行時に設定を即座に変更するための問題です)。この場合、すべてのスペースマップはOS RAMに保持され、各書き込み操作での過度で高価なI / Oの要件がなくなります。最終的に、これはまた、特に大きなプールの場合、より多くのメモリが必要であることを意味します。したがって、それは一種のストレージホーストレードのRAMです。10 TBのプールではおそらく2〜4 GBのメモリ2が必要になりますが、手間をかけずに使用率の95%に増やすことができます。


1少し複雑です。興味がある場合は、詳細についてはスペースマップに関するBonwickの投稿を参照してください。

2メモリの上限を計算する方法が必要な場合は、各メタスラブzdb -mm <pool>segments現在使用中の数を取得するために使用し、それを2で割って最悪のシナリオをモデル化します(占有された各セグメントの後に空きセグメントが続きます) )、これにAVLノードのレコードサイズ(2つのメモリポインターと値、zfsの128ビットの性質と64ビットアドレッシングが合計32バイトになると仮定しますが、一般的には理由)。

zdb -mm tank | awk '/segments/ {s+=$2}END {s*=32/2; printf("Space map size sum = %d\n",s)}'

参照:基本的なアウトラインは、zfs-discussメーリングリストのMarkus Koveroによるこの投稿に含まれていますが、私が彼の計算で間違いを犯したと思います。


syneticon-dj、この説明をありがとう!RAMを増やすことは確かに役立つようです。
パベル

BPR(ブロックポインターの書き換え)はどうですか?また、このblogs.kent.ac.uk/unseenit/2013/10/02/…では、ZILにSLOGを使用することについても言及しています。そして、この男nex7.blogspot.com.au/2013/03/readme1st.htmlは、それがすべてうまくいくまで送受信するだけだと言います。
CMCDragonkai 14年

@CMCDragonkai別のZILデバイスを使用しても、スペースマップの断片化によるパフォーマンスヒットには何の影響もありません。ただし、ZILデバイスがないと全体的な断片化が増加し、スペース使用率が低い場合に問題が発生する可能性が高くなります。BPRは依然としてベーパーウェアです。実証可能なコードは存在せず、安定した実装ではありません。実際、送受信サイクルは、最適化されたプールを取得するのに役立つ可能性がありますが、これ、送受信されるデータセットのダウンタイムを意味します。
-wabbit

別のディスクに送受信する前にデータセットを複製した場合はどうなりますか?そして、各ディスクの送受信サイクルを回転させるだけですか?
CMCDragonkai 14年

@CMCDragonkaiでは、最初に完全な送信を行い、その後増分を使用することでダウンタイムを短く保つことができます。しかし、ダウンタイムはそのままです。データベースまたは仮想化のバックエンドストレージとしてデータセットを使用する場合、ダウンタイムが短くても痛いです。また、これを機能させるには、別の空のプールが必要です。
-wabbit
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.