深入理解Lustre文件系统-第11篇 Lustre一般化文件系统封装层:fsfilt

文件系统开发手记-第2篇 我为什么要在Lustre上做QoS QoS是Quality of Service的简写,顾名思义,就是保证服务质量。小希我经过多年的苦熬,终于将服务端QoS(NRS TBF)加入主线,同时各种对于QoS改进也在进行中,另外客户端的QoS也在测试阶段。纵观各类文件系统,QoS并不常见,因此我猜想有人会有疑问,为什么要在Lustre实现QoS呢? 实用场景对Lustre的诸多要求,首先最重要的是性能和容量。容量基本上在体系结构设计 阅读详情

Lustre在底层本地文件系统和Lustre之间提供了一个称为fsfilt的封装层。在上层中,obd_filter使用fsfilter层提供的一般化的函数,而fsfilter曾将这些调用传送到一个文件系统特有的实现中。这些特有的实现是特定的底层文件系统接口。fsfilt通过使用针对特定文件系统的小(tiny)封装(即对ext3使用的fsfilt和对Reiserfs3文件系统使用的fsfilt_reiserfs),调用本地文件系统。这节给出了fsfilt层的细节,并且分析了fsfilt_ext3,作为接口实现的一个实例。

11.1   概述

fsfilt框架大体是由lustre/include/luste_fsfilt.c定义的。在这个文件里,struct fsfilt_operations定义了对底层文件系统要求的操作。在obd_filter注册时,系统告知它建立在什么文件系统之上,而Lustre调用所需的文件系统注册操作。这是在内核模块(即ldiskfs、fsfilt_ext3)初始阶段完成的。对应的对每个文件系统实现的源码放在lustre/lvfs下。然而fsfilt_ldiskfs.c在HEAD CVF checkout的时候将会出现丢失,因为它是在建立时通过取得fsfilt_ext3.c并将所有ext3替换为ldiskfs来从ldiskfs_ext3.c(与在其他CVS branch里一样)产生的。Figure 15给出了Lustre fsfilt层的Linux模块的实现实例,和它们的通信路径。


需要提到的有趣的一点是,虽然在lustre/lvfs/fsfilt.c文件中定义了如下符号:

EXPORT_SYMBOL(fsfilt_register_ops);

EXPORT_SYMBOL(fsfilt_unregister_ops);

EXPORT_SYMBOL(fsfilt_get_ops);

EXPORT_SYMBOL(fsfilt_put_ops);

但是这个文件不是用来创建fsfilt内核模块的;实际上,根本没有这个内核模块。它和lvfs模块链接到一起,用以提供API,这些API用来注册访问文件系统的fsfilt方法。get_ops和put_ops调用允许fsfilt服务的使用者可以通过名字得到指向合适操作表的指针,也可以得到指针和引用,这样它就不被允许来卸载那些正在被使用的fsfilt_*模块了。当这些函数停止被使用后,它们释放相应的指针。

下面的列表给出了定义在lustre/include/linux/lustre_fsfilt.h 文件中的struct fsfilt_operations方法。

