私は、SATA 3.0バックプレーン経由で8x10TB HDDを備えたUbuntu 16.04バックアップサーバーを使用しています。 8つのハードディスクがRAID6に組み立てられ、EXT4ファイルシステムが使用されています。このファイルシステムは非常に多くのSEEK操作を伴う大量の小さなファイルを保存しますが、IOスループットは低くなります。実際、さまざまなサーバーからの小さなファイルが多数あり、毎日rsnapshotを介してスナップショットされます(複数のINODESが直接同じファイルです。ファイルシステム(60TBネット)の使用率が50%を超えているため、パフォーマンスは非常に低くなっています。現時点では、使用率は75%であり、
du -sch /backup-root/
数日かかります!マシンには8つのコアと16GのRAMが搭載されています。 RAMは、OSファイルシステムキャッシュによって完全に使用されます。8つのコアのうち7つは、IOWAITのために常にアイドル状態です。
Filesystem volume name: <none>
Last mounted on: /
Filesystem UUID: 5af205b0-d622-41dd-990e-b4d660c12bd9
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 912203776
Block count: 14595257856
Reserved block count: 0
Free blocks: 4916228709
Free inodes: 793935052
First block: 0
Block size: 4096
Fragment size: 4096
Group descriptor size: 64
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 2048
Inode blocks per group: 128
RAID stride: 128
RAID stripe width: 768
Flex block group size: 16
Filesystem created: Wed May 31 21:47:22 2017
Last mount time: Sat Apr 14 18:48:25 2018
Last write time: Sat Apr 14 18:48:18 2018
Mount count: 9
Maximum mount count: -1
Last checked: Wed May 31 21:47:22 2017
Check interval: 0 (<none>)
Lifetime writes: 152 TB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256
Required extra isize: 28
Desired extra isize: 28
Journal inode: 8
First Orphan inode: 513933330
Default directory hash: half_md4
Directory Hash Seed: 5e822939-cb86-40b2-85bf-bf5844f82922
Journal backup: inode blocks
Journal features: journal_incompat_revoke journal_64bit
Journal size: 128M
Journal length: 32768
Journal sequence: 0x00c0b9d5
Journal start: 30179
この種のファイルシステムの使用経験はありません。これを調整するにはどのようなオプションが必要ですか。このシナリオではどのファイルシステムがより良いパフォーマンスを発揮しますか? OSに組み込まれているオプション以外の他のキャッシュオプションにRAMを使用するオプションはありますか?
大規模なRAIDアセンブリで非常に大量の小さなファイルをどのように処理しますか?
ありがとう、セバスチャン
私の質問に答えてくれたすべての人に感謝します。
まず、ボードにRAM)の最大量を追加しました。残念ながら、ボードは最大64GBのRAMしかサポートしていません。拡張後の動作を観察したところ、期待外れでした。利用可能なすべてのRAMがIOキャッシュに使用されたため、RSNAPSHOT-Backupのパフォーマンスはそれほど向上しませんでした。
だから私は大きなメイスを引っ張らなければなりませんでした。 2つの1TB NVMEディスクを追加してRAID 1に組み立てました。8x10TB HDDで構成されるRAID 6は、1つのRAID 1(2x 10TB HDD、ext4で構成)と1つのRAID 5(6x10TB HDDで構成)に分解されました。 RAID 1には現在、オペレーティングシステムとサーバーの作業用コピーが含まれています(これらは1日に4回このドライブにrsyncされます)。
RAID5はBCACHEでサポートされたデバイスになり、NVME-RAID 1でサポートされ、ext4でフォーマットされます。このドライブには、RSNAPSHOTコピーが含まれています。毎晩、ファイルはRAID1からRAID5にrsyncされます。これにより、作業コピーとバックアップスナップショットを含む以前のRAID6と比較して、RAID5のIOスループットが半分になります。 BCacheのおかげで、文字通りすべての単一ファイルがディスクに書き込まれるわけではありませんが、1つのブロック全体のすべての変更が一度に書き込まれます。これにより、HDDのIOpsがさらに減少しました。
最後に、RSnapshot構成を変更しました。以前は、31の日次スナップショットと18の月次スナップショットがあり、49のバックアップ世代がありました。今、私は古典的な7d/4w/12m/1y-Designを持っています、それはバックアップ世代の量を24に減らします。
これらの変更後(および64GB RAM)を使用した場合)、1つのスナップショットの継続時間が約20時間から1.5時間に短縮されました。BCacheデバイスのキャッシュヒット率は82%(通常の操作の6週間後)。
任務完了。皆様のご意見、ご感想をありがとうございました。
RAID6アレイに12x 2TBのディスクを使用し、非常に同じ目的で(rsnapshot
バックアップサーバー)使用する、同様の(小さいですが)セットアップがあります。
まず、du -hs
がこのように大きく、使用されているファイルシステムで非常に時間がかかることは完全に正常です。さらに、du
はハードリンクを考慮に入れているため、明らかなIO負荷に加えて、CPUにかなりのバースト的な負荷がかかります。
遅いのは、ファイルシステムのメタデータが(LBAの用語で)非常に離れたブロックにあり、多くのシークが発生するためです。通常の7.2K RPMディスクは約100 IOPSを提供するので、すべてのメタデータをロードするのに何日ではなくても何時間が必要かを確認できます。
あなたが(非破壊的に)状況を改善しようとすることができる何か:
mlocate/slocate
に/backup-root/
をインデックス付けするしないようにしてください( prunefs機能 を使用できます)それを避けてください)、またはメタデータキャッシュのゴミ箱はバックアップ時間を著しく損ないます;/backup-root/
でdu
を実行しないでください。必要に応じて、関心のある特定のサブフォルダでのみdu
を実行します。vfs_cache_pressure
デフォルト値(100)からより保守的な値(10または20)に。これは、データキャッシュではなくメタデータキャッシュを優先するようにカーネルに指示します。これにより、rsnapshot/rsync
の検出フェーズが高速化されます。あなたが試すことができる他のこと-しかし、これらは破壊的な操作です:
このファイルシステムは、非常に多くのSEEK操作を伴う大量の小さなファイルを格納しますが、IOスループットは低くなります。
????
これは、今日多くの人々を捕まえるものです。悲しいかな、従来のFSはここではうまく拡張できません。すでにお持ちのセットアップに関しては、ほんの少しアドバイスがあります: HDD上のRAID-6上のEXT4 :
vm.vfs_cache_pressure
を1に下げます。キャッシュバイアスを変更して、データ自体ではなく、より多くのメタデータ(inode、dentry)を保持するようにします。シークの数data=journal
でマウントする「すべてのデータがジャーナルされる」に切り替えてみてくださいUPD。: LinuxソフトウェアRAID (LSR)RAID-6であることが判明したため、ここに移動します追加アイテム:
echo 32768 | Sudo tee /sys/devices/virtual/block/md*/md/stripe_cache_size
—ただし、サイズに注意してこれを行ってください(必要に応じて小さい値を使用してください)。チャンクサイズの倍数であり、選択したチャンクサイズに応じて、RAMの容量が異なります—これはおそらく、ゼロから再設計せずに改善できることのほとんどです。
ファイルシステム(60TBネット)の使用率が50%を超えたため、パフォーマンスが非常に低下しています。現在、使用率は75%です
ディスク領域の占有率が高いと断片化が悪化するだけなので、これは非常に深刻な問題です。そして、より多くの断片化はより多くのシークを意味します。 50%に達する前に、多かれ少なかれ許容できるパフォーマンスが得られた理由はもはや不思議ではありません。多くのマニュアルには、FSが75〜80%を超えて成長しないようにする明確な推奨事項があります。
この場合、RAID6はあまり役に立ちません。ZFSのようなものは、速度をほぼ同じに保ちながら、より高速なメタデータとディレクトリアクセスを可能にする可能性があります。
RAID-6はドライブをストライプ化するため、すべてのIOはすべてのドライブに適用されます。これは、多くの小さなファイルではかなり非効率的です。しかし、これはおそらくあなたの主な問題ではありません...
Ext4は、数百万のファイルがある大きなファイルシステムにはあまり適していません。 [〜#〜] xfs [〜#〜]を使用します。私はXFSファイルシステムを1,2 PBまで実行しており、10億ものファイルがあり、問題ありません。 単純にXFSを使用。