• ext4文件系统特性浅析


            ext4作为Linux下的文件系统因其简单性、易管理性、兼容性强等特定,深受大多数用户喜欢,并且作为大多数Linux发行版中的默认文件系统。但是随着现在文件数目的增多以及文件数据的增大,ext4文件系统显得力不从心, 虽然ext4添加了很多的新的特性, 比如extent、bigalloc等,但是比不上XFS等文件系统,目前RedHat中的默认文件系统更改为了XFS,XFS在目前大数据环境下表现性能优于ext4,原始的XFS是针对于高端计算机用户,当然其他优秀的文件系统Btrfs、ZFS正在不断开发和完善中。

           在当前情况下,ext还是主流文件系统,下面介绍ext4文件系统特性。

           1、ext4文件系统磁盘布局(disk layout)flex_group特性

          原始的ext4文件系统的布局如下:       

    +++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    |   sb  |    block group table  |  block bitmap   |    inode bitmap  |  inode table |   data blocks |
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    |<====================                   group    0                  =====================>|
    
    
    +++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    |   sb  |    block group table  |  block bitmap   |    inode bitmap  |  inode table |   data blocks |
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    |<====================                group 1 (sb和块组描述符备份)   =====================>|

         其中上述的block bitmap 和inode bitmap开始的block位置为该组的block的开始位置之上增加。

         下面是一个具体格式化后的原始的ext4的文件系统磁盘格式布局数据:      

    Group 0: (Blocks 0-32767)
      Primary superblock at 0, Group descriptors at 1-7
      Reserved GDT blocks at 8-1024
      Block bitmap at 1025 (+1025), Inode bitmap at 1026 (+1026)
      Inode table at 1027-1538 (+1027)
      31223 free blocks, 8181 free inodes, 2 directories
      Free blocks: 1545-32767
      Free inodes: 12-8192
    Group 1: (Blocks 32768-65535)
      Backup superblock at 32768, Group descriptors at 32769-32775
      Reserved GDT blocks at 32776-33792
      Block bitmap at 33793 (+1025), Inode bitmap at 33794 (+1026)
      Inode table at 33795-34306 (+1027)
      31229 free blocks, 8192 free inodes, 0 directories
      Free blocks: 34307-65535
      Free inodes: 8193-16384
    Group 2: (Blocks 65536-98303)
      Block bitmap at 65536 (+0), Inode bitmap at 65537 (+1)
      Inode table at 65538-66049 (+2)
      32254 free blocks, 8192 free inodes, 0 directories
      Free blocks: 66050-98303
      Free inodes: 16385-24576
    Group 3: (Blocks 98304-131071)
      Backup superblock at 98304, Group descriptors at 98305-98311
      Reserved GDT blocks at 98312-99328
      Block bitmap at 99329 (+1025), Inode bitmap at 99330 (+1026)
      Inode table at 99331-99842 (+1027)
      31229 free blocks, 8192 free inodes, 0 directories
      Free blocks: 99843-131071
      Free inodes: 24577-32768

        现在ext4引入了flex_group 特性, 也即是把多个块组合并,他们的inode bitmap和block bitmap、 inode table都放在第一个flex_group中的第一个group中,格式化后的数据如下:    

    Group 0: (Blocks 0-32767) [ITABLE_ZEROED]
      Checksum 0xa9e7, unused inodes 8181
      Primary superblock at 0, Group descriptors at 1-7
      Reserved GDT blocks at 8-1024
      Block bitmap at 1025 (+1025), Inode bitmap at 1041 (+1041)
      Inode table at 1057-1568 (+1057)
      23513 free blocks, 8181 free inodes, 2 directories, 8181 unused inodes
      Free blocks: 9255-32767
      Free inodes: 12-8192
    Group 1: (Blocks 32768-65535) [INODE_UNINIT, ITABLE_ZEROED]
      Checksum 0xd93e, unused inodes 8192
      Backup superblock at 32768, Group descriptors at 32769-32775
      Reserved GDT blocks at 32776-33792
      Block bitmap at 1026, Inode bitmap at 1042
      Inode table at 1569-2080
      31743 free blocks, 8192 free inodes, 0 directories, 8192 unused inodes
      Free blocks: 33793-65535
      Free inodes: 8193-16384
    Group 2: (Blocks 65536-98303) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
      Checksum 0xcde2, unused inodes 8192
      Block bitmap at 1027, Inode bitmap at 1043
      Inode table at 2081-2592
      32768 free blocks, 8192 free inodes, 0 directories, 8192 unused inodes
      Free blocks: 65536-98303
      Free inodes: 16385-24576
    Group 3: (Blocks 98304-131071) [INODE_UNINIT, ITABLE_ZEROED]
      Checksum 0xafe0, unused inodes 8192
      Backup superblock at 98304, Group descriptors at 98305-98311
      Reserved GDT blocks at 98312-99328
      Block bitmap at 1028, Inode bitmap at 1044
      Inode table at 2593-3104
      31743 free blocks, 8192 free inodes, 0 directories, 8192 unused inodes
      Free blocks: 99329-131071
      Free inodes: 24577-32768

        引入flex_group特性的作用是为了支持更大的文件, 这样有利于大文件的数据块的分配,结合extent特性。

      2、Bigalloc特性

          传统的ext4分配的最大的单位只能为4KB,块大小控制在4KB~512B之间,具体块大小在格式化的时候确定。因为Linux内存管理的限制, ext4文件系统不能处理大于4KB的文件系统块。但是对于一个文件系统中大部分文件都是大文件的情况,希望能够同时处理多个文件系统Block,减少文件系统中用于管理Block的开销。ext4中的新添加的特性Bigalloc特性可以很好的满足这个条件,在Bigalloc中,文件系统管理的单位叫做cluster,每个cluster是由原来的多个block组成,在原来的block bitmap中管理的大小由block变成cluster。

          当然这个特性在小文件很多的情况下容易造成磁盘碎片很多,最后性能会骤然下降

     3、Extent特性

          在原来的ext4文件系统中进行逻辑块到物理块的转换采用的是inode中的blocks数组进行转换。在这种情况下,对于小文件,比如小于40KB(假设文件系统块大小为4KB)的文件,采用的是直接映射,这时ext4系统可以很快的处理,因为进行磁盘的IO次数变为两次(一次为读取文件inode,另外一次为读取对应的数据Block);但当读取的文件的大小超过40KB时,这时需要采用间接块的处理,这时进行文件读取操作需要多次磁盘IO,因此在大文件,尤其是几个G以上的文件下ext4文件读取性能会下降很多。而且针对于文件的truncate操作和文件的删除操作,对于大文件而言需要进行的磁盘IO次数也明显增加,整个文件系统性能下降很多。

          采用extent的特性,可以有效的减少对于文件块映射的开销。ext4中的管理extent的重要的数据结构如下:      

    /*
     * Each block (leaves and indexes), even inode-stored has header.
     */
    struct ext4_extent_header {
        __le16    eh_magic;    /* probably will support different formats */
        __le16    eh_entries;    /* number of valid entries */
        __le16    eh_max;        /* capacity of store in entries */
        __le16    eh_depth;    /* has tree real underlying blocks? */
        __le32    eh_generation;    /* generation of the tree */
    };
    /*
     * This is index on-disk structure.
     * It's used at all the levels except the bottom.
     */
    struct ext4_extent_idx {
        __le32    ei_block;    /* index covers logical blocks from 'block' */
        __le32    ei_leaf_lo;    /* pointer to the physical block of the next *
                     * level. leaf or next index could be there */
        __le16    ei_leaf_hi;    /* high 16 bits of physical block */
        __u16    ei_unused;
    };
    /*
     * This is the extent on-disk structure.
     * It's used at the bottom of the tree.
     */
    struct ext4_extent {
        __le32    ee_block;    /* first logical block extent covers */
        __le16    ee_len;        /* number of blocks covered by extent */
        __le16    ee_start_hi;    /* high 16 bits of physical block */
        __le32    ee_start_lo;    /* low 32 bits of physical block */
    };

        如上述中的extent的数据结构描述,一个大的数据块只需要一个起始块,再加上一个长度,开销很小。而且对于删除而言,可以很快的删除。在ext4中整个extent的管理采用extent tree的方式,extent tree是采用B+-tree管理。

      4、Inline data特性

        内联数据的特性,可以有效的减少磁盘次数,对于小文件的处理可以提高很大的性能。原始的ext4文件所有数据采用的都是blocks的map方式在逻辑块和物理块之间的转换,采用extent的方式进行处理对于小文件会造成很大的磁盘碎片,影响ext4整体的文件系统性能,这些小文件为包括字节数为几十个字节。  

        采用inline data的方式, 文件的数据放在inode的后面,此时的inode为扩的inode,需要进行扩大处理。 

    参考资料:

       [1]  Ext4 disk layout.   https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Inline_Data

       [2]  Ext4 (and Ext2/Ext3) Wiki.   https://ext4.wiki.kernel.org/index.php/Main_Page

  • 相关阅读:
    在IIS7.5中ASP.NET调用cmd程序拒绝访问决绝方法小记
    WindowsCE project missing Microsoft.CompactFramework.CSharp.targets in Visual Studio 2008
    Windows 10预览版14316开启Bash命令支持
    批量文件重命名工具
    多说使用ua-parser-js显示浏览器和系统信息
    Hexo主题实现多级分类显示
    MS SQL Server 数据库分离-SQL语句
    Windows应用程序快捷方式创建工具
    第三方登录插件.NET版XY.OAuth-CSharp
    Microsoft Visual Studio 2008 未能正确加载包“Visual Web Developer HTML Source Editor Package” | “Visual Studio HTM Editor Package”
  • 原文地址:https://www.cnblogs.com/linghuchong0605/p/4515732.html
Copyright © 2020-2023  润新知