Назад | Перейти на главную страницу

ZFS: хорошее чтение, но низкая скорость записи

Я отвечаю за загрузку и обработку больших объемов финансовых данных. Каждый торговый день мы должны добавлять около 100 ГБ.

Для обработки такого объема данных мы арендуем виртуальный сервер (3 ядра, 12 ГБ оперативной памяти) и блочное устройство 30 ТБ в центре обработки данных нашего университета.

На виртуальной машине я установил Ubuntu 16.04 и ZFS в Linux. Затем я создал пул ZFS на блочном устройстве 30 ТБ. Основной причиной использования ZFS является функция сжатия, поскольку данные хорошо сжимаются (~ 10%). Пожалуйста, не будьте слишком суровы со мной за то, что я не следую золотому правилу, согласно которому ZFS хочет видеть «голый металл», я вынужден использовать инфраструктуру как есть.

Причина публикации в том, что я столкнулся с проблемой плохой скорости записи. Сервер может читать данные со скоростью около 50 МБ / с с блочного устройства, но запись данных происходит очень медленно - около 2-4 МБ / с.

Вот некоторая информация о пуле и наборе данных:

zdb

tank:
version: 5000
name: 'tank'
state: 0
txg: 872307
pool_guid: 8319810251081423408
errata: 0
hostname: 'TAQ-Server'
vdev_children: 1
vdev_tree:
    type: 'root'
    id: 0
    guid: 8319810251081423408
    children[0]:
        type: 'disk'
        id: 0
        guid: 13934768780705769781
        path: '/dev/disk/by-id/scsi-3600140519581e55ec004cbb80c32784d-part1'
        phys_path: '/iscsi/disk@0000iqn.2015-02.de.uni-konstanz.bigdisk%3Asn.606f4c46fd740001,0:a'
        whole_disk: 1
        metaslab_array: 30
        metaslab_shift: 38
        ashift: 9
        asize: 34909494181888
        is_log: 0
        DTL: 126
        create_txg: 4
features_for_read:
    com.delphix:hole_birth
    com.delphix:embedded_data

zpool get all

NAME  PROPERTY                    VALUE                       SOURCE
tank  size                        31,8T                       -
tank  capacity                    33%                         -
tank  altroot                     -                           default
tank  health                      ONLINE                      -
tank  guid                        8319810251081423408         default
tank  version                     -                           default
tank  bootfs                      -                           default
tank  delegation                  on                          default
tank  autoreplace                 off                         default
tank  cachefile                   -                           default
tank  failmode                    wait                        default
tank  listsnapshots               off                         default
tank  autoexpand                  off                         default
tank  dedupditto                  0                           default
tank  dedupratio                  1.00x                       -
tank  free                        21,1T                       -
tank  allocated                   10,6T                       -
tank  readonly                    off                         -
tank  ashift                      0                           default
tank  comment                     -                           default
tank  expandsize                  255G                        -
tank  freeing                     0                           default
tank  fragmentation               12%                         -
tank  leaked                      0                           default
tank  feature@async_destroy       enabled                     local
tank  feature@empty_bpobj         active                      local
tank  feature@lz4_compress        active                      local
tank  feature@spacemap_histogram  active                      local
tank  feature@enabled_txg         active                      local
tank  feature@hole_birth          active                      local
tank  feature@extensible_dataset  enabled                     local
tank  feature@embedded_data       active                      local
tank  feature@bookmarks           enabled                     local
tank  feature@filesystem_limits   enabled                     local
tank  feature@large_blocks        enabled                     local

zfs get all tank/test

