Вопрос: Почему `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 выполнить аналогичный тест (в файловой системе с сотнями снимков на вращающихся жестких дисках)?

Есть ли временное решение, чтобы получить быстрый список снимков для объем, который по своей природе не имеет .zfs каталог?

Я проверил вышеуказанный тест с ZFS-on-Linux 0.6.5.2-2-wheezy на ядре 2.6.32-43-pve x86_64 (Proxmox), но я всегда видел эту проблему как на старших, так и на более новых 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  -

Он содержит 114 файловых систем и 1 том, каждый с сотнями снимков, так как это zfs send / zfs recv резервный сервер.


Решение:  zfs list медленно, потому что он получает дополнительную информацию, даже если она не отображается. Решение добавляет оба -o name -s name, то есть, используя zfs list -t snapshot -o name -s name


5
2017-08-23 09:14


Источник


Какой результат zpool list а также zfs list? Например. насколько полная ваша файловая система? - ewwhite
@ewwhite добавила информацию. Он довольно пуст (колпачок 37%) - Tobia


Ответы:


Операции моментального снимка - это функция количества снимков, которые вы имеете, ОЗУ, производительности диска и пространства на диске. Это будет общая проблема ZFS, а не что-то уникальное для Linux-варианта.

Лучший вопрос: Почему у вас есть 1797 снимков звола? Это определенно больше, чем рекомендуется, и заставляет меня задаться вопросом, что еще происходит в системе.

Люди говорят, что «снимки ZFS бесплатны», но это не всегда так.

Хотя привязки ZFS не влияют на производство производительность, высокий уровень, который у вас явно требует доступа к дискам для перечисления.

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

против

# 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
2017-08-23 09:46



Пул имеет более 100 файловых систем и томов, каждый из которых имеет 1000+ снимков, поскольку он используется в качестве резервного сервера. Нет ввода-вывода, кроме добавления новых снимков (с zfs send -I ... | ssh ... 'zfs receive -F ...') и отбрасывая старые. В любом случае, почему ls .zfs/snapshot скопировать точные данные в одно мгновение? Этого достаточно для моих целей, но я не могу найти эквивалент для томов. - Tobia
У вас не должно быть таких снимков для одного. Лучше держать их ниже 1000. ls быстрее и не зависит от количества снимков, потому что это простой список каталогов. - ewwhite
Он не назвал бы это «простой список каталогов», потому что это виртуальный каталог, который вызывает определенный код ядра, /proc, У вас есть официальный источник о том, как хранить снимки ниже 1000? Это резервный сервер, поэтому большое количество файловых систем и моментальных снимков является цельной целью этого сервера. - Tobia
Я не согласен. В любом случае, спасибо за strace -c выход, я этого не знал. мой zfs list выполняет 1 ioctl за моментальный снимок, который явно собирает больше данных, чем просто имя, как предположил @MatijaNalis. Я посмотрю, смогу ли я придумать свою собственную утилиту, которая собирает только имена, если API модуля ядра поддерживает его. - Tobia
Эта страница содержит следующее обходное решение zfs list -t snapshot -o name -s name который работает. Мне не хватало -s name, благодаря - Tobia


zfs list -t snapshot всегда занимает много порядков больше времени для запуска, чем ls .zfs/snapshot

Вы также сравниваете две совершенно разные операции.

zfs list -t snapshot перечисляет все снимки ZFS в системе - а также предоставляет много информации об этих моментальных снимках, таких как объем используемого пространства. Запустите это под strace для просмотра сделанных системных вызовов.

ls .zfs/snapshot просто испускает простой список имен из каталога. Ничего не нужно делать, кроме как читать имена, и ничего не предоставлять.


4
2017-08-23 10:20



Если вы посмотрите на мой фактический пример, я бегу zfs list -r -t snapshot -H -o name pool/filesystem который выводит те же данные, что и ls .zfs/snapshot - Tobia
@Tobia zfs list скорее всего, собирают все данные, а затем просто фильтруют вывод по вашему запросу. Его можно было бы переписать более умным и не собирать дорогостоящие данные, если они не нужны для вывода, но оптимизация для такого краевого случая обычно не является конструктивным использованием времени. Не стесняйтесь его реализовать! - Matija Nalis
Файловая система ls это совершенно другая операция, чем zfs list -t snapshot, Просто потому, что вывод тот же, не означает, что то же самое происходит за кулисами. - ewwhite