ext3文件系统调优

一、 VFS

l  文件系统也和I/O有关,因为当一个数据被写到磁盘上去的时候,这时候需要经过文件系统的调度,然后才写入到磁盘当中。

l  VFS(虚拟的文件系统):对于应用程序来说,并不关心底层的文件系统的格式。(如ftp服务器,写入磁盘并不用考虑是ext3,ext2的文件系统),应用程序和文件系统之间存在着VFS的虚拟文件系统。

l  VFS是一个内核软件层,为多种实际文件系统提供统一的接口。底层的文件系统(ext2,ext3,nfs,smb)等通过加载特定的模块,来使得应用程序程序,而这中间的就要通过:libC ,system call,VFS等机制来实现。

l  VFS结构图

二、 Ext3

1.         ext3的结构图

2.         Superblock

每一个硬盘都有个分区表,这个分区表在MBR中(记录了起始柱面,还有文件的类型),其中的分区表指向的就是每个分区的superblock。每个分区的第一个block就是superblock,  记录了这个分区的信息:文件格式,大小,已经用了多少,卷标等等,这些信息就是记录在superblock,可以用tune2fs进行调整。

[root@localhost ~]# dumpe2fs /dev/sda1    #dumpe2fs工具可查看分区的详细信息

dumpe2fs 1.39 (29-May-2006)

Filesystem volume name:   /boot1

Last mounted on:          <not available>

Filesystem UUID:          6bb0b3fa-1039-4606-b646-30abbd4b9406

Filesystem magic number:  0xEF53

Filesystem revision #:    1 (dynamic)

Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super

Default mount options:    user_xattr acl

Filesystem state:         clean

Errors behavior:          Continue

Filesystem OS type:       Linux

Inode count:              64256

Block count:              257008

Reserved block count:     12850

Free blocks:              229845

Free inodes:              64216

First block:              1

Block size:               1024

Fragment size:            1024

Reserved GDT blocks:      256

Blocks per group:         8192

Fragments per group:      8192

Inodes per group:         2008

Inode blocks per group:   251

Filesystem created:       Fri May  6 17:10:14 2011

Last mount time:          Wed Jul 13 12:32:43 2011

Last write time:          Wed Jul 13 12:32:43 2011

Mount count:              11

Maximum mount count:      -1

Last checked:             Fri May  6 17:10:14 2011

Check interval:           0 (<none>)

Reserved blocks uid:      0 (user root)

Reserved blocks gid:      0 (group root)

First inode:              11

Inode size:               128

Journal inode:            8

Default directory hash:   tea

Directory Hash Seed:      5209fe71-76f4-4766-a981-dd66b2b8010a

Journal backup:           inode blocks

Journal size:             4114k

Group 0: (Blocks 1-8192)

Primary superblock at 1, Group descriptors at 2-2

Reserved GDT blocks at 3-258

Block bitmap at 259 (+258), Inode bitmap at 260 (+259)

Inode table at 261-511 (+260)

0 free blocks, 1989 free inodes, 2 directories

Free blocks:

Free inodes: 20-2008

Group 1: (Blocks 8193-16384)

Backup superblock at 8193, Group descriptors at 8194-8194

Reserved GDT blocks at 8195-8450

Block bitmap at 8451 (+258), Inode bitmap at 8452 (+259)

Inode table at 8453-8703 (+260)

3738 free blocks, 1991 free inodes, 1 directories

Free blocks: 12429-12432, 12596-12800, 12809-13312, 13321-13824, 13832-14336, 14344-14848, 14857-15360, 15368-15872, 15883-16384

Free inodes: 2011, 2027-4016

Group 2: (Blocks 16385-24576)

Block bitmap at 16385 (+0), Inode bitmap at 16386 (+1)

Inode table at 16387-16637 (+2)

7939 free blocks, 2008 free inodes, 0 directories

Free blocks: 16638-24576

Free inodes: 4017-6024

Group 3: (Blocks 24577-32768)

Backup superblock at 24577, Group descriptors at 24578-24578

Reserved GDT blocks at 24579-24834

Block bitmap at 24835 (+258), Inode bitmap at 24836 (+259)

Inode table at 24837-25087 (+260)

2589 free blocks, 2004 free inodes, 0 directories

Free blocks: 25088, 27109-29696

Free inodes: 6029-8032

Group 4: (Blocks 32769-40960)

