Я отвечаю за загрузку и обработку больших объемов финансовых данных. Каждый торговый день мы должны добавлять около 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-байтовые сектора.
Вам также необходимо убедиться, что ваш раздел выравнивается по отношению к используемому жесткому диску.