NAME       PROPERTY               VALUE                  SOURCE
tank/test  type                   filesystem             -
tank/test  creation               Do Jul 21 10:04 2016   -
tank/test  used                   19K                    -
tank/test  available              17,0T                  -
tank/test  referenced             19K                    -
tank/test  compressratio          1.00x                  -
tank/test  mounted                yes                    -
tank/test  quota                  none                   default
tank/test  reservation            none                   default
tank/test  recordsize             128K                   default
tank/test  mountpoint             /tank/test             inherited from tank
tank/test  sharenfs               off                    default
tank/test  checksum               on                     default
tank/test  compression            off                    default
tank/test  atime                  off                    local
tank/test  devices                on                     default
tank/test  exec                   on                     default
tank/test  setuid                 on                     default
tank/test  readonly               off                    default
tank/test  zoned                  off                    default
tank/test  snapdir                hidden                 default
tank/test  aclinherit             restricted             default
tank/test  canmount               on                     default
tank/test  xattr                  on                     default
tank/test  copies                 1                      default
tank/test  version                5                      -
tank/test  utf8only               off                    -
tank/test  normalization          none                   -
tank/test  casesensitivity        mixed                  -
tank/test  vscan                  off                    default
tank/test  nbmand                 off                    default
tank/test  sharesmb               off                    default
tank/test  refquota               none                   default
tank/test  refreservation         none                   default
tank/test  primarycache           all                    default
tank/test  secondarycache         all                    default
tank/test  usedbysnapshots        0                      -
tank/test  usedbydataset          19K                    -
tank/test  usedbychildren         0                      -
tank/test  usedbyrefreservation   0                      -
tank/test  logbias                latency                default
tank/test  dedup                  off                    default
tank/test  mlslabel               none                   default
tank/test  sync                   disabled               local
tank/test  refcompressratio       1.00x                  -
tank/test  written                19K                    -
tank/test  logicalused            9,50K                  -
tank/test  logicalreferenced      9,50K                  -
tank/test  filesystem_limit       none                   default
tank/test  snapshot_limit         none                   default
tank/test  filesystem_count       none                   default
tank/test  snapshot_count         none                   default
tank/test  snapdev                hidden                 default
tank/test  acltype                off                    default
tank/test  context                none                   default
tank/test  fscontext              none                   default
tank/test  defcontext             none                   default
tank/test  rootcontext            none                   default
tank/test  relatime               off                    default
tank/test  redundant_metadata     all                    default
tank/test  overlay                off                    default
tank/test  com.sun:auto-snapshot  true                   inherited from tank

Не могли бы вы подсказать, что я могу сделать, чтобы улучшить скорость записи?

Обновление 1

После ваших комментариев по поводу системы хранения я пошел в ИТ-отдел. Парень сказал мне, что логический блок, который экспортирует vdev, на самом деле 512 B.

Это результат dmesg:

[    8.948835] sd 3:0:0:0: [sdb] 68717412272 512-byte logical blocks: (35.2 TB/32.0 TiB)
[    8.948839] sd 3:0:0:0: [sdb] 4096-byte physical blocks
[    8.950145] sd 3:0:0:0: [sdb] Write Protect is off
[    8.950149] sd 3:0:0:0: [sdb] Mode Sense: 43 00 10 08
[    8.950731] sd 3:0:0:0: [sdb] Write cache: enabled, read cache: enabled, supports DPO and FUA
[    8.985168]  sdb: sdb1 sdb9
[    8.987957] sd 3:0:0:0: [sdb] Attached SCSI disk

Итак, логических блоков 512 Б, а физического блока 4096 Б ?!

Они предоставляют мне временную файловую систему, в которую я могу делать резервные копии данных. Затем я сначала протестирую скорость на необработанном устройстве, прежде чем настраивать пул с нуля. Я пришлю обновление.

Обновление 2

Я уничтожил оригинальный бассейн. Затем я провел несколько тестов скорости, используя dd, результаты нормальные - около 80 МБ / с в обоих направлениях.

В качестве дополнительной проверки я создал на устройстве раздел ext4. Я скопировал большой zip-файл в этот раздел ext4, и средняя скорость записи составляет около 40 МБ / с. Не очень хорошо, но для моих целей достаточно.

Я продолжил, создав новый пул хранения с помощью следующих команд

zpool create -o ashift=12 tank /dev/disk/by-id/scsi-3600140519581e55ec004cbb80c32784d
zfs set compression=on tank
zfs set atime=off tank
zfs create tank/test

Затем я снова скопировал zip-файл во вновь созданный test файловая система. Скорость записи оставляет желать лучшего, порядка 2-5 МБ / с.

Любые идеи?

Обновление 3

tgx_syncблокируется при копировании файлов. Я открыл билет на github репозиторий ZoL.

Вы установили ashift=0, что приводит к низкой скорости записи, если у вас есть жесткие диски, которые используют 4096-байтовые сектора. Без ashift, ZFS неправильно выравнивает записи по границам секторов -> жестким дискам требуется чтение-изменение-запись 4096-байтовых секторов, когда ZFS записывает 512-байтовые сектора.

Использовать ashift=12 чтобы ZFS выровняла запись в 4096-байтовые сектора.

Вам также необходимо убедиться, что ваш раздел выравнивается по отношению к используемому жесткому диску.