我负责下载和处理大量财务数据。每个交易日,我们要添加大约 100GB 的数据。
为了处理这么多的数据,我们从大学的数据中心租用了一个虚拟服务器(3 核,12 GB 内存)和一个 30 TB 的块设备。
在虚拟机上,我安装了 Ubuntu 16.04 和 Linux 上的 ZFS。然后,我在 30TB 块设备上创建了一个 ZFS 池。使用 ZFS 的主要原因是压缩功能,因为数据可很好地压缩(约 10%)。请不要因为我没有遵循 ZFS 希望看到裸机的黄金法则而对我太苛刻,我被迫按原样使用基础设施。
发帖的原因是我遇到了写入速度较慢的问题。服务器能够以大约 50 MB/s 的速度从块设备读取数据,但写入数据的速度非常慢,大约为 2-4 MB/s。
以下是有关池和数据集的一些信息:
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/[email protected]%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
在听了您对存储系统的评论后,我去了 IT 部门。那个人告诉我,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
,结果不错 - 双向都在 80MB/s 左右。
为了进一步检查,我在设备上创建了一个 ext4 分区。我将一个大型 zip 文件复制到此 ext4 分区,平均写入速度约为 40MB/s。速度不是很好,但对我来说已经足够了。
我继续使用以下命令创建一个新的存储池
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 MB/s。
有任何想法吗?
更新 3
tgx_sync
在我复制文件时被阻止。我打开了一张票githubZoL 的存储库。
答案1
您已设置ashift=0
,这会导致使用 4096 字节扇区的 HD 驱动器的写入速度变慢。如果没有ashift
,ZFS 不会正确地将写入与扇区边界对齐 -> 当 ZFS 写入 512 字节扇区时,硬盘需要读取-修改-写入 4096 字节扇区。
用于ashift=12
使 ZFS 将写入对齐到 4096 字节扇区。
您还需要检查分区的对齐相对于实际使用的硬盘是否正确。