ZFSがext4やbtrfsよりもずっと遅いのはなぜですか?


11

問題

最近、新しいディスクをインストールし、その上にzpoolを作成しました。

/# zpool create morez /dev/sdb

しばらく使用した後、かなり遅いことに気付きました。

/morez# fio --name rw --rw rw --size 10G
   read: IOPS=19.6k, BW=76.6MiB/s (80.3MB/s)(5120MiB/66834msec)
  write: IOPS=19.6k, BW=76.6MiB/s (80.3MB/s)(5120MiB/66834msec)

このテストは、実際の使用例とかなり似ています。ディスクから適度な数(〜10k)の画像(それぞれ〜2 MiB)を読み取っています。ディスクがほとんど空のときにそれらは一度にすべて書き込まれたので、断片化されるとは思わない。

比較のために、ext4をテストしました。

/# gdisk /dev/sdb
...
/# mkfs.ext4 -f /dev/sdb1 && mount /dev/sdb1 /mnt && cd /mnt
/mnt# fio --name rw --rw rw --size 10G
   read: IOPS=48.3k, BW=189MiB/s (198MB/s)(5120MiB/27135msec)
  write: IOPS=48.3k, BW=189MiB/s (198MB/s)(5120MiB/27135msec)

そして、btrfs:

/# mkfs.btrfs -f /dev/sdb1 && mount /dev/sdb1 /mnt && cd /mnt
/mnt# fio --name rw --rw rw --size 10G
   read: IOPS=51.3k, BW=201MiB/s (210MB/s)(5120MiB/25528msec)
  write: IOPS=51.3k, BW=201MiB/s (210MB/s)(5120MiB/25528msec)

ZFSのパフォーマンスの問題の原因は何ですか?また、どのように高速化できますか?

ソリューションで失敗した試行

私のディスク(Seagate ST1000DM003)は4096バイトの物理セクターを使用するため、zpoolのセクターサイズを明示的に設定しようとしました。

/# zpool create -o ashift=12 morez /dev/sdb

これはパフォーマンスを改善しませんでした:

/morez# fio --name rw --rw rw --size 10G
   read: IOPS=21.3k, BW=83.2MiB/s (87.2MB/s)(5120MiB/61573msec)
  write: IOPS=21.3k, BW=83.2MiB/s (87.2MB/s)(5120MiB/61573msec)

観察

奇妙なことに、zvolを使用すると優れたパフォーマンスが得られました。

/# zfs create -V 20G morez/vol
/# fio --name rw --filename /dev/zvol/morez/vol --rw rw --size 10G
   read: IOPS=52.7k, BW=206MiB/s (216MB/s)(5120MiB/24852msec)
  write: IOPS=52.7k, BW=206MiB/s (216MB/s)(5120MiB/24852msec)

なぜこれはZFSファイルシステムにのみ影響し、zvolsには影響しないのですか?

btrfsの拡張テスト

コメントでは、違いはキャッシングによるものである可能性が示唆されました。さらにテストを行った結果、これは事実ではないと思います。私はbtrfsテストのサイズをコンピューターのメモリ量を大きく超えて増やしましたが、そのパフォーマンスはZFSのそれよりもはるかに優れていました。

/# mkfs.btrfs -f /dev/sdb1 && mount /dev/sdb1 /mnt && cd /mnt
/mnt# $ fio --name rw --rw rw --size 500G --runtime 3600 --time_based --ramp_time 900
   read: IOPS=41.9k, BW=164MiB/s (172MB/s)(576GiB/3600003msec)
  write: IOPS=41.9k, BW=164MiB/s (172MB/s)(576GiB/3600003msec)

システム情報

ソフトウェア

  • Arch Linux、カーネルバージョン4.11.6
  • Linux 0.6.5.10上のZFS
  • フィオ2.21

ハードウェア

ZFS情報

以下に、fioを実行する前のZFSプロパティを示します。これらは、デフォルト設定でzpoolを作成した結果です。

# zpool get all morez
NAME   PROPERTY                    VALUE            SOURCE
morez  size                        928G             -
morez  capacity                    0%               -
morez  altroot                     -                default
morez  health                      ONLINE           -
morez  guid                        [removed]        default
morez  version                     -                default
morez  bootfs                      -                default
morez  delegation                  on               default
morez  autoreplace                 off              default
morez  cachefile                   -                default
morez  failmode                    wait             default
morez  listsnapshots               off              default
morez  autoexpand                  off              default
morez  dedupditto                  0                default
morez  dedupratio                  1.00x            -
morez  free                        928G             -
morez  allocated                   276K             -
morez  readonly                    off              -
morez  ashift                      0                default
morez  comment                     -                default
morez  expandsize                  -                -
morez  freeing                     0                default
morez  fragmentation               0%               -
morez  leaked                      0                default
morez  feature@async_destroy       enabled          local
morez  feature@empty_bpobj         enabled          local
morez  feature@lz4_compress        active           local
morez  feature@spacemap_histogram  active           local
morez  feature@enabled_txg         active           local
morez  feature@hole_birth          active           local
morez  feature@extensible_dataset  enabled          local
morez  feature@embedded_data       active           local
morez  feature@bookmarks           enabled          local
morez  feature@filesystem_limits   enabled          local
morez  feature@large_blocks        enabled          local