structfsfilt_operations {

      struct list_head fs_list;

      struct module *fs_owner;

      char *fs_type;

      char *(* fs_getlabel)(struct super_block*sb);

      int (* fs_setlabel)(struct super_block*sb, char *label);

      char *(* fs_uuid)(struct super_block *sb);

      void *(* fs_start)(struct inode *inode,int op, void *desc_private,

      int logs);

      void *(* fs_brw_start)(int objcount,struct fsfilt_objinfo *fso,

      int niocount, struct niobuf_local *nb,

      void *desc_private, int logs);

      int (* fs_extend)(struct inode *inode,unsigned nblocks, void *h);

      int (* fs_commit)(struct inode *inode,void *handle,int force_sync);

      int (* fs_commit_async)(struct inode*inode, void *handle,

      void **wait_handle);

      int (* fs_commit_wait)(struct inode*inode, void *handle);

      int (* fs_setattr)(struct dentry *dentry,void *handle,

      struct iattr *iattr, int do_trunc);

      int (* fs_iocontrol)(struct inode *inode,struct file *file,

      unsigned int cmd, unsigned long arg);

      int (* fs_set_md)(struct inode *inode,void *handle, void *md,

      int size, const char *name);

      int (* fs_get_md)(struct inode *inode,void *md, int size,

      const char *name);

      int (* fs_send_bio)(int rw, struct inode*inode,struct kiobuf *bio);

      ssize_t (* fs_readpage)(struct file *file,char *buf, size_t count,

      loff_t *offset);

      int (* fs_add_journal_cb)(structobd_device *obd, __u64 last_rcvd,

      void *handle, fsfilt_cb_t cb_func,

      void *cb_data);

      int (* fs_statfs)(struct super_block *sb,struct obd_statfs *osfs);

      int (* fs_sync)(struct super_block *sb);

      int (* fs_map_inode_pages)(struct inode*inode, struct page **page,

      int pages, unsigned long *blocks,

      int *created, int create,

      struct semaphore *sem);

      int (* fs_write_record)(struct file *,void *, int size, loff_t *,

      int force_sync);

      int (* fs_read_record)(struct file *, void*, int size, loff_t *);

      int (* fs_setup)(struct super_block *sb);

      int (* fs_get_op_len)(int, structfsfilt_objinfo *, int);

      int (* fs_quotacheck)(struct super_block*sb,

      struct obd_quotactl *oqctl);

      __u64 (* fs_get_version) (struct inode*inode);

      __u64 (* fs_set_version) (struct inode*inode, __u64 new_version);

      int (* fs_quotactl)(struct super_block*sb,

      struct obd_quotactl *oqctl);

      int (* fs_quotainfo)(structlustre_quota_info *lqi, int type,

      int cmd);

      int (* fs_qids)(struct file *file, structinode *inode, int type,

      struct list_head *list);

      int (* fs_get_mblk)(struct super_block*sb, int *count,

      struct inode *inode, int frags);

      int (* fs_dquot)(struct lustre_dquot*dquot, int cmd);

      lvfs_sbdev_type (*fs_journal_sbdev)(struct super_block *sb);

};

11.2   ext3的fsfilt

正如上面所说的,Lustre为每个底层本地文件系统提供了一个特定的fsfilt实现。本节将解释为Linuxext3文件系统提供的fsfilt_ext3实现。lustre/lvfs/fsfilt_ext3.c文件被用来声明为ext3实现的fsfilt。在创建(build)时,fsfilt_ext3以模块的方式加入内核。模块的入口是module_init(fsfilt_ext3_init),出口是module_exit(fsfilt_ext3_exit)。

static int__init *fsfilt_ext3_init(void) {}

被用来在注册时进行初始化。所有本地文件系统特有的fsfilt实现都有这个调用。

在init函数内,首先由cfs_mem_cache_create()为日志提交回调函数创建一个高速缓存。这允许了当特定的日志事务提交时,产生一个回调。当前,Lustre不支持任何没有日志的的文件系统。在init方法中为高速缓存创建而返回的值是fcb_cache变量。这里fcb指出了提交回调数据。

同时,在init方法中,与其他的fsfilt实现一样,fsfilt_ext3.c声明了对特定底层文件系统所允许的操作,声明方法是通过static structfsfilt_operations fsfilt_ext3_ops={}定义,提供一个从fsfilt方法到fsfilt_ext3操作之间的一一映射。一些重要的fsfilt_ext3方法在下面进行更多的细节解释。

static void*fsfilt_ext3_start()

开始了元数据操作的旅行。它通过在该函数调用中前部的switch语句检查调用的是哪种操作。对每个操作,它计算对该特定元数据事务需要的最大块数目(由nblocks指出)。对于ext3,当元数据事务初始化后,要求它指定该事物需要使用多少块。如果请求的块数目少于可用的块数目,文件系统会刷新一些块出来,容纳请求的块大小。对于像ZFS这样的文件系统,并不要求有这个功能。

static char*fsfilt_ext3_get_label()

取得了文件系统标签,而

static char*fsfilt_ext3_set_label()

设置了文件系统标签。

static char*fsfilt_ext3_uuid()

允许fsfilt层询问文件系统的LinuxUUID。

static void*fsfilt_ext3_brw_start()

开始了对块I/O操作的日志事务。它将一个页缓冲作为参数。

Flow wise(?),元数据操作调用*fsfilt_ext3_start()来打开一个日志事务,并进行元数据操作,而块I/O操作则调用*fsfilt_ext3_brw_start()来打开一个日志事务。然而,*fsfilt_ext3_brw_start()并不实际执行块I/O,而是为事务创建一个日志句柄。对两种操作,日志都由*journal指针指定,其类型是journal_t。

