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 B логических блоков, но 4096 B физических блоков?!

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

Обновление 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.

1 ответ

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

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

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

Другие вопросы по тегам