Block bitmap at 32769 (+0), Inode bitmap at 32770 (+1)

Inode table at 32771-33021 (+2)

7653 free blocks, 2008 free inodes, 0 directories

Free blocks: 33022-33024, 33311-40960

Free inodes: 8033-10040

3.         Group

每个ext3的文件系统是由很多个group组成的. 系统设置group是为了我们的文件系统再写入的时候,尽量在一个连续的空间上。

#如:现在有一个文件系统,很显然很多文件的大小不止4KIB的大小,那么我们的磁盘再写入的时候会尽量的连续的写入,如一个6kib文件大小的文件,会占用到位置一的block,而位置2,3的block已经被占用了,则后面的2kib会写入到位置4的block中,那么当要读取这个文件的时候,那么磁头会跳动的读取,所以读的请求会很慢。所以系统设置了group的机制,所写入的文件尽量会写入到同一个group中,尽量放在一个连续的空间上,这样会减少磁头的寻道时间。

Group 0: (Blocks 1-8192)

Primary superblock at 1, Group descriptors at 2-2

Reserved GDT blocks at 3-258

Block bitmap at 259 (+258), Inode bitmap at 260 (+259)

Inode table at 261-511 (+260)

0 free blocks, 1989 free inodes, 2 directories

Free blocks:

Free inodes: 20-2008

Group 1: (Blocks 8193-16384)

Backup superblock at 8193, Group descriptors at 8194-8194

Reserved GDT blocks at 8195-8450

Block bitmap at 8451 (+258), Inode bitmap at 8452 (+259)

Inode table at 8453-8703 (+260)

3738 free blocks, 1991 free inodes, 1 directories

Free blocks: 12429-12432, 12596-12800, 12809-13312, 13321-13824, 13832-14336, 14344-14848, 14857-15360, 15368-15872, 15883-16384

Free inodes: 2011, 2027-4016

l  其中每个group是由8192个block组成的:

Blocks per group:         8192

而每个block的大小是:

Block size:               1024

l  Group 0:

所以上面的第一个block  就是superblock

Primary superblock at 1, Group descriptors at 2-2

l  在第二行有3-258  是保留的block数。

Reserved GDT blocks at 3-258

l  在第三行有block bitmap  和inode bitmap:

Block bitmap at 259 (+258), Inode bitmap at 260 (+259)

#如果是新建一个档案或目录时,我们的 Ext3是如何处理的呢? 这个时候就得要 block bitmap 及 inode bitmap 的帮忙了!假设我们想要新增一个档案,此时档案系统的行为是:

1. 先确定使用者对于欲新增档案的目录是否具有 w 与 x 的权限,若有的话才能新增;

2. 根据 inode bitmap 找到没有使用的 inode 号码,并将新档案的权限/属性写入;

3. 根据 block bitmap 找到没有使用中的 block 号码,并将实际的资料写入 block 中,且更新 inode 的 block 指向资料;

4. 将刚刚写入的 inode 与 block 资料同步更新 inode bitmap 与 block bitmap,并更新 superblock 的内容。

一般来说,我们将 inode table 与 data block 称为资料存放区域, superblock、 block bitmap 与 inode bitmap 等区段就被称为metadata (中介资料),因为 superblock, inode bitmap 及 block bitmap 的资料是经常变动的,每次新增、移除、编辑时都可能会影响到这三个部分的资料。

l  第四行有group0 的节点表的信息:

Inode table at 261-511 (+260)

而后面记录的就是真正可以使用的block和inode的大小:

Inode table at 8453-8703 (+260)

3738 free blocks, 1991 free inodes, 1 directories

Free blocks: 12429-12432, 12596-12800, 12809-13312, 13321-13824, 13832-14336, 14344-14848, 14857-15360, 15368-15872, 15883-16384

Free inodes: 2011, 2027-4016

l Group 1:

在第一行就记录了用来备份的superblock:

superblock很小,而且又很重要,所以系统会在后面的group1对group0的superblock做一个备份。用来防止superblock坏掉了,可以恢复。

group{1,3,5,7..}这些单数的都有对superblock的备份。

4.         Fragmenation(分段)

l  连续的读取可以提升我们的性能,我们的ext2,ext3会使用一个保留的空间,来减少我们的分段。