同时,正如在源码中可以看到的,两个函数都有一个类型是handle_t的*handle指针。这是为需要日志句柄的任何操作准备的。这个句柄会作为参数传递到它的函数调用中去。

需要提到的重要一点是,在Lustre中,当对一个文件进行I/O时,首先改变索引节点,分配所有请求的块,然后关闭事务,最后分别执行I/O,所以日志事务并不是在实际I/O的整个过程中保持打开状态的。

static intfsfilt_ext3_commit()

提交并且关闭当前打开的日志事务。这个函数有一个称为force_sync的标志,它表明刷新是否应该立即执行。force_sync=0表明仅关闭事务,而不立即刷新;而force_sync=1表明关闭事务,并且立即刷新内存拷贝。

static intfsfilt_ext3_commit_async()

也关闭事务,并向调用者返回一个句柄(**wait_handle),这个句柄将在稍后的实际提交事务时使用。

In the truesense of(?)这两个操作,fsfilt_ext3_commit和fsfilt_ext3_commit_async都是异步的。然而由于可以使用force_sync选项,fsfilt_ext3_commit有可能同步地提交一个给定的日志事务。大多数情况下,使用fsfilt_ext3_commit function而fsfilt_ext3_commit_async则专门使用在DATA模式下。

static intfsfilt_ext3_send_bio()

提交对文件的I/O操作。在调用这个函数之前,I/O已经形成:创建好了一个缓冲链表,它们在磁盘上的目标已经在内核中设置了。这个函数只是用来处理文件数据的,这样这时就没有打开日志事务的必要了。在这个函数调用的时候,基于性能的考虑,日志事务已经关闭了。块I/O的典型流程将在10.3节讨论。这个流程之后,是调用fsfilt_ext3_send_bio函数来执行实际的块I/O。对于Linux 2.6内核,这个函数所做的事情就是调用submit_bio()内核函数。对于Linux 2.4内核,流程就稍微复杂点了,而且超出了这个报告的涉及范围。

static intfsfilt_ext3_extend()

以指定的块数延伸日志事务。请求的额外的块数由unsigned nblocks指定。在延伸之后,通过*handle,事务的句柄将维持不变,因为Lustre维护了单一的事务可见性。这对于那些不可能预测将使用多少块的操作,尤为有用。截短或者unlink操作是这个函数发挥作用的例子。

static intfsfilt_ext3_setattr()

更新了索引节点大小和属性(用户组、访问模式、各种文件时间和文件大小)。

static intfsfilt_ext3_iocontrol()

将iocontrol(或者ioctl)参数传递给底层的文件系统。

static intfsfilt_ext3_set_md()

和

static intfsfilt_ext3_get_md()

用来设置和询问分条信息。对于ext3,这个信息保存在EA中,而其实现是文件系统特有的。

static size_tfsfilt_ext3_readpage()

是用来从underlying文件或者目录中读取页的函数。在这个函数一开始的switch语句里,确定了要读取的是一个文件还是一个目录。如果是普通文件,它只简单地调用read()内核函数,用文件数据信息填充缓冲。然而,如果待读的是一个目录,它将调用ext3文件读函数来从文件中读取。

static intfsfilt_ext3_add_journal_cb()

用来跟新内存中的代表,这个代表是从事务的角度表示哪些东西已经在事实上提交到服务器里的磁盘中去了。对一个客户端,以内存中代表的形式回答如下问题是有用的:该给定客户端的哪些东西已经提交到给定服务器的磁盘上;因为这样,客户端可以丢弃该给定事务号锁对应的所有数据,从而节省内存。有这个功能的优点在于,一旦服务器崩溃了,数据将仍处于客户端的内存中,因为服务器不会回复*cb_data。这里*cb_data保存了上个一提交到磁盘上的事务的指针地址。其缺点是,通过在客户端保存额外的复本(服务器端还有复本),增加了对内存的消耗。

intfsfilt_ext3_map_ext_inode_pages()

是分配块的函数。它用来取得关于某块区间里的块的信息,而如果这些块还没有被分配,则一旦接收到请求了,就分配块。它向请求者送哪些块所处位置的页数组。

