web-dev-qa-db-ja.com

8ドライブ4 vdevストライプミラープールを使用したZFSの低速読み取り

プールで使用するsdbからsdiまでの8つの3TB Western Digital Red SATAドライブがあります。

私のブートおよびOSドライブは、sda上の850 EVO SSDです。

8個のWDドライブは、Supermicro AOC-SAS2LP-MV8アドオンカード、​​Supermicro ATXでx8で実行されるPCIE 3.0 x16のチャネルあたり600µMbyte/sの8チャネルSAS/SATAアダプタ上にあります。 DDR4 LGA 1151 C7Z170-OCE-Oマザーボード。

サーバーとZFSのセットアップは次のとおりです。

[root@nas ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)

[root@nas ~]# uname -a
Linux nas.whittenberg.domain 3.10.0-327.28.2.el7.x86_64 #1 SMP Wed Aug 3 11:11:39 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

[root@nas ~]# cat /var/log/dmesg | grep ZFS
[    0.793572] ZFS: Loaded module v0.6.5.7-1, ZFS pool version 5000, ZFS filesystem version 5
[root@nas ~]# cat /var/log/dmesg | grep SPL
[    0.777144] SPL: Loaded module v0.6.5.7-1

[root@nas ~]# cat /etc/modprobe.d/zfs.conf
# disable prefetch = 1
options zfs zfs_prefetch_disable=0
# set arc max to 48GB. I have 64GB in my server
options zfs zfs_arc_max=51539607552
# set size to 128k same as file system block size
options zfs zfs_vdev_cache_size=1310720
options zfs zfs_vdev_cache_max=1310720
options zfs zfs_read_chunk_size=1310720
options zfs zfs_vdev_cache_bshift=12
options zfs zfs_read_chunk_size=1310720
# Set thes to 10 so we get better IO at cost of banwidth
options zfs zfs_vdev_async_read_max_active=10
options zfs zfs_vdev_async_read_min_active=10
options zfs zfs_vdev_async_write_max_active=10
options zfs zfs_vdev_async_write_min_active=10
options zfs zfs_vdev_sync_read_max_active=10
options zfs zfs_vdev_sync_read_min_active=10
options zfs zfs_vdev_sync_write_max_active=10
options zfs zfs_vdev_sync_write_min_active=10

[root@nas ~]# zpool status
  pool: myraid
 state: ONLINE
  scan: scrub repaired 0 in 0h16m with 0 errors on Sun Aug  7 01:40:49 2016
config:

        NAME        STATE     READ WRITE CKSUM
        myraid      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            sdb     ONLINE       0     0     0
            sdc     ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            sdd     ONLINE       0     0     0
            sde     ONLINE       0     0     0
          mirror-2  ONLINE       0     0     0
            sdf     ONLINE       0     0     0
            sdg     ONLINE       0     0     0
          mirror-3  ONLINE       0     0     0
            sdh     ONLINE       0     0     0
            sdi     ONLINE       0     0     0

errors: No known data errors

[root@nas ~]# zpool iostat -v
               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
myraid       382G  10.5T    119     35  14.0M   606K
  mirror    95.5G  2.63T     29      8  3.49M   149K
    sdb         -      -     28      8  3.50M   153K
    sdc         -      -     28      8  3.50M   153K
  mirror    95.5G  2.63T     29      8  3.49M   151K
    sdd         -      -     28      8  3.50M   155K
    sde         -      -     28      8  3.50M   155K
  mirror    95.5G  2.63T     29      8  3.49M   152K
    sdf         -      -     28      8  3.50M   156K
    sdg         -      -     28      8  3.50M   156K
  mirror    95.5G  2.63T     29      9  3.49M   155K
    sdh         -      -     28      9  3.50M   159K
    sdi         -      -     28      9  3.50M   159K
----------  -----  -----  -----  -----  -----  -----