l  保留出来的空间的目的:未来在写入一个文件的时候,或者修改一个应经存在的文件的时候,就会写入到在这个保留的空间里面,而每个写入的动作,都会占用8个block,当关闭的时候或者保存的时候,会将这8个block释放出来。当文件在在被创建的时候,和你创建目录是不一样的所使用的block数量。当扩展一个文件的时候,将尽可能的使用同一个group中的block。

l  系统在每个分区中会自动保留5%的空间来防止  无法写入。而这5%的空间只能由root来写入。

l  在修改,或创建一个文档的时候,不恰当的操作,会在同级的目录下产生一个.swp的文件,这个文件是另一个文件,其Inode值与源文件不用属于另一个文件。这个文件就是保留在内存当中的文件(就是在编辑的时候的内容是放在内存当中的)。当系统出现一些逻辑的错误,而无法启动。可以进入修复模式 ,用fsck /dev/sda1  进行修复

l  调整fragmentation的block保留数

[root@www ~]# tune2fs -m 5 /dev/sda1

tune2fs 1.39 (29-May-2006)

Setting reserved blocks percentage to 5% (12850 blocks)

#默认保留数为5%

-m:百分数

-r:直接指定保留数

#文件系统创建以后可调整,太小影响性能,太大会浪费空间。

三、 文件系统的限制

l最大文件大小:

ext3:2TiB

GFS:16TiB(x86/32bit) or 8EiB(x86/64bit)

l最大文件系统大小:

ext3:16TiB

GFS:16TiB(x86/32bit) or 8EiB(x86/64bit)

#1EiB=1024PiB

1PiB=1024TiB

1TiB=1024GiB

1.   查看一个文件的详细信息。

[root@www ~]# filefrag -v /root/elevator-test-0.1-3.i386.rpm

Checking /root/elevator-test-0.1-3.i386.rpm

Filesystem type is: ef53

Filesystem cylinder groups is approximately 996

Blocksize of file /root/elevator-test-0.1-3.i386.rpm is 4096

File size of /root/elevator-test-0.1-3.i386.rpm is 7981 (2 blocks)

First block: 28063768

Last block: 28063769

/root/elevator-test-0.1-3.i386.rpm: 1 extent found

2.   修复一个未挂载的文件系统

[root@www ~]# fsck /dev/sda1

fsck 1.39 (29-May-2006)

e2fsck 1.39 (29-May-2006)

/dev/sda1 is mounted.

#千万不要用fsck操作已挂载文件系统,很有可能破坏数据。

3.   关闭文件系统的检查功能:

[root@www ~]#tune2fs -c0 -i0 /dev/sda

#修改fsck检查时间

c0:挂载次数

i0:挂载天数,执行fsck

四、 Ext3的日志区(journaling)

日志会影响I/O的性能。日志区是存放整个文件系统的节点表里,默认情况下,日志区只会记录元数据。

#数据写入过程:先将修改的block写入日志区,然后将block写入到文件系统,写入文件系统后在释放日志区。

1.   Ext3的三种日志模式

l  只有对文件系统元数据的改变才记入日志(默认)

mount -o data=ordered

l  文件系统所有数据和元数据的改变都记入日志

mount -o data=journal /dev/sdaX /mnt

#这样性能会很差,但是相对来说会很安全

l  只有对文件系统元数据的改变才记入日志,但是在完成数据的时候不会马上写入到磁盘中,而是等到闲的时候才会写入到磁盘。

mount -o data-writeback

#这样做会提高系统的性能,但是相对的也有风险

2.   日志区放到一个其他的设备上

默认情况下,日志区是和本分区是在一起的。日志区的大小必须是2的N次方,可以是4M-400M。

可以将日志区房子一个独立的设备上,但是注意,要将日志区独立放出的分区的block大小必须和新建的设备的block大小必须一样。

在做完这个分区只能用在日志功能,不能用作其他的用途,如:分了1G的大小,用来做日志区,但是只能用400M,那么后面的600M的空间不能使用。

日志区的功能不能保证数据的不丢失,而是保证数据的一致性。

l  创建日志区

[root@iscsi-server ~]#lvcreate -L 512M -n LogVol05 VolGroup00 /dev/sda3

#该分区创建后只能日志区,且只能做一个文件系统的日志区

l  将新分区格式化日志区

[root@iscsi-server ~]#mke2fs -O journal_dev -b 4096 /dev/VolGroup00/LogVol05