static intfsfilt_ext3_write_record()

和

static intfsfilt_ext3_read_record()

是用来跟新特定的LLOG(Lustre LOG)文件的。这个文件会自动跟新。在执行多节点操作时(例如,unlink,它需要从MDS开始,然后在OST上继续),需要LLOG。

static intfsfilt_ext3_setup()

用在ext3文件系统首次挂载时。obd_filter的初始化调用了这个函数。

static intfsfilt_ext3_get_op_len()

用来取得一个特定的操作在日志中需要的块数目。这个函数已经过时了,根本不被调用。

static __u64fsfilt_ext3_get_version()

和

static __u64fsfilt_ext3_set_version()

是用来设置和询问索引节点版本的。在我们所谈论的源码中,索引节点版本还未被使用。但是,在以后的源码中,它将用在进行基于版本的恢复机制里。

11.3   fsfilt的使用实例

元数据操作、异步块I/O操作和同步块I/O操作的典型流程分别如Figure 16、17和18所示。

Figure 16是元数据操作的一个例子。这种流程在Lustre里使用,有两种情况:要么是当没有文件数据时,要么是当没有可用的客户端来对一组特定的元数据操作作回复时。

11.3.1       Lustre中的DIRECT_IO

Lustre对从obd_filter到磁盘的和从磁盘到obd_filter的文件数据I/O操作使用DIRECT_IO(在任一点都没有缓冲)。而元数据则总是记在日志里。

可以从Figure 17和18中看到,这些流程保证了在日志事务提交之前,数据就已经被实际写入磁盘中了。这写流程代表了使用DIRECT_IO的ORDERED日志模式。而在DATA模式下,块数据首先写入日志,然后在它提交到日志之后,文件数据才传输到磁盘中的。


11.3.2       在服务崩溃之后,重新执行上一个事务

我们考虑如下情况作为一个例子。客户端连接到服务器端,并执行了一些操作。服务器以一个提交向客户端回复,但是在这时,数据实际上没有提交到磁盘上。客户端现在记上一个正在提交的事务号为x+y,而根据服务器磁盘,它只是x。如果此时服务器此时崩溃了,就上一个已提交的事务号而言,在服务器和客户端之间就有冲突。让我们进一步假设如下事件链:服务器重启了,而客户端重新连上了服务器。服务器然后以acknowledgement和事务号作为回复,该事务是上一个从客户端发来的,已提交到服务器磁盘的事务。对于我们这个例子,这个事务号就是x。客户端就以如下内容作为回复:将x+5作为由该服务器提交的上一个事务号,并附以五个丢失了的,需要由服务器执行的事务列表。

11.3.3       客户端连接和重连

在Lustre中以force_sync =1来使用fsfilt_ext3_commit的另外一个例子是客户端连接和重连。每个Lustre服务器维护一个单独的客户端连接/重连操作列表。这个列表在每个服务器中单独存放,并且是日志化的。当客户端连接上时,它将写入一个单独的文件,该文件是完全日志化的。为了维护这个文件,将使用force_sync标志设置为1的fsfilt_ext3_commit,因为可能在客户端断开连接后,就没有客户端回复了。

11.3.4       为什么Lustre里的ls是昂贵的

让我们考虑在基于ext3的Lustre文件系统里的ls作为例子,这实际由幕后的fsfilt_ext3_readpage来完成。从客户端角度看,它连接到MDS,获取了它所感兴趣的目录的上下文和索引节点号。根据上下文信息,客户端接着向MDS发回对该目录里的每个文件的stat请求。MDS对每个stat请求(和其他的文件元数据相关的每个请求)回复分条信息。所有这些都是在几个RPC中完成的,如果,例如,在该目录中有三个文件,在该步结束后,客户端已经向MDS发出了五个不同的RPC(打开目录,读目录,和对每个文件的stat)。(实际上,普通的ls在ls期间不需要文件模式信息,但是大多数Linux发行版现在都提供了“colorls”,即根据文件类型的不同输出不同颜色的文件信息,所以它就需要对每个文件进行stat()。)紧接着这步,打比方说,如果客户端对文件大小信息感兴趣,它需要向所有处在stat信息列表中的OST发送“惊鸿一瞥”型RPC。这一步需要对每个文件反复进行。作为例子,再次假设这三个文件被分条到100个OST上,那么截止这步结束时,客户端将发送3+(3×100)或者说305个 RPC。这不仅对ls –l是对的,对于普通的ls也是对的,因为它需要找出文件模式。

