web-dev-qa-db-ja.com

「zfs list -t snapshot」が「ls .zfs / snapshot」よりも桁違いに遅いのはなぜですか?

私がこれまでに試したすべてのZFS-on-Linuxバージョンでは、zfs listを使用してファイルシステムまたはボリュームのすべてのスナップショット(zfs list -r -t snapshot -H -o name pool/filesystem)を一覧表示すると、即時実行されるls .zfs/snapshotよりも実行に多くの時間がかかります。

$ time ls -1 /srv/vz/subvol-300-disk-1/.zfs/snapshot
[list of 1797 snapshots here]
real    0m0.023s
user    0m0.008s
sys     0m0.014s

# time zfs list -r -t snapshot -H -o name vz/subvol-300-disk-1
[same list of 1797 snapshots]
real    1m23.092s
user    0m0.110s
sys     0m0.758s

このバグはZFS-on-Linuxに固有のものですか?

SolarisまたはFreeBSDのZFSボックスを使用している人が、同様のテストを実行できますか?

volumeのスナップショットのクイックリストを取得するための回避策はありますか?本質的に、.zfsディレクトリがありませんか?

カーネル2.6.32-43-pve x86_64(Proxmox)でZFS-on-Linux 0.6.5.2-2-wheezyを使用して上記のテストを実行しましたが、新旧のZFSとカーネルの両方でこの問題が常に発生しましたバージョン。


プールの統計は次のとおりです。

# zpool list
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
vz    25.2T  9.42T  15.8T         -     5%    37%  1.00x  ONLINE  -

これは、zfs send/zfs recvバックアップサーバーであるため、114のファイルシステムと1つのボリュームを含み、それぞれに数百のスナップショットがあります。


Solution:zfs listは、表示されていなくても追加情報を取得するため、低速です。解決策は、両方の-o name -s nameを追加することです。つまり、zfs list -t snapshot -o name -s nameを使用します。

6
Tobia

スナップショット操作は、使用しているスナップショットの数、RAM、ディスクパフォ​​ーマンス、ドライブ容量の関数です。 これは一般的なZFSの問題です 、Linuxバリアントに固有のものではありません。

より良い質問は次のとおりです:なぜzvolの1797のスナップショットがあるのですか?これは間違いなく推奨以上のものですシステムで他に何が起こっているのか不思議に思います。

人々は「ZFSスナップショットは無料だ」と言っていますが、それが常に正しいとは限りません。

ZFSスナップがproductionパフォーマンスに影響を与えることはありませんが、列挙するためにディスクアクセスが明らかに必要な高い数値です。

Disk access time > RAM access time、したがって、差の大きさのオーダー。


strace出力。システムコールごとの時間に注意し、ファイルシステム内のスナップショットの数に応じてどれだけうまくスケーリングできないかを想像してください。

# strace -c ls /ppro/.zfs/snapshot

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  0.00    0.000000           0        10           read
  0.00    0.000000           0        17           write
  0.00    0.000000           0        12           open
  0.00    0.000000           0        14           close
  0.00    0.000000           0         1           stat
  0.00    0.000000           0        12           fstat
  0.00    0.000000           0        28           mmap
  0.00    0.000000           0        16           mprotect
  0.00    0.000000           0         3           munmap
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         2           rt_sigaction
  0.00    0.000000           0         1           rt_sigprocmask
  0.00    0.000000           0         2           ioctl
  0.00    0.000000           0         1         1 access
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         1           fcntl
  0.00    0.000000           0         2           getdents
  0.00    0.000000           0         1           getrlimit
  0.00    0.000000           0         1           statfs
  0.00    0.000000           0         1           Arch_prctl
  0.00    0.000000           0         2         1 futex
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         1           set_robust_list
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                   133         2 total

versus

# strace -c zfs list -t snapshot

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.003637          60        61         7 ioctl
  0.00    0.000000           0        12           read
  0.00    0.000000           0        50           write
  0.00    0.000000           0        19           open
  0.00    0.000000           0        19           close
  0.00    0.000000           0        15           fstat
  0.00    0.000000           0        37           mmap
  0.00    0.000000           0        19           mprotect
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0         4           brk
  0.00    0.000000           0         2           rt_sigaction
  0.00    0.000000           0         1           rt_sigprocmask
  0.00    0.000000           0         3         1 access
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         1           getrlimit
  0.00    0.000000           0         1           Arch_prctl
  0.00    0.000000           0         2         1 futex
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         1           set_robust_list
------ ----------- ----------- --------- --------- ----------------
100.00    0.003637                   250         9 total
1
ewwhite

zfs list -t snapshotの実行には、常にls .zfs/snapshotよりも桁違いに時間がかかります。

また、2つの完全に異なる操作を比較しています。

zfs list -t snapshotは、システム上のすべてのZFSスナップショットを列挙します-andは、使用されているスペースの量など、それらのスナップショットに関する多くの情報を提供します。これをstraceで実行して、行われたシステムコールを確認します。

ls .zfs/snapshotは、ディレクトリから単純な名前リストを出力しているだけです。名前を読む以外にすべきことは何もありません-そして他に何も提供しません。

4
Andrew Henle