在文件系统方面,Linux可以算得上操作系统中的 “瑞士×××”。Linux 支持许多种文件系统,从日志型文件系统到集群文件系统和加密文件系统。对于使用标准的和比较奇特的文件系统以及开发文件系统来说,Linux 是极好的平台。本文讨论 Linux 内核自带的文件系统Ext3、Ext4文件数、目录数、文件名长度等各种限制。

  实测ext3的限制瓶颈

  1. 测试目的:ext3文件系统下filename最大字符长度

  测试平台:RHEL5U3_x64
  测试过程:
  LENTH=`for i in {1..255};do for x in a;do echo -n $x;done;done`
  touch $LENTH
  当增加到256时,touch报错,File name too long
  linux系统下ext3文件系统内给文件/目录命名,最长只能支持127个中文字符,英文则可以支持255个字符

  2. 测试目的:ext3文件系统下一级子目录的个数限制

  测试平台:RHEL5U3_x64
  测试过程:
  [root@fileserver maxdir]# for i in {1..32000};do mkdir $i;done
  mkdir: cannot create directory `31999': Too many links
  mkdir: cannot create directory `32000': Too many links
  ext3文件系统一级子目录的个数为31998(个)。
  Linux为了cpu的搜索效率而规定的,要想改变数目大概要重新编译内核.

  3. 测试目的:ext3文件系统下单个目录里的最大文件数

  测试平台: RHEL5U3_x64
  测试过程:
  单个目录下的最大文件数似乎没什么特别限制,也是受限于所在文件系统的inode数限制:
  df -i或者使用tune2fs -l /dev/sdaX或者dumpe2fs -h /dev/sdaX查看可用inode数,后两个命令
  输出结果是一样的,但是跟df所得出的可用inode数会有些误差,至今不明白什么原因。

  网上常用两种解决办法:

  1) 重新mkfs,ext3默认block大小4096 Bytes,block设置小一些inode数设置大一些

  2) 使用loopback文件系统临时解决:在/usr中(也可以在别处)创建一个大文件,然后做成loopback文件系统,将原来的文件移到这个文件系统中,并将它mount到/usr下合适的位置。这样可以大大减少你/usr中的文件数目。但是系统性能会有点损失。

  4. 测试目的: 打开文件数限制(文件句柄、文件描述符)

  测试平台: RHEL5U3_x64
  ulimit -n 65535设置,或者/etc/security/limit.conf里设置用户打开文件数、进程数、CPU等

 

 

Linux新文件系统Ext4

  Ext4(The fourth extended file system)是一种针对ext3系统的扩展日志式文件系统,是专门为 Linux 开发的原始的扩展文件系统(ext 或 extfs)的第四版。Linux kernel 自 2.6.28 开始正式支持 Ext4。

  兼容性

  Ext3升级到ext4能提供系统更高的性能,消除存储限制,和获取新的功能,并且不需要重新格式化分区,ext4会在新的数据上用新的文件结构,旧的文件保留原状。以ext3 文件系统的方式mount到ext4上会不用新的磁盘格式,而且还能再用ext3来重新挂载,这样仅仅失去了ext4的优势。

  大文件系统/文件大小

  现在ext3支持最大16TB的文件系统。单个文件最大2TB。Ext4增加了48位块地址,最大支持1EB文件系统,和单个16TB的文件。1EB=1024PB 1PB=1024TB 1TB=1024GB。

  子目录可伸缩性

  EXT3每个目录最大包含32000个子目录。减去.和..也就是31998,ext4打破了这个限制可以无限制数量的子目录

  Extents

  传统的Unix派生文件系统,使用间接块映射方案,以跟踪每块用于块相应的数据文件,这对大文件来说是低效率的。现代文件系统使用不同的方法称为“extends” 。extends基本上指一串连续的物理快。通常叫做数据在下面的N个块中。一个100MB的文件可以分配到一extends中。而不需要创建一个间接映射表为256000个blocks,(每个block 4kb)大文件被分割为很多范围。Extends改进了性能并且减少了碎片。因为extends鼓励在磁盘上连续布局。

  Multiblock 分配

  ext4使用了一个多块分配来在一次调用中分配很多块。替换掉每次分配一个块,减少系统开销。在延时分配和extends上十分有用。

  延迟分配

  延迟分配是一个性能特性(它不修改磁盘格式)。现代文件系统例如XFS,ZFS,btrfs or Reiser 4 并且它尽可能多的延时块的分配。相对于传统文件系统(例如Ext3 reiser3 etc)所做的立刻分配块提供了更好的性能。

  日志校验和

  日志是磁盘中最常用的一部分,组成日志的这部分也是最容易出现硬件故障的。并且从一个受损的日志上恢复数据会导致巨大的数据损坏。Ext4 校验和提供了改进,它允许将EXt3的双向提交日志格式转换为单向的,加速文件系统操作,在某些情况下达到20%---因此可靠性和性能同时被改进。

  在线碎片整理

  当 延迟分配,extents 和 multiblock 分配 帮助减少碎片的时候,使用中的文件系统依然会产生碎片。为了解决这个问题,Ext4 将会支持在线碎片整理,并且有一个e4defrag工具可以整理个别文件在整个文件系统中。

  索引节点-关联

  拥有大索引节点,纳秒时间戳,快速扩展属性,索引节点保留的特点。Ext3 支持可设置的索引节点大小(通过 mkfs -l参数)但是默认索引节点大小是128字节。Ext4将默认为256字节。这需要适应一些额外的字段(比如纳秒时间戳或者索引节点版本)并且剩余索引节点空间会被用于存放扩展属性为那些足够小的对象来适合空间。这样使访问那些属性更快,提高那些使用扩展属性的应用程序性能3-7倍。在目录创建的时候保留若干索引节点在里面,预期它们在未来使用。这样改进性能,因为新文件被创建在目录中他们可以使用保留索引节点。文件创建和删除因此更高效。纳秒时间戳意味着索引节点字段例如修改时间可以用纳秒分辨率替代Ext3中的秒。

  持续预分配

  这个特性在ext3最新的内核版本中已经可用了,由glic仿真来实现文件系统不支持的功能,允许应用程序预分配磁盘空间:应用程序告诉文件系统来预分配空间,文件系统预分配需要的块和数据结构。