本文章欢迎转载,请保留原始博客链接http://blog.youkuaiyun.com/fsdev/article
AVM环视算法实战:从3D碗型投影到多场景模式切换的实现与优化 本文深入探讨了AVM环视算法在3D碗型投影和多场景模式切换中的实现与优化。通过分析3D碗型投影的核心原理和动态视角调节技术,展示了如何实现从超广角模式到转向模式的无缝切换。文章还分享了性能优化实战经验,包括实时性提升和图像拼接质量优化,为开发者提供了宝贵的AVM系统开发指南。 阅读详情

相关推荐

【DAB收音机】DAB 认证介绍

DAB 认证ESTI 标准文档: ETSI 103461实际过认证时,需要根据产品的受众国家及区域,参考当地官方是否有国内认证协议。需要参考当地文档进行功能开发。例如:阿联酋地区用《UAE.S 5021 _ 2018.pdf》标准进行认证。ESTI 的DAB认证协议规定了家用和车载数字无线电的最低要求,及其对应的测试方法,是数字无线电认证标志规定的技术基础。本文以车载数字无线电接收器为例,进行部分DAB认证的介绍,详情请见官方文档。或联系博主获取DAB ESTI 103461的中文翻译资料。

qq_15271231的博客 1219

如何启用Lustre Quota

lfs quotacheck –u –g  /mountpoint需要很长时间        lfs–u username –I hardlimit –B hardlimit  /mountpoint        lfsquota –u username        断电或重启后要重新执行lfs quota on

swany的专栏 962

LabVIEW与MySQL的连接:软件下载与安装至UDL文件创建全过程

依据个人经验编辑的十分完备的使用教程

tiaowudexiaoyu的博客 5574

【Lustre相关】功能实践-04-配额管理(Quotas)

配额由root用户设置,可以对用户、用户组、项目可使用磁盘空间进行限制,支持inode(文件数量)和block(文件容量)两种限制方式 注:项目配额支持需服务端和客户端均为Lustre 2.10及更高版本,OST池配额支持需要服务端和客户端均为Lustre 2.14及更高版本

Luxf0的博客 2231

Windows升级保留个人文件和应用灰色?改注册表版本指纹

Windows 升级安装并非简单跳过下一步,安装程序会先读取注册表中 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion 下的 EditionID、ProductName、CompositionEditionID 等版本指纹,与目标镜像 install.wim/esd 记录的版本类型做双向匹配。若当前系统被识别为 LTSC、精简版或跨版本降级,兼容性扫描会判定升级路径不可用,于是“保留个人文件和应用”变灰,只能全新安装。理解版本指纹与升级可行性表的匹配机制,可

weixin_31986143的博客 372

具身智能中的(VLA)算法与实践——第一讲 基础与概览

本文介绍了视觉-语言-动作(VLA)模型的基础概念及其在AI领域的重要性。VLA模型通过融合多模态数据实现具身智能,使AI系统能感知环境并执行物理动作。文章探讨了大型语言模型(LLMs)和视觉语言模型(VLMs)如何赋能具身智能,包括指令解析、场景理解和动作规划。同时提供了Python、PyTorch/TensorFlow开发环境的详细搭建指南,包含GPU配置建议和测试代码。VLA模型在机器人操作、导航、人机协作等领域具有广泛应用前景,是实现通用人工智能的关键技术。

u012133341的博客 1599

深入理解Lustre文件系统-第1篇 跟踪调试系统

一直以来,Linus Torvalds对内核调试器都秉持着抵触态度,并且摆出了我是bastard我怕谁的姿态。他保持了一贯风格,言辞尖锐却直指本质。相信这是经验之谈。在调试内核时,最关键的问题是如何获取出错相关的信息,准确定位出错位置。获取信息有很多方法,其中内核调试器只能提供有限的帮助,而分析日志则是最基本也是最主要的方法。为内核层软件提供一种方便的日志工具,将大大简化其调试工作。在Linu...

hududumo 634

MC_SetOverride指令详细应用介绍(基恩士PLC)

基恩士KV系列PLC和松下总线绝对值伺服运动控制(详细配置+轴控完整ST源代码)