[root@nas ~]# zfs get all
NAME    PROPERTY              VALUE                  SOURCE
myraid  type                  filesystem             -
myraid  creation              Sat Aug  6 21:01 2016  -
myraid  used                  382G                   -
myraid  available             10.2T                  -
myraid  referenced            382G                   -
myraid  compressratio         1.05x                  -
myraid  mounted               yes                    -
myraid  quota                 none                   default
myraid  reservation           none                   default
myraid  recordsize            128K                   local
myraid  mountpoint            /myraid                default
myraid  sharenfs              off                    default
myraid  checksum              fletcher4              local
myraid  compression           lz4                    local
myraid  atime                 off                    local
myraid  devices               on                     default
myraid  exec                  on                     default
myraid  setuid                on                     default
myraid  readonly              off                    default
myraid  zoned                 off                    default
myraid  snapdir               hidden                 default
myraid  aclinherit            restricted             default
myraid  canmount              on                     default
myraid  xattr                 on                     default
myraid  copies                1                      default
myraid  version               5                      -
myraid  utf8only              off                    -
myraid  normalization         none                   -
myraid  casesensitivity       sensitive              -
myraid  vscan                 off                    default
myraid  nbmand                off                    default
myraid  sharesmb              off                    default
myraid  refquota              none                   default
myraid  refreservation        none                   default
myraid  primarycache          all                    local
myraid  secondarycache        all                    default
myraid  usedbysnapshots       0                      -
myraid  usedbydataset         382G                   -
myraid  usedbychildren        1.98M                  -
myraid  usedbyrefreservation  0                      -
myraid  logbias               latency                local
myraid  dedup                 off                    local
myraid  mlslabel              none                   default
myraid  sync                  disabled               local
myraid  refcompressratio      1.05x                  -
myraid  written               382G                   -
myraid  logicalused           403G                   -
myraid  logicalreferenced     403G                   -
myraid  filesystem_limit      none                   default
myraid  snapshot_limit        none                   default
myraid  filesystem_count      none                   default
myraid  snapshot_count        none                   default
myraid  snapdev               hidden                 default
myraid  acltype               off                    default
myraid  context               none                   default
myraid  fscontext             none                   default
myraid  defcontext            none                   default
myraid  rootcontext           none                   default
myraid  relatime              off                    default
myraid  redundant_metadata    all                    default
myraid  overlay               off                    default

[root@nas ~]# zpool get all
NAME    PROPERTY                    VALUE                       SOURCE
myraid  size                        10.9T                       -
myraid  capacity                    3%                          -
myraid  altroot                     -                           default
myraid  health                      ONLINE                      -
myraid  guid                        1068639342092444414         default
myraid  version                     -                           default
myraid  bootfs                      -                           default
myraid  delegation                  on                          default
myraid  autoreplace                 off                         default
myraid  cachefile                   -                           default
myraid  failmode                    wait                        default
myraid  listsnapshots               off                         default
myraid  autoexpand                  off                         default
myraid  dedupditto                  0                           default
myraid  dedupratio                  1.00x                       -
myraid  free                        10.5T                       -
myraid  allocated                   382G                        -
myraid  readonly                    off                         -
myraid  ashift                      0                           default
myraid  comment                     -                           default
myraid  expandsize                  -                           -
myraid  freeing                     0                           default
myraid  fragmentation               1%                          -
myraid  leaked                      0                           default
myraid  feature@async_destroy       enabled                     local
myraid  feature@empty_bpobj         enabled                     local
myraid  feature@lz4_compress        active                      local
myraid  feature@spacemap_histogram  active                      local
myraid  feature@enabled_txg         active                      local
myraid  feature@hole_birth          active                      local
myraid  feature@extensible_dataset  enabled                     local
myraid  feature@embedded_data       active                      local
myraid  feature@bookmarks           enabled                     local
myraid  feature@filesystem_limits   enabled                     local
myraid  feature@large_blocks        enabled                     local

[root@nas ~]# zdb | grep ashift
            ashift: 12
            ashift: 12
            ashift: 12
            ashift: 12

[root@nas ~]# lsblk  -t -e 11,1
NAME                ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED RQ-SIZE  RA WSAME
sda                         0    512      0     512     512    0 cfq       128 128    0B
+-sda1                      0    512      0     512     512    0 cfq       128 128    0B
+-sda2                      0    512      0     512     512    0 cfq       128 128    0B
+-sda3                      0    512      0     512     512    0 cfq       128 128    0B
  +-centos_nas-swap         0    512      0     512     512    0           128 128    0B
  +-centos_nas-root         0    512      0     512     512    0           128 128    0B
  +-centos_nas-home         0    512      0     512     512    0           128 128    0B
