http://blog.csdn.net/liuaigui/article/details/9981135
目前的文件系统,包括本地文件系统、分布式文件系统和对象存储系统,都是主要针对大文件设计的,比如XFS/EXT4、Lustre、GlusterFS、GPFS、ISLION、GFS、HDFS,在元数据管理、数据布局、条带设计、缓存管理等实现策略上都侧重大文件,而海量小文件应用在性能和存储效率方面要大幅降低,甚至无法工作。针对LOSF问题,出现一些勇敢的挑战者。EXT4主要对EXT3进行了两方面的优化,一是inode预分配,这使得inode具有很好的局部性特征,同一目录文件inode尽量放在一起,加速了目录寻址与操作性能。因此在小文件应用方面也具有很好的性能表现。二是extent/delay/multi的数据块分配策略,这些策略使得大文件的数据块保持连续存储在磁盘上,数据寻址次数大大减少,显著提高I/O吞吐量。因此,EXT4对于大小文件综合性能表现比较均衡。Reiserfs对小文件作了优化,并使用B* tree组织数据,加速了数据寻址,大大降低了open/create/delete/close等系统调用开销。Reiserfs的tail package功能可以对一些小文件不分配inode,而是将这些文件打包,存放在同一个磁盘分块中。对于小于1KB的小文件,Rerserfs可以将数据直接存储在inode中。因此, Reiserfs在小文件存储的性能和效率上表现非常出色。Facebook 推出了专门针对海量小文件的文件系统Haystack,通过多个逻辑文件共享同一个物理文件、增加缓存层、部分元数据加载到内存等方式有效的解决了Facebook海量图片存储问题。淘宝推出了类似的文件系统TFS(Tao File System),通过将小文件合并成大文件、文件名隐含部分元数据等方式实现了海量小文件的高效存储。FastDFS针对小文件的优化类似于TFS。国防科学技术大学对Lustre进行了小文件优化工作,在OST组件中设计并实现了一种分布独立式的小文件Cache结构:Filter Cache,通过扩展Lustre的OST端的数据通路,在原有数据通路的基础上,增加对小对象I/O的缓存措施,以此来改善Lustre性能。
衡量存储系统性能主要有两个关键指标,即IOPS和数据吞吐量。
影响磁盘的关键因素是磁盘I/O服务时间,即磁盘完成一个I/O请求所花费的时间,它由寻道时间、旋转延迟和数据传输时间三部分构成。因此可以计算磁盘的IOPS= 1000 ms/ (Tseek + Troatation + Ttransfer),如果忽略数据传输时间,理论上可以计算出磁盘的最大IOPS。当I/O访问模式为随机读写时,寻道时间和旋转延迟相对于顺序读写要明显增加,磁盘IOPS远小于理论上最大值。定义有效工作时间Pt=磁盘传输时间/磁盘I/O服务时间,由此可知随机读写单个文件效率要低于连续读写多个文件。对于磁盘文件系统来说,无论读写都存在元数据操作。以EXTx文件系统写数据为例,向磁盘写入数据进行大量的元数据操作,包括更新inode目录、目录、inode和数据块位图等。定义有效数据读写率Pd=所需数据/实际磁盘读写数据,其中实际磁盘读写数据为磁盘元数据与所需数据之和。当操作连续大文件时,对元数据的操作开销可被庞大的数据操作开销分摊,但小文件的有效读写率小于大文件的,当小文件数量急剧增加时,对大量元数据的操作会严重影响系统的性能。
(1) 元数据管理低效
磁盘文件系统中,目录项(dentry)、索引节点(inode)和数据(data)保存在存储介质的不同位置上。因此,访问一个文件需要经历至少3次独立的访问。这样,并发的小文件访问就转变成了大量的随机访问,而这种访问对于广泛使用的磁盘来说是非常低效的。同时,文件系统通常采用Hash树、 B+树或B*树来组织和索引目录,这种方法不能在数以亿计的大目录中很好的扩展,海量目录下检索效率会明显下降。正是由于单个目录元数据组织能力的低效,文件系统使用者通常被鼓励把文件分散在多层次的目录中以提高性能。然而,这种方法会进一步加大路径查询的开销。
(2) 数据布局低效
磁盘文件系统使用块来组织磁盘数据,并在inode中使用多级指针或hash树来索引文件数据块。数据块通常比较小,一般为1KB、2KB或4KB。当文件需要存储数据时,文件系统根据预定的策略分配数据块,分配策略会综合考虑数据局部性、存储空间利用效率等因素,通常会优先考虑大文件I/O带宽。对于大文件,数据块会尽量进行连续分配,具有比较好的空间局部性。对于小文件,尤其是大文件和小文件混合存储或者经过大量删除和修改后,数据块分配的随机性会进一步加剧,数据块可能零散分布在磁盘上的不同位置,并且会造成大量的磁盘碎片(包括内部碎片和外部碎片),不仅造成访问性能下降,还导致大量磁盘空间浪费。对于特别小的小文件,比如小于4KB,inode与数据分开存储,这种数据布局也没有充分利用空间局部性,导致随机I/O访问,目前已经有文件系统实现了data in inode。
3.1硬件优化
硬件设备在性能上要做到匹配,尤其是磁盘和网络,否则容易导致性能瓶颈或者成本浪费
3.2Cache管理
Cache技术广泛应用于存储系统的各个领域,比如CPU L1/L2 Cache、文件系统、分布式存储系统等。Cache技术主要通过空间换时间的策略,利用数据访问的时间和空间局部性,尽量提高数据访问的缓存命中率,从而提高系统的性能。存储系统中的Cache位于最低层存储介质之上,其中缓存了应用程序需要的数据子集。对子集中的数据的读写先在Cache中异步进行,然后异步存储到低层稳定的介质上。Cache技术通过这种异步的数据I/O模式来解决程序中的计算速度和数据存储速度不匹配的鸿沟,减少了访问底层存储介质的次数,使存储系统的性能大大提高。增大Cache容量可以缓存更多的数据,减小cache的容量失效,从而显著提高Cache命中率。但cache的命中率并不随着容量呈线性增长,当cache容量达到一定阈值时,再增大容量命中率并不会显著提高,因此要根据成本和实际需要来选择cache容量。
对于小文件,可以根据局部性原理和I/O访问行为,预测最近可能访问的文件集合,提前预读到Cache系统中,通过减少文件读取时间提高存储系统性能。许多系统把数据访问请求当作是独立的事件,实际上数据请求并非完全随机,而是由用户或程序的行为驱动的,存在特定的访问模式。而这种模式常常被缓存系统所忽略。预取是主动缓存技术,它利用了数据的空间局部性,对将来可能发生的数据请求进行预测,在访问之前取出并缓存,以备用户访问,从而减少访问延迟。预测技术主要通过对数据本体或历史访问记录的分析,构造合适的预测模型,据此对未来的访问进行预测。用户执行应用程序去访问数据,连续访问的不同文件之间必然存在一定的关联。当用户以先前大致相同的顺序去请求数据时,或多或少会访问相同的文件集合,尤其对同一个用户来说。正确的预测可以提高系统的性能,而错误的预测不仅会造成缓存空间和I/O带宽的浪费,而且会增加正常访问的延时。
http://www.cnblogs.com/xiaocen/p/3721390.html
相对地,在一个分享的磁盘文件系统中,所有节点对数据存储区块都有相同的访问权,在这样的系统中,访问权限就必须由客户端程序来控制。
第2个部分:是utils(工具集),主要是MogileFS的一些管理工具,例如mogadm等。
第3个部分:是客户端API,目前只有Perl API(MogileFS.pm)、PHP,用这个模块可以编写客户端程序,实现文件的备份管理功能,提供MogileFS.pm。
http://www.php-oa.com/2010/09/26/perl-mogilefs-1.html
目前的文件系统,包括本地文件系统、分布式文件系统和对象存储系统,都是主要针对大文件设计的,比如XFS/EXT4、Lustre、GlusterFS、GPFS、ISLION、GFS、HDFS,在元数据管理、数据布局、条带设计、缓存管理等实现策略上都侧重大文件,而海量小文件应用在性能和存储效率方面要大幅降低,甚至无法工作。针对LOSF问题,出现一些勇敢的挑战者。EXT4主要对EXT3进行了两方面的优化,一是inode预分配,这使得inode具有很好的局部性特征,同一目录文件inode尽量放在一起,加速了目录寻址与操作性能。因此在小文件应用方面也具有很好的性能表现。二是extent/delay/multi的数据块分配策略,这些策略使得大文件的数据块保持连续存储在磁盘上,数据寻址次数大大减少,显著提高I/O吞吐量。因此,EXT4对于大小文件综合性能表现比较均衡。Reiserfs对小文件作了优化,并使用B* tree组织数据,加速了数据寻址,大大降低了open/create/delete/close等系统调用开销。Reiserfs的tail package功能可以对一些小文件不分配inode,而是将这些文件打包,存放在同一个磁盘分块中。对于小于1KB的小文件,Rerserfs可以将数据直接存储在inode中。因此, Reiserfs在小文件存储的性能和效率上表现非常出色。Facebook 推出了专门针对海量小文件的文件系统Haystack,通过多个逻辑文件共享同一个物理文件、增加缓存层、部分元数据加载到内存等方式有效的解决了Facebook海量图片存储问题。淘宝推出了类似的文件系统TFS(Tao File System),通过将小文件合并成大文件、文件名隐含部分元数据等方式实现了海量小文件的高效存储。FastDFS针对小文件的优化类似于TFS。国防科学技术大学对Lustre进行了小文件优化工作,在OST组件中设计并实现了一种分布独立式的小文件Cache结构:Filter Cache,通过扩展Lustre的OST端的数据通路,在原有数据通路的基础上,增加对小对象I/O的缓存措施,以此来改善Lustre性能。
衡量存储系统性能主要有两个关键指标,即IOPS和数据吞吐量。
影响磁盘的关键因素是磁盘I/O服务时间,即磁盘完成一个I/O请求所花费的时间,它由寻道时间、旋转延迟和数据传输时间三部分构成。因此可以计算磁盘的IOPS= 1000 ms/ (Tseek + Troatation + Ttransfer),如果忽略数据传输时间,理论上可以计算出磁盘的最大IOPS。当I/O访问模式为随机读写时,寻道时间和旋转延迟相对于顺序读写要明显增加,磁盘IOPS远小于理论上最大值。定义有效工作时间Pt=磁盘传输时间/磁盘I/O服务时间,由此可知随机读写单个文件效率要低于连续读写多个文件。对于磁盘文件系统来说,无论读写都存在元数据操作。以EXTx文件系统写数据为例,向磁盘写入数据进行大量的元数据操作,包括更新inode目录、目录、inode和数据块位图等。定义有效数据读写率Pd=所需数据/实际磁盘读写数据,其中实际磁盘读写数据为磁盘元数据与所需数据之和。当操作连续大文件时,对元数据的操作开销可被庞大的数据操作开销分摊,但小文件的有效读写率小于大文件的,当小文件数量急剧增加时,对大量元数据的操作会严重影响系统的性能。
(1) 元数据管理低效
磁盘文件系统中,目录项(dentry)、索引节点(inode)和数据(data)保存在存储介质的不同位置上。因此,访问一个文件需要经历至少3次独立的访问。这样,并发的小文件访问就转变成了大量的随机访问,而这种访问对于广泛使用的磁盘来说是非常低效的。同时,文件系统通常采用Hash树、 B+树或B*树来组织和索引目录,这种方法不能在数以亿计的大目录中很好的扩展,海量目录下检索效率会明显下降。正是由于单个目录元数据组织能力的低效,文件系统使用者通常被鼓励把文件分散在多层次的目录中以提高性能。然而,这种方法会进一步加大路径查询的开销。
(2) 数据布局低效
磁盘文件系统使用块来组织磁盘数据,并在inode中使用多级指针或hash树来索引文件数据块。数据块通常比较小,一般为1KB、2KB或4KB。当文件需要存储数据时,文件系统根据预定的策略分配数据块,分配策略会综合考虑数据局部性、存储空间利用效率等因素,通常会优先考虑大文件I/O带宽。对于大文件,数据块会尽量进行连续分配,具有比较好的空间局部性。对于小文件,尤其是大文件和小文件混合存储或者经过大量删除和修改后,数据块分配的随机性会进一步加剧,数据块可能零散分布在磁盘上的不同位置,并且会造成大量的磁盘碎片(包括内部碎片和外部碎片),不仅造成访问性能下降,还导致大量磁盘空间浪费。对于特别小的小文件,比如小于4KB,inode与数据分开存储,这种数据布局也没有充分利用空间局部性,导致随机I/O访问,目前已经有文件系统实现了data in inode。
3.1硬件优化
硬件设备在性能上要做到匹配,尤其是磁盘和网络,否则容易导致性能瓶颈或者成本浪费
3.2Cache管理
Cache技术广泛应用于存储系统的各个领域,比如CPU L1/L2 Cache、文件系统、分布式存储系统等。Cache技术主要通过空间换时间的策略,利用数据访问的时间和空间局部性,尽量提高数据访问的缓存命中率,从而提高系统的性能。存储系统中的Cache位于最低层存储介质之上,其中缓存了应用程序需要的数据子集。对子集中的数据的读写先在Cache中异步进行,然后异步存储到低层稳定的介质上。Cache技术通过这种异步的数据I/O模式来解决程序中的计算速度和数据存储速度不匹配的鸿沟,减少了访问底层存储介质的次数,使存储系统的性能大大提高。增大Cache容量可以缓存更多的数据,减小cache的容量失效,从而显著提高Cache命中率。但cache的命中率并不随着容量呈线性增长,当cache容量达到一定阈值时,再增大容量命中率并不会显著提高,因此要根据成本和实际需要来选择cache容量。
对于小文件,可以根据局部性原理和I/O访问行为,预测最近可能访问的文件集合,提前预读到Cache系统中,通过减少文件读取时间提高存储系统性能。许多系统把数据访问请求当作是独立的事件,实际上数据请求并非完全随机,而是由用户或程序的行为驱动的,存在特定的访问模式。而这种模式常常被缓存系统所忽略。预取是主动缓存技术,它利用了数据的空间局部性,对将来可能发生的数据请求进行预测,在访问之前取出并缓存,以备用户访问,从而减少访问延迟。预测技术主要通过对数据本体或历史访问记录的分析,构造合适的预测模型,据此对未来的访问进行预测。用户执行应用程序去访问数据,连续访问的不同文件之间必然存在一定的关联。当用户以先前大致相同的顺序去请求数据时,或多或少会访问相同的文件集合,尤其对同一个用户来说。正确的预测可以提高系统的性能,而错误的预测不仅会造成缓存空间和I/O带宽的浪费,而且会增加正常访问的延时。
3.3 小文件合并存储
小文件合并存储是目前优化LOSF问题最为成功的策略,已经被包括Facebook Haystack和淘宝TFS在内多个分布式存储系统采用。它通过多个逻辑文件共享同一个物理文件,将多个小文件合并存储到一个大文件中,实现高效的小文件存储。为什么这种策略对LOSF效果显著呢?
首先,减少了大量元数据。通过将大量的小文件存储到一个大文件中,从而把大量的小文件数据变成大文件数据,减少了文件数量,从而减少了元数据服务中的元数据数量,提高了元数据的检索和查询效率,降低了文件读写的I /O操作延时,节省了大量的数据传输时间。LOSF元数据开销所占比重大,大幅减少元数据,将直接导致性能的显著提升。合并后的大文件存储在磁盘文件系统之上,同时也大大降低了磁盘文件系统在元数据和I/O方面的压力,这点可以改善每个节点的存储性能。小文件的元数据和数据会一并存储在大文件中,并形成索引文件,访问时通过索引进行定位。索引文件采用预加载到Cache的策略,可以实现随机读写小文件只需要一次I/O。
其次,增加了数据局部性,提高了存储效率。磁盘文件系统或者分布式文件系统中,文件的元数据和数据存储在不同位置。采用合并存储机制后,小文件的元数据和数据可以一并连续存储大文件中,这大大增强了单个小文件内部的数据局部性。小文件合并过程中,可以利用文件之间的空间局部性、时间局部性以及关联,尽量将可能连续访问的小文件在大文件中进行连续存储,增强了小文件之间的数据局部性。这直接降低了磁盘上随机I/O比率,转换成了顺序I/O,能够有效提高I/O读写性能。另外,小文件单独存储会形成外部和内部碎片,而合并存储后存储碎片将大大降低,这极大提高了LOSF存储效率。
再次,简化了I/O访问流程。采用小文件合并存储后,I/O访问流程发生了极大变化,主要体现在存储节点磁盘文件系统上。根据之前的阐述,磁盘文件系统读写一个小文件,最大的系统消耗在open系统调用,需要进行路径查找do_path_lookup,将路径名进行分量解析,转换成对应文件在内核中内部表示。这个过程非常占用系统开销,尤其是深目录下的文件。而经过合并,很多小文件共享一个大文件,open操作转换成了开销小很多的seek操作,根据索引定位到大文件内部相应位置即可,也不需要在内核中创建相关VFS数据对象,这节省了原先绝大部分的系统开销。
大文件加上索引文件,小文件合并存储实际上相当于一个微型文件系统。这种机制对于WORM(Write Once Read Many)模式的分布式存储系统非常适合,而不适合允许改写和删除的存储系统。因为文件改写和删除操作,会造成大文件内部的碎片空洞,如果进行空间管理并在合适时候执行碎片整理,实现比较复杂而且产生额外开销。如果不对碎片进行处理,采用追加写的方式,一方面会浪费存储容量,另一方面又会破坏数据局部性,增加数据分布的随机性,导致读性能下降。此外,如果支持随机读写,大小文件如何统一处理,小文件增长成大文件,大文件退化为小文件,这些问题都是在实际处理时面临的挑战。
3.4元数据管理优化
分布式存储系统架构大致分两种,即有中心架构和无中心架构。在有中心架构的分布式存储系统中,通常有一个元数据服务器MDC来统一管理元数据。而在无中心的架构中,元数据会分散存储于各个存储节点上,通过一致性Hash等算法进行管理和定位。客户端在读写小文件数据之前,需要通过与MDC或存储节点进行通信获取位置信息,这一过程相当于额外增加一次网络传输开销和元数据服务访问开销。这对小文件I/O来说,开销影响非常大,尤其是对于延迟较大的网络而言。因此,元数据管理优化主要从减少元数据量、减少元数据访问次数、提高元数据检索效率等几个方面着手。
对于单个小文件,元数据包括位置信息、名称、guid、属主、大小、创建日期、访问日期、访问权限等信息。在分布式存储系统中,根据访问接口和语义需要,可以对元数据进行精简,保留足够的元数据即可,从而达到减少元数据的目的。比如,TFS/FastDFS通过在文件命名中隐含位置信息等部分元数据,对象存储系统可以不需要访问日期、访问权限等元信息,从而节省了元数据量。这带来的好处是,可以减少元数据通信延迟,相同容量的Cache可以缓存更多的元数据,从而提高元数据的访问效率。
前面刚刚提到TFS/FastDFS在文件名中隐含了位置信息,无需与MDC或存储节点交互就能够对文件进行定位,减少了一次元数据访问。元数据操作在小文件整个I/O过程占了大部分时间,对于大量并发元数据操作,可以对多个RPC请求进行合并,从而大幅减少元数据访问次数。最为重要的,可以在客户端对元数据进行缓存,利用Cache中元数据访问的时间局部性,结合预读策略, 显著减少元数据访问次数。每一次元数据访问都会产生可观的网络开销,因此降低元数据访问次数,能够有效提高元数据操作效率。
在MDC上或者存储节点上,元数据最终持久化存储在数据库、KV存储系统、磁盘文件系统目录上,甚至是单个文件中。同时,为了提高访问性能,会将部分或者全部元数据缓存在Cache中。为了达到高效的元数据检索,需要考虑大容量内存和快速磁盘(比如SAS磁盘或SSD),Cache系统采用可扩展性Hash等高效数据结构组织缓存的元数据。同时,还可以通过多级索引、BloomFilter等减少元数据操作过程的I/O访问次数,进一步加快元数据访问速度。
http://www.cnblogs.com/xiaocen/p/3721390.html
相对地,在一个分享的磁盘文件系统中,所有节点对数据存储区块都有相同的访问权,在这样的系统中,访问权限就必须由客户端程序来控制。
MogileFS | 适用于处理海量小文件 |
Ceph | 是一个 Linux PB级别的分布式文件系统 |
MooseFS | 通用简便,适用于研发能力不强的公司 |
Taobao Filesystem | 适用于处理海量小文件 |
ClusterFS | 适用于处理单个大文件 |
Google Filesystem | GFS+MapReduce擅长处理单个大文件 |
Hadoop Distributed Filesystem | GFS的山寨版+MapReduce,擅长处理单个大文件 |
MogileFS 是一个开源的分布式文件系统,用于组建分布式文件集群
第1个部分: 是server端,包括mogilefsd和mogstored两个程序。前者即是mogilefsd的tracker,它将一些全局信息保存在数据库 里,例如站点domain,class,host等。后者即是存储节点(store node),它其实是个HTTP Daemon,默认侦听在7500端口,接受客户端的文件备份请求。在安装完后,要运行mogadm工具将所有的store node注册到mogilefsd的数据库里,mogilefsd会对这些节点进行管理和监控。第2个部分:是utils(工具集),主要是MogileFS的一些管理工具,例如mogadm等。
第3个部分:是客户端API,目前只有Perl API(MogileFS.pm)、PHP,用这个模块可以编写客户端程序,实现文件的备份管理功能,提供MogileFS.pm。
http://www.php-oa.com/2010/09/26/perl-mogilefs-1.html