LINUX系統效能調諧 (zt)

tonykorn97發表於2006-11-14

本文從磁碟,檔案及檔案系統,記憶體和編譯等方面詳細的講述瞭如何對Linux系統效能進行調諧。不管是Linux伺服器還是客戶機或者使用者單機,按照本文提供的調諧方法,均可不同程度地改善Linux系統的效能。
1. 引言

實踐證明Linux是高效能、穩定可靠而又相當靈活的作業系統,近年來,世界上許多大軟體公司紛紛推出各種Linux伺服器系統及Linux下的應用軟體。目前,Linux已可以與各種傳統的商業作業系統分庭抗禮,在伺服器市場,佔據了相當大的份額。Linux的伺服器系統多種多樣,可用作web伺服器,郵件伺服器,ftp伺服器,檔案伺服器以及資料庫伺服器等等。針對不同的系統以及具體的應用環境,可以對Linux的效能進行相應的調諧。下面分別從磁碟調諧,檔案系統,記憶體管理以及編譯最佳化等方面來論述Linux系統的最佳化調諧策略。


在上圖中,磁碟還有一部分未分割槽的空間,為什麼不在安裝系統時,將整個磁碟分割槽呢?現在的硬碟空間比較大,而在安裝系統時,也許你所安裝的檔案加上以後增長所需要的空間用不到整個磁碟儲存空間。保留一部分未分割槽空間,當以後有新的需要時,就可以用fdisk重新將之分割槽。在分割槽時,需要注意的是,根據系統將來執行的需要或過去的經驗來估計各個分割槽的大小,以免將來空間不夠。

如果你的系統有多塊硬碟,可以考慮使用多個交換分割槽。每個磁碟上劃分一個交換分割槽。透過在/etc/fstab檔案中設定pri 選項,可使多個交換分割槽具有同樣的優先順序。Linux系統即可並行地使用它們。這樣即可提高交換分割槽的效能。


/dev/hda5 swap swap defaults,pri=5 0 0
/dev/hdc5 swap swap defaults,pri=5 0 0



圖(二)多個交換分割槽設定相同的優先順序

當然,如果你的系統記憶體足夠大,而你的系統又遠遠用不了那麼多的記憶體,那也就用不到什麼虛存了。分割槽時你就可以考慮去掉交換分割槽。不過作為一個Linux伺服器,即使你的記憶體足夠大,還是應該設定交換分割槽。

2.2 使用hdparm改善Linux系統效能

如果你的Linux系統執行於IDE硬碟,可以使用hdparm工具來提高磁碟I/O的效能。不過使用hdparm要小心,因為可能破壞硬碟上的資料。所以在使用hdparm之前,仔細閱讀你的硬碟手冊。根據你具體的硬碟規格來使用相應的hdparm開關引數。對一塊UltraATA/66 EIDE 硬碟,其控制晶片支援多 PIO 模式和DMA,我們使用以下命令來調諧磁碟效能:



# /sbin/hdparm -x66 -d1 -u1 -m16 -c3 /dev/hda



選項說明:

① c3 :就是把硬碟的16位格式轉換為32位模式(32-bit mode w/sync)。控制資料如何從pci匯流排傳遞到控制器。
② m16 :改變硬碟的多路扇區的讀功能,-m16可以使得硬碟在一次i/o中斷中讀入16個扇區的資料(據具體硬碟而定)。
③ d1:開啟DMA模式。
④ x66 :在支援UDMA-capable的硬碟中,這個引數可以支援雙DMA通道的資料傳輸模式。
⑤ u1 :Linux在處理磁碟中斷時,可以unmask其他的中斷或者響應其他中斷相關的任務。


  
檢視以上的更改情況可以使用命令:



# /sbin/hdparm /dev/hda



測試磁碟I/O效能可以使用命令:


# /sbin/hdparm -tT /dev/hda



如果磁碟的效能有改進的話,可以使用以下命令來儲存設定:


# /sbin/hdparm -k1 /dev/hda



2.3 Linux下使用軟RAID