RXXW_Dor的博客 335

深入理解Lustre文件系统-第4篇 LOV和OSC

从高层的图景看,LOV的任务是将页指向正确的OSC,而OSC的任务是收集脏页向量、组合(group)它们、将它们从传输线上发送到OST(当然,通过PortalRPC和LNET)。 4.1 OBD设备操作 OBD面向设备操作是一个在LOV、OSC和MDC中使用并能被看到的一般性的源码组织模式和实现方法。OBD设备由obd_ops结构体定义的方法表描述,该方法表有点类似于前面提到的VFS文件、索引...

管子(zero)的杂乱空间 400

43、FMCW雷达高度计仿真

本文介绍了FMCW雷达高度计的波形级建模与仿真过程,重点模拟了着陆和倾斜两种飞行场景以评估其性能。通过结合高程数据和飞行轨迹构建雷达场景,使用自定义信号处理器分析IQ样本并估计高度。结果表明,该高度计在多数情况下满足性能要求,但也存在误差较大的点,提出了地面检测算法优化的潜在方向。

neovim7hacker的博客 135

yolov26改进 | 融合改进篇 | 轻量级移动端网络ShuffleNetV2融合CCFM参数量仅百万(附代码+修改教程)

本文介绍ShuffleNetV2与跨尺度特征融合模块CCFM融合改进的YOLOv26。ShuffleNetV2以硬件效率为导向,通过通道分割、轻量卷积和Channel Shuffle减少冗余计算与内存访问,在降低参数量和GFLOPs的同时保持高效特征提取;CCFM进一步加强不同尺度特征交互,弥补轻量主干语义表达不足的问题。本人在轻量模型上测试后,参数量和计算量明显下降,检测精度有一定提升,适合移动端、边缘设备及实时检测任务。文中提供完整代码、配置文件、模块注册及Codex修改思路,方便复现、对比和二次创新。

Snu77的博客 198

【高性能】Lustre分布式存储文件系统介绍和故障分析

Lustre是应用广泛的linux开源分布式存储文件系统,其容量可轻易扩容到PB级别,在HPC、云上有相应的使用。 Lustre由元数据服务器MDS、数据存储服务器OSS组成。MDS服务器负责管理OSS服务器上的数据,并处理来自客户端的数据请求。每个OSS服务器的本地存储器,比如硬盘,被划分为多个raid阵列,每个阵列被虚拟为OST数据链路;一个oss服务器包含多个热备盘用于备份本地数据

artzers的专栏 7498

从 AI 助手到 ADT 自动化桥梁:全面解析 Vibing Steampunk 的定位、能力边界与典型使用场合

Vibing Steampunk是一个面向SAP ABAP开发的AI自动化工具集,它通过ADT API将SAP开发能力系统化地暴露给AI助手和命令行工作流。该工具支持ECC、S/4HANA等所有启用ADT的系统,提供代码读取、修改、测试、调试等全流程自动化能力。核心功能包括AI调试、上下文压缩、ABAP语言服务、Lua脚本自动化等,并内置多重安全控制。其分层架构兼容标准ADT和WebSocket扩展,既适合AI驱动开发,也支持传统DevOps自动化,特别适用于老系统代码考古、知识接力和复杂问题诊断场景。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 152

深入理解Lustre文件系统-第2篇 Portal RPC

远程进程调用(Remote Procedure Call,RPC)是构建分布式系统时所使用的一种常见组件。它使得客户端可以像进行本地调用一样进行远程的过程调用,即客户端可以忽略消息传递的细节,而专注于过程调用的效果。 Portal RPC是Lustre 的RPC组件,它构建于LNET之上,提供客户端和服务器之间进行消息通信的接口。 2.1消息通信连接的建立 进行Portal RPC通信...

hududumo 584

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【Lustre相关】功能实践-03-文件级冗余(FLR)

在文件级冗余(File Level Redundancy,FLR)特性出现之前,Lustre文件系统数据冗余完全依赖于后端存储设备(如RAID6)。 Lustre在Lustre 2.11.0版本引入了FLR特性来解决文件冗余问题,通过为多个OST的数据指定镜像文件布局来减轻这种依赖,以便于在OSS/OST异常情况下,文件数据仍然可用,通过比较镜像文件,可以检查和修复数据的完整性。此外,通过多个镜像文件可以提高单个文件并行读取聚合性能。

