许多文件的 gluster 性能

gluster performance for many files

只是想知道这种表现是否正常。我正在将一个目录(大约 20 GB 的图像)同步到一个 gluster 卷(3 个节点,3 个副本,每个节点都在同一个 digitalocean 数据中心)。

rsync --info=progress2 -r /var/www/app/_appdata/ /mnt
    251,670,295  62%  716.84kB/s    0:05:42 (xfr#5708, ir-chk=1257/7830)

当我只复制一个大文件时,我得到大约 30 MB/s。

当我复制一个包含许多文件的目录时,我得到大约 700 个 kB/s

知道为什么很多文件的速度这么慢吗?

Rsync 对 GlusterFS 来说是一个特别艰巨的工作负载,因为在默认情况下,它会执行 GlusterFS 的一些最坏情况的操作。因此,从 rsync 获得最佳性能需要双方 tuning/tweaking。

接下来说说Rsync和GlusterFS协同工作时性能提升的痛点。

第一个

rsync 和 GlusterFS 的主要问题是 rsync 在创建文件时使用“写入新文件然后重命名”的习惯用法。这意味着对于创建的每个文件,GlusterFS 都被迫重命名该文件,这是迄今为止最昂贵的文件操作 (FOP)。 Gluster 开发人员添加了几个可调参数来帮助完成此工作负载:

例如,rsync 和类似工具经常使用 "write new then rename" 习惯用法,其中文件 "xxx" 实际上被写为“.xxx.1234”,然后移动到位只有在其内容被完全写入之后。为了使这个过程更有效率,DHT 使用正则表达式将文件名的永久部分(在本例中为 "xxx")与可能是临时部分(前导“.”和尾随“. 1234”)。这样,在文件重命名后,它将位于其正确的散列位置——如果 "xxx" 和“.xxx.1234”散列不同,则不会是其他位置——并且不需要链接文件或广播查找。

事实上,有两个正则表达式可用于此目的 – cluster.rsync-hash-regexcluster.extra-hash-regex。顾名思义,rsync-hash-regex 默认为 regex 使用的模式,而 extra-hash-regex 可以由用户设置以支持使用相同临时文件习惯用法的第二个工具。

第二个

Rsync 默认请求大小非常小,这也是 GlusterFS 的弱点。 GlusterFS 往往在请求大小超过 64KB 时表现最佳; 1MB 往往会提供最佳性能。对于小于 4KB 的请求大小,情况确实开始恶化。 Rsync 确实有一个可调参数来改变这种行为。它被称为 block-size。 Rsync 的默认块大小为 2KB,这在 rsyncing to/from GlusterFS 时确实会影响性能。例如:

# rsync -vrah /gluster-mount/ /home/bturner/Downloads/ --progress -B=131072

您还可以查看以下选项(参见 rsync 手册页):

-W, --whole-file

This option disables rsync’s delta-transfer algorithm, which causes all 
transferred files to be sent whole. The transfer may be faster if this
option is used when the bandwidth between the source and destination
machines is higher than the bandwidth to disk (especially when the “disk”
is actually a networked filesystem). This is the default when both
the source and destination are specified as local paths, but only if
no batch-writing option is in effect.

第三个

--inplace 选项。此选项的行为类似于上述 rsync regex 选项,只是它是在 rsync 端而不是 GlusterFS 端实现的。以下信息来自手册页:

–inplace update destination files in-place

This option changes how rsync transfers a file when its data needs to be
updated: instead of the default method of creating a new copy of the file
and moving it into place when it is complete, rsync instead writes
the updated data directly to the destination file.

查看更多here.