RAID(磁碟冗餘陣列)是透過將資料分佈在多個磁碟上來增強磁碟效能和可靠性的技術。如果你的系統沒有硬體RAID控制器的話,在Linux下可以透過軟體來實現RAID。RAID的有很多的級別,不同的級別對硬體有不同的要求,相應也會得到不同的效能和可靠性。RAID0為資料分割,資料塊被交替寫到磁碟,可以得到最好的讀寫效能,但是不提供資料冗餘。RAID1為磁碟映象,寫到磁碟1中的一切也寫到磁碟2中,從任何一個磁碟都可以讀取。RAID3除了資料分割之外,還指定一個磁碟驅動器來儲存奇偶資訊。

在LINUX下透過軟體來實現RAID, 需要LINUX的核心支援,可以透過編譯新核心來新增對RAID的支援。然後還需編譯並安裝 raidtools 軟體包。raidtools 是可以初始化、啟動、停止及控制 RAID 陣列的使用者級工具。下面是我們用兩塊IDE硬碟在LINUX核心2.4上實現RAID0的方法。

設定分割槽 使用RAID0至少需要兩個分割槽,它們位於不同的磁碟。最好做RAID0的兩個分割槽有相同的大小。建立分割槽時,將分割槽型別指定為 "FD"。以使 Linux 核心能將它們識別為 RAID 分割槽,這樣,這些分割槽就可在每次引導時自動被檢測並啟動。如果您沒有以這種方式標記 RAID 分割槽,則在每次引導之後,必須首先輸入 "raidstart --all" 才能掛載 RAID 陣列。我們做成RAID0的兩個分割槽為hda5和hdc5。

編輯/etc/raidtab檔案 建立/etc/raidtab檔案以描述RAID陣列的配置資訊。Linux 核心使用這些資訊在引導時自動檢測並啟動 RAID 陣列,因此必須對建立的每個 RAID 陣列進行這種配置。將分割槽hda5和hdc5組成md0 RAID0陣列的配置檔案如下:


raiddev /dev/md0
raid-level 0
nr-raid-disks 2
persistent-superblock 1
chunk-size 32
device /dev/hda5
raid-disk 0
device /dev/hdc5
raid-disk 1



圖(三) raidtab檔案

在raidtab檔案中,"raiddev" 條目指明要建立的 RAID 陣列;"nr-raid-disks" 指定陣列中的磁碟數目;"persistent-superblock" 設定為 1,告訴 raid 工具何時建立該卷;"chunk-size" 以K位元組指定 RAID0 使用的塊大小;最後,要指定的是組成該陣列的裝置即分割槽。

mkraid 和建立檔案系統 使用命令"# mkraid /dev/md0" 命令初始化/dev/md0分割槽,同時將啟動md0 RAID0陣列。接下來,即可在md0上建立你想要得檔案系統。我們在Linux伺服器上使用的是Reiserfs日誌檔案系統,建立的命令為"# mkreiserfs /dev/md0"。

這樣,就可以像其它檔案系統那樣來載入新建立的基於RAID0的檔案系統了。

2.4 使用elvtune調諧磁碟I/O

在Linux核心2.4以後的版本中,可以透過磁碟I/O的排程操作,來控制磁碟I/O的響應時間和吞吐量。透過調整I/O請求在佇列中的最大等待時間,可以在響應時間和吞吐量之間調諧。如果要求較少的響應時間,那麼吞吐量將降低,反之,較長的響應時間則可以得到較大的吞吐量。可以使用工具"/sbin/elvtune"來改變最大的響應時間值。使用方法如下:

檢視當前的設定


# /sbin/elvtune /dev/hda1



修改當前的配置


# /sbin/elvtune -r 2000 -w 4000 /dev/hda1



其中-r引數針對讀操作,-w引數針對寫操作.

可以透過命令"iostat -d -x /dev/hda1"得到的平均資訊(包括平均請求大小和平均佇列長度)來監視以上I/O配置的效果,並調整配置,以得到最佳的效能。一般來講,對於讀寫頻繁,但操作的資料量較少的Linux伺服器,且對實時性要求較高,那麼可以將引數調小。反之如果對於讀寫不頻繁,但要求具有較大的吞吐量的Linux伺服器,可以將引數調大,以獲得較大的吞吐量。


3. 檔案及檔案系統調諧

3.1 塊大小

建立檔案系統時,可以指定塊的大小。如果將來在你的檔案系統中是一些比較大的檔案的話,使用較大的塊大小將得到較好的效能。將ext2檔案系統的塊大小調整為4096byte而不是預設的1024byte,可以減少檔案碎片,加快fsck掃描的速度和檔案刪除以及讀操作的速度。另外,在ext2的檔案系統中,為根目錄保留了5%的空間,對一個大的檔案系統,除非用作日誌檔案,5%的比例有些過多。可以使用命令"# mke2fs -b 4096 -m 1 /dev/hda6"將它改為1%並以塊大小4096byte建立檔案系統。