#block大小必须与文件系统的block大小一样也为4K

#查看原文件系统的block大小

#[root@iscsi-server ~]# tune2fs -l /dev/VolGroup00/LogVol03|grep -i "block size"

l  把原分区的日志区给取消掉

[root@iscsi-server ~]#umount /dev/VolGroup00/LogVol03

[root@iscsi-server ~]#tune2fs -O ^has_journal /dev/VolGroup00/LogVol03

l  将原分区的日志区移到新日志区上

[root@iscsi-server ~]#tune2fs -j -J device=/dev/VolGroup00/LogVol05 /dev/VolGroup00/LogVol03

#指定LogVol03的日志存放在LogVol05下

mount -o noatime :关闭访问文件时文件的访问时间更新,节省I/O资源。针对大型web后台。

mount -o commit=15:每隔15秒journal写入到文件系统里面将默认5s这样可提供性能,但容易丢失数据。

五、 RAID的调优

1.   Raid 0 5 6的调优

raid 0 5 6都是采用条带化轮询的写入机制。如果raid 5 6的磁盘修改达到整个硬盘IO的20%的时候 是不太建议使用此raid的。

l  Chunk  size和stribe

一个数据包的大小称之为chunk size:RAID里面每个成员一次写入的数据量。当一次写入的量不到chunk size设定的大小的时候是不会写入下一个成员盘。chunk size的值必须是多个page size的大小,在X86架构下一个page size的大小是4KB即chunk size的大小必须是2的N次方 n大于1 必须是4的倍数。

stride是每次写入raid成员的block数,stride 等于 chunk size / filesystem block size

chunksize=(avgrq-sz × 512)/(raid磁盘数 × 1024)=2的N次方KBim/disk

stride=chunksize/filesystemblocksize

实例:

[root@iscsi-server ~]# iostat -x /dev/sdb

Linux 2.6.18-194.el5 (iscsi-server)     2011年08月12日

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

0.05    0.02    0.09    0.07    0.00   99.77

Device:  rrqm/s  wrqm/s  r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz   await  svctm  %util

sdb     2.41     1.17  0.40  0.03  19.07  9.55    65.17     0.00    4.75   0.85   0.04

#查询磁盘的avgrq-sz,avgrq-sz是扇区数,每个扇区512Bit

Chunksize=(65.17×512)/(3×1024)=10.86=8KBit/disk

Stribe=(8KBit/disk)/(4KBit)=2

#chunksize必须是2的N次方,4的倍数

l  调整chunksize或stribe

[root@iscsi-server ~]# mdadm -C /dev/md0 -a yes -c 32 -l 5 -n 3 /dev/sdb{1,2,3}

#创建chunksize为32的raid5

[root@iscsi-server ~]# mkfs.ext3 -b 4096 -E stride=8 /dev/md0

#将/dev/md0格式化为stride=8的ext3文件系统

[root@iscsi-server ~]# cat /sys/block/mdx/md/chunk_size

[root@iscsi-server ~]# cat /proc/mdstat |grep -i chunk

[root@iscsi-server ~]# mdadm --detail /dev/mdx |grep – chunk

#查看当前条带的chunk size

l  修改raid 5的strip cache(仅对Raid 5有效)

[root@iscsi-server ~]# echo 256 > /sys/block/md0/md/strip_cache_size

#strip cache:每个磁盘同步的内存缓存,默认每个设备的128个page数。

2.         RAID 1的调优(仅对Raid 1有效)

l  设置位图bitmap:保证同步失败时,下次同步时直接从改变的地方直接同步,无需从头再来。分为内部位图和外部位图

[root@iscsi-server ~]# mdadm /dev/md0 -G -b internal

#添加一个内部位图区

[root@iscsi-server ~]# mdadm /dev/md0 ---grow --bitmap=/absolute/path

#添加一个外部位图区

[root@iscsi-server ~]# mdadm -C /dev/md0 -l1 -n2 -b /tmp/md0 --write-behind=256 /dev/sdc1 --write-mostly /dev/sdd1

#在一个慢设备/dev/sdd1上创建raid,以上表示当在对设备/dev/sdc1的请求达到256个是开始往慢设备/dev/sdd1发送请求,仅对raid 1有效。

本文转自netsword 51CTO博客,原文链接:http://blog.51cto.com/netsword/637816