Luxf0的博客 2079

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

深入理解Lustre文件系统-第10篇 LNET:Lustre网络

LNET是一个消息传递API,源自Sandia Portals。虽然它们俩有一些共同点,但是它们俩是不同的东西。我们将探讨LustreLNET,但是不会深入研究这两者的不同。 10.1核心概念 首先,我们需要澄清一些在本节接下来的部分使用的一些术语,特别是进程ID、匹配项、匹配位和内存描述符。 LNET进程ID LNET使用LNET进程ID来区分它的peer们,定义如下: type...

hududumo 642

lustre常用命令

【代码】lustre常用命令。

weixin_41558221的博客 593

lustre设置用户配额

在Lustre文件系统中,为特定用户或用户组设置配额(quota)可以帮助管理存储空间的使用,防止某些用户占用过多资源。Lustre是一个高性能的分布式文件系统,它支持多种类型的配额,例如inode配额和存储空间配额。确保你了解你的Lustre版本(例如Lustre 2.5, Lustre 2.6, Lustre 2.7等)。在Lustre文件系统上启用配额之前,你需要确保文件系统已经挂载并支持配额。通过上述步骤,你可以为Lustre文件系统中的特定用户设置和管理配额。确定你的Lustre版本。

计算机辅助工程 510

Linux如何进行磁盘配额quota的设置

通过quota进行磁盘配额,可以控制用户对磁盘空间和文件的控制,我们以一个实例作为说明,对2个用户user01、user02分别进行磁盘使用空间和创建文件的限制。 首先,创建一个新的分区,将/tmp挂载在新的分区。 #fdisk /dev/hda 创建后执行: #partprobe   重新写分区表 #mkfs –t ext3 /dev/hda7 格式化分区 #mount /dev

小城故事 682

【Lustre相关】功能实践-01-Lustre集群部署配置

io500是针对存储性能评测的一个权威国际排行榜,主要包括带宽和元数据性能测试部分,共计十二项严苛的场景测试,该基准使用大文件的读/写带宽和小文件读/写/查询性能来衡量存储性能,这些性能也是影响大数据分析、人工智能、高性能计算的关键因素。 Lustre是一个开源高性能并行文件系统,专注于HPC高性能并行计算场景,几乎占据io500榜单三分之一的位置。 本文主要介绍Lustre集群架构及部署配置说明

Luxf0的博客 6609

Lustre文件系统介绍

Lustre架构是用于集群的存储架构。Lustre架构的核心组件是Lustre文件系统,它在Linux操作系统上得到支持,并提供了一个符合POSIX *标准的UNIX文件系统接口。Lustre存储架构用于许多不同类型的集群。它以支持世界上许多最大的拥有数万个客户端系统、pb (PiB)存储和每秒数百GB (GB/sec)的I/O吞吐量的高性能计算(HPC)集群而闻名,许多HPC站点使用Lustre文件系统作为站点范围的全局文件系统,为几十个集群提供服务。

fakerth的博客 4659

Python学习笔记之:本地文件的读取

读取文件 #桌面上的第一个txt f = open(r"C:\Users\Administrator\Desktop\test.txt") print(f.read()) 以test.txt文件为例,该文件存储路径为桌面 打印读取文件内容f.read() print(f.readline()) 读取文件的第一行内容 print(list(f)) 将内容读取到列表中并输出 小编发现一个问题,如果将read()、readline()、list(f)同时输出,会发现结果不是按程序逐条输出的,程序会默认排除

程序小白博客 1584

分布式文件系统GlusterFS

GlusterFS是一个高层次的分布式文件系统解决方案。通过增加一个逻辑层,对上层使用者掩盖了下面的实现,使用者不用了解也不需知道,文件的存储形式、分布。 内部实现是整合了许多存储块(server)通过Infiniband RDMA或者 Tcp/Ip方式互联的一个并行的网络文件系统,这样的许多存储块可以通过许多廉价的x86主机,通过网络搭建起来。 其相对于传统NAS 、SAN、Ra

flyonok的专栏 1173
上一篇: 深入理解Lustre文件系统-第10篇 LNET:Lustre网络
下一篇: 文件系统开发手记-第1篇 文件系统开发的八大苦处
存储李希
博客等级 码龄15年 418粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值