sdb                         0   4096      0    4096     512    1 noop      128 128    0B
+-sdb1                      0   4096      0    4096     512    1 noop      128 128    0B
+-sdb9                      0   4096      0    4096     512    1 noop      128 128    0B
sdc                         0   4096      0    4096     512    1 noop      128 128    0B
+-sdc1                      0   4096      0    4096     512    1 noop      128 128    0B
+-sdc9                      0   4096      0    4096     512    1 noop      128 128    0B
sdd                         0   4096      0    4096     512    1 noop      128 128    0B
+-sdd1                      0   4096      0    4096     512    1 noop      128 128    0B
+-sdd9                      0   4096      0    4096     512    1 noop      128 128    0B
sde                         0   4096      0    4096     512    1 noop      128 128    0B
+-sde1                      0   4096      0    4096     512    1 noop      128 128    0B
+-sde9                      0   4096      0    4096     512    1 noop      128 128    0B
sdf                         0   4096      0    4096     512    1 noop      128 128    0B
+-sdf1                      0   4096      0    4096     512    1 noop      128 128    0B
+-sdf9                      0   4096      0    4096     512    1 noop      128 128    0B
sdg                         0   4096      0    4096     512    1 noop      128 128    0B
+-sdg1                      0   4096      0    4096     512    1 noop      128 128    0B
+-sdg9                      0   4096      0    4096     512    1 noop      128 128    0B
sdh                         0   4096      0    4096     512    1 noop      128 128    0B
+-sdh1                      0   4096      0    4096     512    1 noop      128 128    0B
+-sdh9                      0   4096      0    4096     512    1 noop      128 128    0B
sdi                         0   4096      0    4096     512    1 noop      128 128    0B
+-sdi1                      0   4096      0    4096     512    1 noop      128 128    0B
+-sdi9                      0   4096      0    4096     512    1 noop      128 128    0B

私の問題は、10Gbit/s接続(DAC PCからサーバー)で初めてファイルを読み込むとき、またはプールからサーバーのSSDにrsyncを使用すると、100Mバイトをわずかに超えることです。/s。同じファイルを2回目に読み込むと、10µGbit/s DAC接続で1.2µGbyte/sを、プールからSSDに380µMbyte/sを取得します。

サーバーを再起動して、プールからSSDへのテスト読み取りを実行します。