使用多大的塊大小,需要根據你的系統綜合考慮,如果系統用作郵件或者新聞伺服器,使用較大的塊大小,雖然效能有所提高,但會造成磁碟空間較大的浪費。比如檔案系統中的檔案平均大小為2145byte,如果使用4096byte的塊大小,平均每一個檔案就會浪費1951byte空間。如果使用1024byte的塊大小,平均每一個檔案會浪費927byte空間。在效能和磁碟的代價上如何平衡,要看具體應用的需要。

3.2 不使用atime屬性

當檔案被建立,修改和訪問時,Linux系統會記錄這些時間資訊。記錄檔案最近一次被讀取的時間資訊,當系統的讀檔案操作頻繁時,將是一筆不少的開銷。所以,為了提高系統的效能,我們可以在讀取檔案時不修改檔案的atime屬性。可以透過在載入檔案系統時使用notime選項來做到這一點。當以noatime選項載入(mount)檔案系統時,對檔案的讀取不會更新檔案屬性中的atime資訊。設定noatime的重要性是消除了檔案系統對檔案的寫操作,檔案只是簡單地被系統讀取。由於寫操作相對讀來說要更消耗系統資源,所以這樣設定可以明顯提高伺服器的效能。注意wtime資訊仍然有效,任何時候檔案被寫,該資訊仍被更新。

比如在你的系統中,要為/home檔案系統設定notime選項,可以修改/etc/fstab檔案相應的行如下:


LABEL=/home /home ext2 noatime 1 2



要使該設定立即生效,可執行命令"#mount -oremount /home"。這樣以後系統讀取/home下的檔案時將不會再修改atime屬性。

3.3 調整緩衝區重新整理引數

Linux核心中,包含了一些對於系統執行態的可設定引數。緩衝重新整理的引數可以透過調整 /proc/sys/vm/bdflush檔案來完成,這個檔案的格式是這樣的:



# cat /proc/sys/vm/bdflush
30 64 64 256 500 3000 60 0 0



每一欄是一個引數,其中最重要的是前面幾個引數。第一個數字是在"dirty"緩衝區達到多少的時候強制喚醒bdflush程式重新整理硬碟,第二個數字是每次讓bdflush程式重新整理多少個dirty塊。所謂dirty塊是必須寫到磁碟中的快取塊。接下來的引數是每次允許bd flush將多少個記憶體塊排入空閒的緩衝塊列表。 以上值為RedHat Linux 7.1中的預設值。如何修改它們呢?對不同的系統有以下兩種方法

(1)# echo "100 128 128 512 5000 3000 60 0 0">/proc/sys/vm/bdflush 並將這條命令加到/etc/rc.d/rc.local檔案中去。
(2)在/etc/sysctl.conf 檔案中加入如下行: vm.bdflush = 100 128 128 512 5000 3000 60 0 0

以上的設定加大了緩衝區大小,降低了bdflush被啟動的頻度,同時也增加了萬一系統崩潰丟失資料的危險性。VFS的緩衝重新整理是Linux檔案系統高效的重要原因之一,如果效能對你真的很重要,應該考慮調整這個引數。

3.4 調整檔案控制程式碼數和i-節點數

在一個大型的網站伺服器其中,可能Linux預設的同時可開啟最大檔案數不能滿足系統需要,我們可以透過調整檔案控制程式碼數和i-節點數來增加系統的預設的限制。不同的Linux核心版本有不同的調整方法。

在Linux核心2.2.x中可以用如下命令修改:



# echo '8192' > /proc/sys/fs/file-max
# echo '32768' > /proc/sys/fs/inode-max



並將以上命令加到/etc/rc.c/rc.local檔案中,以使系統每次重新啟動時配置以上值。

在Linux核心2.4.x中需要修改原始碼,然後重新編譯核心才生效。編輯Linux核心原始碼中的 include/linux/fs.h檔案,將 NR_FILE 由8192改為 65536,將NR_RESERVED_FILES 由10 改為 128。編輯fs/inode.c 檔案將 MAX_INODE 由16384改為262144。