RH442-5 ext3文件系统调优相关推荐

  1. 性能调优攻略——来自酷壳陈皓

    关于性能优化这是一个比较大的话题,在<由12306.cn谈谈网站性能技术>中我从业务和设计上说过一些可用的技术以及那些技术的优缺点,今天,想从一些技术细节上谈谈性能优化,主要是一些代码级别 ...

  2. 性能调优攻略:完整地讲述了一些代码级别的技术和方法

    关于性能优化这是一个比较大的话题,在<由12306.cn谈谈网站性能技术>中我从业务和设计上说过一些可用的技术以及那些技术的优缺点,今天,想从一些技术细节上谈谈性能优化,主要是一些代码级别 ...

  3. 高性能服务器之性能调优

    摘自:https://coolshell.cn/articles/7490.html 一.系统性能定义 让我们先来说说如何什么是系统性能.这个定义非常关键,如果我们不清楚什么是系统性能,那么我们将无法 ...

  4. Linux性能调优用这个“必杀技”,稳了!

    " "这个系统好慢.网站又打不开了,太卡了,又没响应了!"相信大家都遇到过这种抱怨,这是应用系统出现了性能问题,需要性能调优. 性能调优,要求对计算机硬件.操作系统和应用 ...

  5. 运维基础(9)Linux性能调优三大系统

    这个系统好慢.网站又打不开了,太卡了,又没响应了!"相信大家都遇到过这种抱怨,这是应用系统出现了性能问题,需要性能调优. 性能调优,要求对计算机硬件.操作系统和应用有相当深入的了解. 调节三 ...

  6. 阿里资深软件测试工程师总结的这几点,让你轻松搞懂性能调优

    什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How ...

  7. 一篇让小白彻底搞懂性能调优!

    前言: 什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么人来进行性能调优?(who) 怎么样进行性能调优?( ...

  8. 「入门运维必看」一篇让小白彻底搞懂性能调优!

    前言: 什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么人来进行性能调优?(who) 怎么样进行性能调优?( ...

  9. hadoop集群swap_hadoop集群调优-OS和文件系统部分

    OS and File System 根据Dell(因为我们的硬件采用dell的方案)关于hadoop调优的相关说明,改变几个Linux的默认设置,Hadoop的性能能够增长大概15%. open f ...

最新文章

  1. double取整数部分_剑指offer_16_数值的整数次方
  2. java中的assert
  3. hdu4179 限制最短路
  4. windows2003中mssql连接的NT AUTHORITY\NETWORK SERVICE登录失败的问题
  5. rmd转换html怎么换页,如何在由RStudiomarkdown生成的单词文档中添加分页符
  6. IBASE view WD_DESTROY - ON_NEW_FOCUS
  7. 配置Struts2的异常处理
  8. 列表显示新闻等信息,添加新消息图标
  9. Docker的mysql镜像_详解docker下的Mysql镜像的使用方法
  10. 【BZOJ】1010: [HNOI2008]玩具装箱toy(dp+斜率优化)
  11. 大版本号跨越,AIDA64更新6.0版本:更新测试,支持Zen 2架构
  12. 大米云主机首批优秀体验师新鲜出炉——综合篇
  13. 怎么把zip转换html,如何压缩为rar格式 怎样把rar格式变成zip格式
  14. SQL 视频整体总结
  15. 大一上:计算机导论复习(每章分值、常考题型以及部分章节课后习题答案【网上没有,老师自己做的】)
  16. bzGhost 打造跨平台即时聊天软件之websocket
  17. 如何获取侧面加载的应用程序以显示在Fire Tablets的FreeTime配置文件中
  18. 飞冰 前端开发的一些坑
  19. 在linux虚拟机上显示摄像头视频(V4L2编程)
  20. GitHub快速学习-三

热门文章

  1. Linux 内核clk 添加clk provider
  2. 东南大学计算机专业工程博士,东南大学计算机考博 - 考博 - 小木虫 - 学术 科研 互动社区...
  3. 破解数字化转型困局,企业分析协同场景案例解析
  4. django-q快速上手定时任务
  5. eclipse卡死问题优化
  6. 电容在电路中各种作用汇总(内容很干)
  7. hdu 4549 M斐波那契数列(矩阵乘法+降幂公式)
  8. 写给人类的机器学习 2.3 监督学习 III
  9. ADS滤波器设计向导工具一
  10. Python之子域名查询