天天看點

RH442-5 ext3檔案系統調優

 ext3檔案系統調優

一、 VFS

l  檔案系統也和I/O有關,因為當一個資料被寫到磁盤上去的時候,這時候需要經過檔案系統的排程,然後才寫入到磁盤當中。

l  VFS(虛拟的檔案系統):對于應用程式來說,并不關心底層的檔案系統的格式。(如ftp伺服器,寫入磁盤并不用考慮是ext3,ext2的檔案系統),應用程式和檔案系統之間存在着VFS的虛拟檔案系統。

l  VFS是一個核心軟體層,為多種實際檔案系統提供統一的接口。底層的檔案系統(ext2,ext3,nfs,smb)等通過加載特定的子產品,來使得應用程式程式,而這中間的就要通過:libC ,system call,VFS等機制來實作。

l  VFS結構圖

<a target="_blank" href="http://blog.51cto.com/attachment/201108/174407298.jpg"></a>

二、 Ext3

1.         ext3的結構圖

<a target="_blank" href="http://blog.51cto.com/attachment/201108/174443999.jpg"></a>

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:          &lt;not available&gt;

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 (&lt;none&gt;)

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中,盡量放在一個連續的空間上,這樣會減少磁頭的尋道時間。

l  其中每個group是由8192個block組成的:

而每個block的大小是:

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:

#如果是建立一個檔案或目錄時,我們的 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)

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

#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

<b>chunksize</b><b>=(avgrq-sz </b><b>× 512)/</b><b>(raid</b><b>磁盤數 </b><b>× 1024</b><b>)=2</b><b>的N</b><b>次方KBim/disk</b>

<b></b>

<b>stride</b><b>=chunksize/filesystemblocksize</b>

執行個體:

[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 &gt; /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