一般情況下,最大開啟檔案數比較合理的設定為每4M實體記憶體256,比如256M記憶體可以設為16384,而最大的使用的i節點的數目應該是最大開啟檔案數目的3倍到4倍。

3.5 使用記憶體檔案系統

在Linux中可以將一部分記憶體當作分割槽來使用,我們稱之為RamDisk。對於一些經常被訪問的檔案,而它們又不會被更改,可以將它們透過RamDisk放在記憶體中,即可明顯地提高系統的效能。當然你的記憶體可要足夠大了。RamDisk有兩種,一種可以格式化,載入,在Linux核心2.0/2.2就已經支援,其不足之處是大小固定。另一種是核心2.4才支援的,透過Ramfs或者tmpfs來實現,它們不能被格式化,但是用起來靈活,其大小隨所需要的空間而增加或減少。這裡主要介紹一下Ramfs和Tmpfs。

Ramfs顧名思義是記憶體檔案系統,它工作於虛擬檔案系統(VFS)層。不能格式化,可以建立多個,在建立時可以指定其最大能使用的記憶體大小。如果你的Linux已經將Ramfs編譯進核心,你就可以很容易地使用Ramfs了。建立一個目錄,載入Ramfs到該目錄即可。


# mkdir -p /RAM1
# mount -t ramfs none /RAM1



預設情況下,Ramfs被限制最多可使用記憶體大小的一半。可以透過maxsize(以kbyte為單位)選項來改變。


# mkdir -p /RAM1
# mount -t ramfs none /RAM1 -o maxsize=10000



以上即建立了一個限定了最大使用記憶體大小為10M的ramdisk。

Tmpfs是一個虛擬記憶體檔案系統,它不同於傳統的用塊裝置形式來實現的ramdisk,也不同於針對實體記憶體的Ramfs。Tmpfs可以使用實體記憶體,也可以使用交換分割槽。在Linux核心中,虛擬記憶體資源由實體記憶體(RAM)和交換分割槽組成,這些資源是由核心中的虛擬記憶體子系統來負責分配和管理。Tmpfs就是和虛擬記憶體子系統來"打交道"的,它向虛擬記憶體子系統請求頁來儲存檔案,它同Linux的其它請求頁的部分一樣,不知道分配給自己的頁是在記憶體中還是在交換分割槽中。Tmpfs同Ramfs一樣,其大小也不是固定的,而是隨著所需要的空間而動態的增減。使用tmpfs,首先你編譯核心時得選擇"虛擬記憶體檔案系統支援(Virtual memory filesystem support)" ,然後就可以載入tmpfs檔案系統了。


# mkdir -p /mnt/tmpfs
# mount tmpfs /mnt/tmpfs -t tmpfs



為了防止tmpfs使用過多的記憶體資源而造成系統的效能下降或當機,可以在載入時指定tmpfs檔案系統大小的最大限制。


# mount tmpfs /mnt/tmpfs -t tmpfs -o size=32m



以上建立的tmpfs檔案系統就規定了其最大的大小為32M。不管是使用ramfs還是tmpfs,必須明白的是,一旦系統重啟,它們中的內容將會丟失。所以那些東西可以放在記憶體檔案系統中得根據系統的具體情況而定。

3.6 使用日誌檔案系統

如果Linux系統由於意外情況而沒有正常關機,則可能引起檔案系統中某些檔案的後設資料(meta-data即和檔案有關的資訊,例如:許可權、所有者以及建立和訪問時間)遭到破壞。檔案系統需要維護檔案的後設資料來保證檔案的可組織和可存取,如果後設資料處於不合理或不一致的狀態,那麼就不能訪問和存取檔案。當系統重新啟動時,fsck將掃描/etc/fstab檔案中所列出的所有檔案系統,確保它們的後設資料處於可用的狀態。如果發現後設資料不一致,fsck將掃描和檢測後設資料,並糾正錯誤。如果檔案系統很大,這個過程將需要很長的時間。為解決這個問題,可以使用日誌檔案系統。日誌檔案系統用獨立的日誌檔案跟蹤磁碟內容的變化,在寫入檔案內容的同時寫入檔案的後設資料。每次修改檔案的後設資料時,都要先向稱為"日誌"的資料結構登記相應的條目。這樣,日誌檔案系統就維護了最近更改的後設資料的記錄。當載入日誌檔案系統時,如果發現了錯誤,不會掃描整個檔案系統的後設資料,而是根據日誌檢查最近被更改的後設資料。所以相對於傳統的檔案系統(如ext2),日誌檔案系統大大地加快了掃描和檢測的時間。

