Cluster computing 在GlusterFS 3.7上向大量文件写入少量数据

Cluster computing 在GlusterFS 3.7上向大量文件写入少量数据,cluster-computing,replication,glusterfs,Cluster Computing,Replication,Glusterfs,我正在试验1x2配置的2台Gluster 3.7服务器。服务器通过1 Gbit网络连接。我在用Debian Jessie 我的用例如下:打开文件->追加64字节->关闭文件,并对大约5000个不同的文件循环执行此操作。如果我通过装入的glusterfs驱动器访问文件,则此类循环的执行时间大约为10秒。如果我直接使用libgfsapi,执行时间大约为5秒(快2倍) 但是,相同的循环在普通ext4磁盘上以50ms的时间执行 Gluster 3.7 end早期版本之间存在巨大的性能差异,我相信这是由于

我正在试验1x2配置的2台Gluster 3.7服务器。服务器通过1 Gbit网络连接。我在用Debian Jessie

我的用例如下:打开文件->追加64字节->关闭文件,并对大约5000个不同的文件循环执行此操作。如果我通过装入的glusterfs驱动器访问文件,则此类循环的执行时间大约为10秒。如果我直接使用libgfsapi,执行时间大约为5秒(快2倍)

但是,相同的循环在普通ext4磁盘上以50ms的时间执行

Gluster 3.7 end早期版本之间存在巨大的性能差异,我相信这是由于cluster.eager lock设置造成的

我的目标是在不到1秒的时间内执行循环

我曾尝试过很多Gluster设置,但没有成功dd具有各种bsize值的测试的行为类似于未设置TCP无延迟选项,尽管从Gluster源代码来看,似乎默认无延迟

你知道如何提高性能吗

编辑:

我找到了一个适合我的解决方案,所以我想与大家分享一下,以防其他人也面临同样的问题

问题的根本原因是执行打开/写入/关闭序列期间客户端和Gluster服务器之间的往返次数。我不知道背后到底发生了什么,但计时测量正好显示了这种模式。现在,显而易见的想法是将打开/写入/关闭序列“打包”到单个写入函数中。大致上,该函数的C原型是:

int写入(常量字符*fname,常量无效*buf,大小字节,偏移量)

但是,在libgfapi中已经有了这样的API函数
glfs\u h\u anonymous\u write
(感谢Gluster邮件组的sumya)。隐藏的东西是文件标识符,它不是普通的文件名,而是
struct glfs\u object
类型的东西。客户机通过API调用
glfs\u h\u lookupat/glfs\u h\u create
获取此类对象的实例。这里的要点是,表示文件名的
glfs\u对象
是“无状态”的,即对应的
inode
保持不变(不计入ref)。人们应该将
glfs\u对象
看作普通的文件名标识符,并像使用文件名一样使用它(实际上,
glfs\u对象
存储指向相应的
inode
的普通指针,而不进行ref计数)

最后,我们应该使用
glfs\u h\u lookupat/glfs\u h\u create
一次,并使用
glfs\u anonymous\u write
多次写入文件


通过这种方式,我能够在0.5秒内将64个字节附加到5000个文件中,这比使用装入卷和打开/写入/关闭顺序快20倍。

将写入与本地文件系统(如
ext4
)进行比较是否真的公平(这些文件系统永远不能同时在多台主机上进行rw装入)对于需要各种复杂锁同步开销的分布式文件系统?Ivica Siladic,您是否能够对3.7 Gluster代码库进行修补?我想使用较少的打开/关闭进行测试。如果不是的话,你能给我提供一些小的指导吗?在gluster中哪部分代码可以修改。我不熟悉它。你不需要修补Gluster就可以利用
glfs\u h\u anonymous\u write
。您需要的代码序列是这样的:
glfs\u object*fh=glfs\u h\u lookupat(…)
glfs\u h\u anonymous\u write(fh…)
第一行获得句柄
fh
,之后您可以像FILE*一样使用它,但区别在于您不需要打开/关闭相应的文件。您只需使用通过
glfs\u h\u lookupat
获得的文件句柄对文件进行写入/读取。将写入与本地文件系统(如
ext4
(不能同时在多台主机上安装rw)进行比较是否真的公平对于需要各种复杂锁同步开销的分布式文件系统?Ivica Siladic,您是否能够对3.7 Gluster代码库进行修补?我想使用较少的打开/关闭进行测试。如果不是的话,你能给我提供一些小的指导吗?在gluster中哪部分代码可以修改。我不熟悉它。你不需要修补Gluster就可以利用
glfs\u h\u anonymous\u write
。您需要的代码序列是这样的:
glfs\u object*fh=glfs\u h\u lookupat(…)
glfs\u h\u anonymous\u write(fh…)
第一行获得句柄
fh
,之后您可以像FILE*一样使用它,但区别在于您不需要打开/关闭相应的文件。您只需使用通过
glfs\u h\u lookupat
获得的文件句柄来写入/读取文件。