[root@nas ~]# rsync -h --progress /myraid/testmovie.avi /home/samba/testmovie.avi
testmovie.avi
       1.08G 100%   79.59MB/s    0:00:12 (xfer#1, to-check=0/1)

sent 1.08G bytes  received 31 bytes  80.21M bytes/sec
total size is 1.08G  speedup is 1.00

その後、一度読んだ後も同じことをします。

[root@nas ~]# rsync -h --progress /myraid/testmovie.avi /home/samba/testmovie.avi
testmovie.avi
       1.08G 100%  394.54MB/s    0:00:02 (xfer#1, to-check=0/1)

sent 1.08G bytes  received 31 bytes  433.13M bytes/sec
total size is 1.08G  speedup is 1.00

ポインタはありますか?最初の読み取りで4つのドライブの読み取り速度を取得する必要はありませんか?

3
CB40

理論的に言えば

非常に理論的な世界では、プール構成(4つのvdev、それぞれ2つのディスクミラー)から、1つのディスクの速度の8倍に相当する読み取り帯域幅が期待できます。理由は:

  • ミラーvdevでは、 ZFS は両方のディスクから異なるデータブロックを同時に読み取ることができます。
  • マルチvdevプールでは、ZFSはデータを自動的にストライプ化するため、複数のvdevから同時に読み取ることができます。

Western Digital 3µTB Redドライブは140µMB/s以上で読み取ることができると主張しています。少なくとも常にそうではありません。これらのドライブの1つから100µMB/sを取得できると仮定しましょう。これらをプール構成で組み合わせると、理論的に最大800µMB/sの読み取り帯域幅を取得できます。

現実の世界へようこそ

さて、はっきりさせてください:800 MB/s、それはおそらく起こらないでしょう!ZFSがあなたにあるからではなく、その帯域幅の計算のためハードウェアが邪魔になっていないという仮定に基づいています。ただし、実際のワークロードでは理論上の速度が得られません。

もちろん、多くのディスクを1つの大きなプールに組み合わせることで、ある程度のパフォーマンスの改善が期待されることは理解しています。

どうしたの?

テストを見てみましょう: rsync で大きなファイルを最初にコピーすると80 MB/sになり、同じことを2回目にすると400 MB/sになります。違いの説明は Adaptive Replacement Cache (ARC)であり、すでに知っていると思います。完全を期すために言っておきます。

ZFS ARCは、頻繁にアクセスされるデータをRAMに保存するメカニズムを提供します。

ZFSデータセットから初めてファイルを読み取るとき、ZFSは実際にディスクからデータを読み取る必要があります。それまでは、読み取りキャッシュにデータを取り込みます。 2回目の同じファイルの読み取りでは、RAMから直接データを取得します。システムには、1.08GBの完全なファイルを保持するのに十分な容量があると言いました。これは、rsync(400µMB/s)を使用してファイルを再度コピーするときに表示される速度は、ZFSプールの物理ディスクとは関係がないことを意味します。 SSDsdaドライブの書き込み速度と考えることができます。正確に言うと、SSDのraw書き込み速度ではありません。rsyncを使用して、非常に低遅延で高帯域幅のメディア(RAMメモリ)からデータを読み取り、SSDドライブに書き込むときの速度です。 (これも非常に低いレイテンシを持っています)。さらに、Linuxはおそらく、利用可能なRAMメモリをすべて使用して、SSDドライブパーティションへの非同期書き込みをキャッシュすることを考慮すべきだと思います(ここでは想定しています!)。

したがって、この時点で、問題が発生します:RAMからSSDへの書き込み速度が400 MB/sのように見える場合、なぜZFSが実際にディスクから読み込んでいるときは80MB/sですか?それは単一のディスク速度よりも遅いです!明らかに、SSD自体を非難することはできず、ZFSプール内のすべてのドライブからさらに多くのものを期待していました!

正直に言うと、完全な答えはありません。私がこれまでに言ったことすべてを検討した後、あなたの質問に対する私の部分的な答えはです:

  • 私には、I/Oアクティビティが多いため帯域幅が低いように見えます。つまり、rsyncは実際には大きなファイルの直接的な連続読み取りを許可せず、代わりにストリーミングパフォーマンスに深刻な影響を与える可能性のある大量のI/Oを生成していますドライブに大量のI/Oに伴う遅延がある場合。 Western Digital Redディスクは NAS アプリケーション用であり、高いIOPSではなく、適切な帯域幅と優れた$/GB比率を目的としていることを思い出してください。 RAM(低遅延メディア)とまったく同じことを行ったとき、全体的なストリーミングパフォーマンスは良好でした。
  • rsyncは、ベンチマーク ZFSプールなどの良い方法ではありません。 rsync performanceをグーグルで検索すると、通常のファイルコピーよりも遅いことを示す証拠が表示されます-正当な理由から、速度はrsyncの使用目的ではありません。他のベンチマーク方法を探します。 dd またはcpだけでも、順次読み取り/書き込みテストのより適切な選択肢になる可能性があります。インスピレーションについては この記事 をご覧ください。
  • また、ディスクがZFSプールに追加される前にテストを実行して、real単一ディスク読み取りパフォーマンスを把握しようとします。プールを破壊し(データが失われます:必要に応じて最初にバックアップを作成してください!)、すべてのディスクでテストを実行し、プールを再度定義して、さらにテストを行います。次に、観察した実際の速度に基づいて数学を適用し、ZFSプール構成に基づいて理論読み取り帯域幅について再度仮定します(4 vdevs * 2ディスクミラー=シングルディスク帯域幅* 8)。
  • すべてのディスクでテストを実行する場合(プールで使用する前に)、1つ以上のディスクが正常な状態ではないことがわかります。ディスクを購入したばかりの場合は、不良ディスクを返品して交換を依頼してください。
  • すべてのディスクでテストを実行し、すべてのパフォーマンスが一貫して低速であることが判明した場合、ハードウェア関連の問題(構成、ドライバーサポート、または他の同様の問題)に直面している可能性があります。
  • 異なるハードウェア構成(可能であれば)を試し、それぞれに対してテストを実行します。単一のミラーvdevプールを使用してテストを実行し、より多くのvdevを組み合わせてみてください。期待どおりの結果が得られるかどうかを確認してください。

まとめるには:ボトルネックがどこにあるかを系統的に調べる必要があります。 ZFS自体だと思い込まないでください。おそらくそうではありません。さまざまな構成を試して、ジョブに適したツールを使用してテストを実行します。

私はベンチマークやテストの専門家ではないので、その点についてアドバイスはしません。インターネットには、このトピックに関するすばらしい資料がたくさんあります。 ZFSに固有のいくつかの側面に触れたいと思います。

2
Daniele Barresi