Linux下可用的日誌檔案系統很多,如XFS,JFS,Reiserfs,ext3等等。日誌檔案系統主要被設計為伺服器環境提供出色效能和高可用性。當然, Linux 工作站和家用機器也可從具有高效能的可靠日誌檔案系統中獲益。安裝日誌檔案系統,一般需要下載相應的壓縮包、為核心打補丁、重新配置和重新編譯核心。 詳細的安裝過程可訪問相應檔案系統的官方網站。

4.其它方面的調諧

4.1 調諧buffermem

檔案buffermen和核心虛擬記憶體子系統密切相關。檔案/proc/sys/vm/buffermem控制多大記憶體被用於緩衝區(百分數表示)。核心2.4的預設值為:: "2 10 60"。可以按如下方法修改:


# echo "70 10 60" >/proc/sys/vm/buffermem



並將之加到指令碼檔案/etc/rc.d/rc.local 中。或者在/etc/sysctl.conf檔案中加入


vm.buffermem = 70 10 60



第一個引數 70意味著至少分配70%的記憶體用作緩衝區。後兩個引數保持系統的預設值。第一個引數設定為多大合適,依賴於系統的記憶體大小和系統高負載時記憶體的使用情況(可用free監視)。

4.2 程式限制

Linux對於每個使用者,系統限制其最大程式數。為提高效能,可以設定超級使用者root的最大程式數為無限。編輯.bashrc檔案(vi /root/.bashrc)增加行"ulimit -u unlimited"即可消除超級使用者的程式限制。

核心和系統對使用者程式其它的一些限制也可以透過ulimit命令來檢視和更改。"ulimit -a" 用來顯示當前的各種使用者程式限制。一些更改使用者限制的例子如下:

ulimit -n 4096 將每個程式可以開啟的檔案數目加大到4096,預設為1024
ulimit -m 4096 限制每個程式使用的記憶體數。

4.3 最佳化gcc編譯

將最佳化標誌放在/etc/profile檔案中。在pentium III級的處理器上使用以下最佳化標誌將得到最優的應用程式:


CFLAGS=-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro
-march=pentiumpro -fomit-frame-pointer -fno-exceptions



再將如下行加到/etc/profile 更靠後的位置:


export PATH PS1 HOSTNAME HISTSIZE HISTFILESIZE USER LOGNAME MAIL
INPUTRC CFLAGS LANG LESSCHARSET



使用以上的最佳化,gcc或者egcs編譯的程式將得到最佳的效能。

4.4 編譯核心最佳化

編輯/usr/src/linux/Makefile檔案,可以根據具體的cpu最佳化核心編譯。以下的引數設定將得到最佳化的核心效能。

① vi +18 /usr/src/linux/Makefile ,將HOSTCC =gcc改為 HOSTCC =egcs.
② vi +25 /usr/src/linux/Makefile
將CC =$(CROSS_COMPILE)gcc D__KERNEL__ -I$(HPATH)
改為 CC =$(CROSS_COMPILE)egcs D__KERNEL__ -I$(HPATH).
③ vi +90 /usr/src/linux/Makefile
將CFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
改為CFLAGS = -Wall -Wstrict-prototypes -O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions
④ vi +19 /usr/src/linux/Makefile
將HOSTCFLAGS =-Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
改為HOSTCFLAGS =-Wall -Wstrict-prototypes -O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions


根據以上修改後的makefile檔案重新編譯核心將得到較優的效能。


5. 結束語

Linux是一個靈活而又開放的系統。使用者可以針對具體的應用環境,從系統的外圍到系統的 核心進行調諧。系統的外圍的調諧包括系統硬體的配置到系統安裝和系統服務的最佳化等。系統核心的調諧包括引數的修改和改進系統的原始碼。我們在針對用作db2資料庫伺服器的Linux系統的調諧中,針對db2資料庫的特點,按照本文的各個調諧方面,另外還包括網路的調諧,對系統效能進行了綜合調諧。在對調諧後的系統的綜合測試來看,系統的效能有很大的改進。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/312079/viewspace-245523/,如需轉載,請註明出處,否則將追究法律責任。

相關文章