# zfs get all morez
NAME   PROPERTY              VALUE                  SOURCE
morez  type                  filesystem             -
morez  creation              Thu Jun 29 19:34 2017  -
morez  used                  240K                   -
morez  available             899G                   -
morez  referenced            96K                    -
morez  compressratio         1.00x                  -
morez  mounted               yes                    -
morez  quota                 none                   default
morez  reservation           none                   default
morez  recordsize            128K                   default
morez  mountpoint            /morez                 default
morez  sharenfs              off                    default
morez  checksum              on                     default
morez  compression           off                    default
morez  atime                 on                     default
morez  devices               on                     default
morez  exec                  on                     default
morez  setuid                on                     default
morez  readonly              off                    default
morez  zoned                 off                    default
morez  snapdir               hidden                 default
morez  aclinherit            restricted             default
morez  canmount              on                     default
morez  xattr                 on                     default
morez  copies                1                      default
morez  version               5                      -
morez  utf8only              off                    -
morez  normalization         none                   -
morez  casesensitivity       sensitive              -
morez  vscan                 off                    default
morez  nbmand                off                    default
morez  sharesmb              off                    default
morez  refquota              none                   default
morez  refreservation        none                   default
morez  primarycache          all                    default
morez  secondarycache        all                    default
morez  usedbysnapshots       0                      -
morez  usedbydataset         96K                    -
morez  usedbychildren        144K                   -
morez  usedbyrefreservation  0                      -
morez  logbias               latency                default
morez  dedup                 off                    default
morez  mlslabel              none                   default
morez  sync                  standard               default
morez  refcompressratio      1.00x                  -
morez  written               96K                    -
morez  logicalused           72.5K                  -
morez  logicalreferenced     40K                    -
morez  filesystem_limit      none                   default
morez  snapshot_limit        none                   default
morez  filesystem_count      none                   default
morez  snapshot_count        none                   default
morez  snapdev               hidden                 default
morez  acltype               off                    default
morez  context               none                   default
morez  fscontext             none                   default
morez  defcontext            none                   default
morez  rootcontext           none                   default
morez  relatime              off                    default
morez  redundant_metadata    all                    default
morez  overlay               off                    default

使用中のハードウェア、OSとバージョン、コントローラー、システム設定などの詳細はありません。何を伝えることができるかわかりません!
ewwhite

2
ドライブ自体は何ですか?市販の一般的なSATAドライブです。実際に200 MB /秒以上を持続的に処理できることを証明するには長い道のりがあります。実世界の条件下でのほとんどの一般消費者向けのSATAドライブは、1秒あたり70〜80を超えるI / O操作、または約100〜120 MB /秒を超えることができます。そして、そのようなドライブに対してランダムな小ブロックI / O操作を行うと、30〜40 KB /秒のようなものが得られる可能性があります。10 GBがあまりにも簡単にキャッシュに蓄積される可能性があります。
アンドリューヘンレ

1
いいえチューニング設定が中に存在していない@ewwhite/etc/modprobe.d/zfs.conf
スノーボール

1
@ewwhite彼らはそうです。各テストの間にパーティションテーブルを消去しました。いずれの場合も、パーティションにはディスクの先頭から1 MiBのオフセットがありました。
スノーボール

1
この質問につまずく自分自身/他の誰かに注意してください:ewwhiteが言及しているチューニング設定はに文書化されていman 5 zfs-module-parametersます。
スノーボール

回答:


6

古いものの、この質問には答えが必要だと思います。

fioデフォルトでは、4KBサイズのIOPを発行します。代わりに、ZFSデータセットはデフォルトで128KBの記録を使用します。この不一致は、4Kの書き込みごとに128Kレコード全体の読み取り/変更/書き込みが発生することを意味します。

一方、ZVOLはデフォルトで8K volblocksizeを使用します。これは、4K書き込みによって8Kレコードの読み取り/変更/書き込みサイクルがはるかに短くなり、運が良ければ、2つの4K書き込みを1つの8K書き込みに結合できることを意味します(読み取り/変更/書き込みはまったく必要ありません)。

ZFSデータセットのレコードサイズはで変更できます。zfs set recordize=8K <dataset>この場合、ZVOLとほぼ同等のパフォーマンスが得られます。ただし、比較的大きな転送に使用する場合(OPは、アクセスされるたびに完全に読み取られる必要がある2 MBのファイルについて話しました)、大規模なレコードサイズ/ volblocksizeがあり、デフォルト設定(128K)よりも大きい場合があります。


4

注:fioジョブが不足しているためdirect=1http://fio.readthedocs.io/en/latest/fio_doc.html#cmdoption-arg-direct)実行されているI / Oの一部(読み取り書き込みの両方)がキャッシュされる場合がありますオペレーティングシステムによって、結果がゆがめられます(そして、数値が人為的に高くなります)。これ自体は、以下によってさらに複雑になります。

O_DIRECTLinuxではO_DIRECTヒントのほうが多いため(/programming//a/46377629/2732969のリファレンスセクションを参照)、バッファーI / Oの実行は引き続き許可されていることに注意してください

キャッシュを正しくバイパスできない状況にある場合は、キャッシュの影響を最小限に抑えるために、十分な大きさの領域で十分なI / Oを行うことが重要です(もちろん、実際にキャッシュをテストしたい場合を除きます)...

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