Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Оплата
Новости
Доставка
Загрузки
Форум
Настройка
    info@proxmox.su
    +7 (495) 320-70-49
    Заказать звонок
    Аспро: ЛайтШоп
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Аспро: ЛайтШоп
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Аспро: ЛайтШоп
    Телефоны
    +7 (495) 320-70-49
    Заказать звонок
    0
    0
    0
    Аспро: ЛайтШоп
    • +7 (495) 320-70-49
      • Назад
      • Телефоны
      • +7 (495) 320-70-49
      • Заказать звонок
    • info@proxmox.su
    • Москва, Бакунинская улица, 69с1
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    Proxmox Виртуальная Среда
    Как освободить место в разрежённом томе ZFS?

    Форумы: Proxmox Виртуальная Среда, Proxmox Backup Server, Proxmox Mail Gateway, Proxmox Datacenter Manager
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Как освободить место в разрежённом томе ZFS?, Proxmox Виртуальная Среда
     
    carsten2
    Guest
    #1
    0
    14.04.2017 21:59:00
    У меня есть виртуальная машина с Windows 2003 на Proxmox 4.4, которая расположена на ZVOL. Диск на 80 ГБ, но Windows использует только 30 ГБ. Как можно освободить место на ZVOL? sdelete внутри виртуалки обнуляет свободное пространство, но, похоже, ZFS это не освобождает.
     
     
     
    carsten2
    Guest
    #2
    0
    13.05.2017 18:34:00
    Как я уже писал, та же проблема с Windows Server 2008 R2.
     
     
     
    Denny
    Guest
    #3
    0
    13.05.2017 22:00:00
    Похоже, ты запутался в том, как работает ZFS. Как только ты записываешь данные в блок, задача ZFS — запомнить эти данные. Ему всё равно, оди́н там или ноль, главное, чтобы они не менялись без операции записи. Если ты записываешь по всему диску, с точки зрения ZFS ты заполнил тонко выделенное устройство. Если ты сделал это, а такой результат тебе не нужен, переведи диск в формат qcow и используй сжатие, как ты уже упоминал. Потом вернёшь обратно — или нет. Думаю, ты убедишься, что запись нулей на любой тонко выделенный диск (независимо от технологии) даст одинаковый результат.
     
     
     
    carsten2
    Guest
    #4
    0
    16.05.2017 10:16:00
    Я понимаю, как работает тонкое выделение места (thin-provisioning) в ZFS. Это практически то же самое, что и в VMWARE ESXI, Workstation или формате QCOW2. Однако в последнем есть команда, позволяющая освободить неиспользуемое пространство, занятое нулями, чтобы вернуть место после удаления множества файлов в виртуальной машине и обнуления свободного пространства. Аналогично в Linux есть sparse-файлы, где можно «прорезать дыры» в уже существующем файле с помощью команды "fallocate --digholes myfile.xyz". Эта команда просматривает файл на наличие диапазонов нулей и деаллоцирует их. При последующем чтении этих участков в них содержатся «виртуальные нули» вместо «физических». Таким образом, логически файл остаётся тем же, но занимает место только под ненулевые данные на файловой системе. Ещё в SSD многие ОС имеют команду «деаллоцирования» под названием TRIM, которая удаляет из SSD блоки, неиспользуемые файловой системой, чтобы поддерживать сбор мусора и управление пространством SSD. Я бы ожидал, что в ZFS тоже есть похожий инструмент или команда, позволяющая деаллоцировать обнулённые блоки в ZVOL. Иначе весь принцип тонкого выделения в ZFS теряет смысл, так как рано или поздно все секторы будут записаны, и ZVOL превратится в полный (thick-provisioned) ZVOL. Так что тонкое выделение имеет смысл только, если есть возможность регулярно освобождать неиспользуемое пространство в thin-provisioned ZVOL и делать это в реальном времени. Технически проблем с этим нет, потому что клиент не сможет отличить «виртуальные нули» от «физических». Уродливый обходной путь — сначала конвертировать в qcow2, а потом обратно в zvol — очень медленный, требует длительных простоев и в продакшене практически не применим. Так что я уверен, что такой способ деаллоцирования физического пространства из ZVOL существует, вопрос только в том, как именно.
     
     
     
    mir
    Guest
    #5
    0
    16.05.2017 11:28:00
    ZFS поддерживает команды SATA TRIM и SCSI unmap, поэтому когда ОС помечает блок как удалённый, он освобождается в ZVOL. Так что всё, что нужно — использовать блочный драйвер, который поддерживает TRIM или unmap. В случае с Proxmox это значит использовать драйвер virtio-scsi.
     
     
     
    fabian
    Guest
    #6
    0
    16.05.2017 11:46:00
    Я не думаю, что ты действительно понимаешь, как работает тонкое выделение (thin provisioning) с zvol. Единственное отличие между zvol с thin provisioning и обычным — это резервируется ли полный размер:

    Код:
    # zfs create -V 10G fastzfs/test_full
    # zfs create -V 10G -s fastzfs/test_sparse
    # zfs list -o name,used,usedbydataset,usedbyrefreservation,logicalused,logicalreferenced,refreservation fastzfs/test_sparse fastzfs/test_full

    NAME                  USED  USEDDS  USEDREFRESERV  LUSED  LREFER  REFRESERV
    fastzfs/test_full    10.3G     64K          10.3G    30K     30K      10.3G
    fastzfs/test_sparse    64K     64K              0    30K     30K       none

    Это совсем не меняет обращения с нулями:

    Код:
    # dd if=/dev/zero of=/dev/zvol/fastzfs/test_full
    dd: writing to ‘/dev/zvol/fastzfs/test_full’: No space left on device
    20971521+0 records in
    20971520+0 records out
    10737418240 bytes (11 GB) copied, 23.3931 s, 459 MB/s

    # dd if=/dev/zero of=/dev/zvol/fastzfs/test_sparse
    dd: writing to ‘/dev/zvol/fastzfs/test_sparse’: No space left on device
    20971521+0 records in
    20971520+0 records out
    10737418240 bytes (11 GB) copied, 30.8197 s, 348 MB/s

    # zfs list -o name,used,usedbydataset,usedbyrefreservation,logicalused,logicalreferenced,refreservation fastzfs/test_sparse fastzfs/test_full

    NAME                  USED  USEDDS  USEDREFRESERV  LUSED  LREFER  REFRESERV
    fastzfs/test_full    10.3G   10.1G           241M  10.0G   10.0G      10.3G
    fastzfs/test_sparse  10.1G   10.1G              0  10.0G   10.0G       none

    То, что действительно меняет обращение с нулями — это включение сжатия (которое по умолчанию включено в PVE):

    Код:
    # zfs create -V 10G fastzfs/test_full
    # zfs set compress=on fastzfs/test_full
    # zfs create -V 10G -s fastzfs/test_sparse
    # zfs set compress=on fastzfs/test_sparse
    # zfs list -o name,used,usedbydataset,usedbyrefreservation,logicalused,logicalreferenced,refreservation fastzfs/test_sparse fastzfs/test_full

    NAME                  USED  USEDDS  USEDREFRESERV  LUSED  LREFER  REFRESERV
    fastzfs/test_full    10.3G     64K          10.3G    30K     30K      10.3G
    fastzfs/test_sparse    64K     64K              0    30K     30K       none

    # dd if=/dev/zero of=/dev/zvol/fastzfs/test_full
    dd: writing to ‘/dev/zvol/fastzfs/test_full’: No space left on device
    20971521+0 records in
    20971520+0 records out
    10737418240 bytes (11 GB) copied, 21.7149 s, 494 MB/s
    1.41s user 20.12s system 99% cpu 21.719s total

    # dd if=/dev/zero of=/dev/zvol/fastzfs/test_sparse
    dd: writing to ‘/dev/zvol/fastzfs/test_sparse’: No space left on device
    20971521+0 records in
    20971520+0 records out
    10737418240 bytes (11 GB) copied, 21.1612 s, 507 MB/s
    1.24s user 19.40s system 97% cpu 21.165s total

    # zfs list -o name,used,usedbydataset,usedbyrefreservation,logicalused,logicalreferenced,refreservation fastzfs/test_sparse fastzfs/test_full

    NAME                  USED  USEDDS  USEDREFRESERV  LUSED  LREFER  REFRESERV
    fastzfs/test_full    10.3G     64K          10.3G    30K     30K      10.3G
    fastzfs/test_sparse    64K     64K              0    30K     30K       none

    Запись других данных, хорошо сжимаемых (в данном случае 32МБ 'a'), показывает похожий эффект, независимо от того, sparse это том или нет:

    Код:
    # zfs create -V 10G fastzfs/test_full
    # zfs set compress=on fastzfs/test_full
    # zfs create -V 10G -s fastzfs/test_sparse
    # zfs set compress=on fastzfs/test_sparse
    # zfs list -o name,used,usedbydataset,usedbyrefreservation,logicalused,logicalreferenced,refreservation fastzfs/test_sparse fastzfs/test_full

    NAME                  USED  USEDDS  USEDREFRESERV  LUSED  LREFER  REFRESERV
    fastzfs/test_full    10.3G     64K          10.3G    30K     30K      10.3G
    fastzfs/test_sparse    64K     64K              0    30K     30K       none

    # aaaaas=a; for i in {0..24}; do aaaaas="$aaaaas$aaaaas"; done; echo $aaaaas > /dev/zvol/fastzfs/test_sparse
    # aaaaas=a; for i in {0..24}; do aaaaas="$aaaaas$aaaaas"; done; echo $aaaaas > /dev/zvol/fastzfs/test_full

    nora# zfs list -o name,used,usedbydataset,usedbyrefreservation,logicalused,logicalreferenced,refreservation fastzfs/test_sparse fastzfs/test_full

    NAME                  USED  USEDDS  USEDREFRESERV  LUSED  LREFER  REFRESERV
    fastzfs/test_full    10.3G    336K          10.3G  32.2M   32.2M      10.3G
    fastzfs/test_sparse   336K    336K              0  32.2M   32.2M       none

    Или с 2ГБ 'a':

    Код:
    # zfs list -o name,used,usedbydataset,usedbyrefreservation,logicalused,logicalreferenced,refreservation fastzfs/test_sparse fastzfs/test_full

    NAME                  USED  USEDDS  USEDREFRESERV  LUSED  LREFER  REFRESERV
    fastzfs/test_full    10.3G   16.2M          10.3G  2.01G   2.01G      10.3G
    fastzfs/test_sparse  16.2M   16.2M              0  2.01G   2.01G       none

    На мой взгляд, тут два варианта: твоя ВМ не делает очистку блоков через trim/discard ИЛИ у тебя либо не включено сжатие, либо твоя ВМ не обнуляет блоки, которые не очищаются trim'ом (fstrim/discard отлично работают на отформатированных zvol, сжатие включено или нет, с резервацией или без. Возможно, Windows делает какие-то хитрости вместо обычного trim'а?). Также имей в виду, что discard/fstrim — это не то же самое, что запись нулей. И ещё учти, что ZFS под Linux пока не поддерживает фактическую отправку TRIM/UNMAP на физические устройства, но, похоже, это скоро добавят: https://github.com/zfsonlinux/zfs/pull/5925 https://github.com/openzfs/openzfs/pull/172
     
     
     
    ivensiya
    Guest
    #7
    0
    16.05.2017 14:17:00
    Ты используешь команду: zfs set compression=lz4 rpool?
     
     
     
    carsten2
    Guest
    #8
    0
    22.05.2017 14:50:00
    Это немного странно, что хотя я и объяснил проблему, люди продолжают утверждать, что якобы я не понимаю ZFS (тонкое выделение пространства). Хочу повторить, что я полность понял ZFS в этом плане. К сожалению, они не уловили суть проблемы. Повторюсь (предполагая, что сжатие отключено):

    1) Новый тонко выделенный ZVOL почти не занимает реального пространства в ZFS. При чтении из такого ZVOL ZFS возвращает нули для каждого несуществующего блока, то есть «виртуальные нули» для «виртуальных блоков».

    2) Блоки ZVOL выделяются только при записи. Однако ZVOL, к сожалению, не различает блоки с реальными данными и блоки, заполненные нулями, поэтому даже заполнение ZVOL только нулями выделяет полный размер ZVOL из пула. С точки зрения файловой системы и приложений ZVOL при этом не меняется, потому что содержит только нули, которые до заполнения — «виртуальные нули», а после заполнения — «сохранённые нули».

    3) В итоге слишком много места съедается ZVOL, заполненным нулями, что разрушает эффект тонкого выделения пространства. Такая же ситуация наблюдается с qcow2, VMDK виртуальными машинами или файлами в файловых системах с поддержкой разреженных файлов. Поэтому для каждого из этих форматов существует утилита, которая конвертирует «сохранённые нули», занимающие реальное место, в «виртуальные нули», которые места не занимают:

    a) Для VMDK — это «Consolidate Free space», «Clean up disk», «vmkfstools -K» или «esxcli storage vmfs unmap -l iscsi»

    b) Для QEMU — «qemu-img convert -O»

    c) Для linux-файлов — «fallocate --dig-holes»

    d) Для многих систем хранения с той же проблемой есть утилиты, например, «EMC StorReclaim»

    e) Некоторые системы хранения, как HP 3PAR, имеют функцию «zero-detect», которая напрямую размечает блоки, заполненные нулями, как свободные

    Теперь к первоначальным вопросам: Какой аналог команд из пунктов 3a)–3e) существует для ZFS?

    Меня действительно удивляет, что похоже, такого инструмента просто нет, и это обидно, потому что это делает тонко выделенные ZVOL хуже по освобождению пространства, чем форматы qcow2 и VMDK.

    Единственный обходной путь в ZFS — включить сжатие (compression=on), тогда заполненные нулями блоки сожмутся почти до нуля. Однако у сжатия есть свои недостатки.

    С SCSI UNMAP решение есть, но требует поддержки со стороны гостевой ВМ.

    Хотя, похоже, нельзя в действии размаркировать нулевые блоки, решение есть, если скопировать ZVOL командой «dd --sparse». Она копирует только ненулевые участки, поэтому целевой ZVOL не будет содержать «сохранённых нулей». Но большой минус этого метода — он не онлайн и требует много временного пространства для копирования.

    Теоретически можно написать инструмент «iscsi-unmap», который просканирует ZVOL и размаркирует нулевые блоки, но я не смог найти бесплатной реализации (esxi от VMWARE — такой инструмент, но работает только на ESXI). Кроме того, этот инструмент не сможет работать онлайн.

    Пока в ZFS не появится утилита вроде «zfs storereclaim» (как у EMC) или опция «zero-detect», сжатие — единственный способ хоть как-то освободить место под нули.
     
     
     
    Страницы: 1
    Читают тему
    +7 (495) 320-70-49
    info@proxmox.su

    Конфиденциальность Оферта
    © 2026 Proxmox.su
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры