歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

LINUX系統性能調諧

介紹: 鄧延軍    本文從磁盤,文件及文件系統,內存和編譯等方面詳細的講述了如何對Linux系統性能進行調諧。不管是Linux服務器還是客戶機或者用戶單機,按照本文提供的調諧方法,均可不同程度地改善Linux系統的性能。  1. 引言    實踐證明Linux是高性能、穩定可靠而又相當靈活的操作系統,近年來,世界上許多大軟件公司紛紛推出各種Linux服務器系統及Linux下的應用軟件。目前,Linux已可以與各種傳統的商業操作系統分庭抗禮,在服務器市場,占據了相當大的份額。Linux的服務器系統多種多樣,可用作web服務器,郵件服務器,FTP服務器,文件服務器以及數據庫服務器等等。針對不同的系統以及具體的應用環境,可以對Linux的性能進行相應的調諧。下面分別從磁盤調諧,文件系統,內存管理以及編譯優化等方面來論述Linux系統的優化調諧策略。    2.磁盤調諧    2.1 優化的分區    在安裝Linux系統之初,就應該考慮怎樣使linux系統得到最好的性能。在Linux系統中,我們可以自由地組織磁盤分區。一個優化的分區策略,可以很好地改進Linux系統的性能,減少磁盤碎片,提高磁盤I/O能力。    根據磁盤的特點,我們知道越是靠磁盤外部的柱面,旋轉越快,而且每次旋轉時,磁盤讀寫頭可以覆蓋較多的區域,也就意味著靠外部的柱面可以得到較好的性能。所以在分區時,我們應該考慮將訪問頻率高的,對系統性能影響相對較大的分區置於磁盤的靠外部分。同時,為了減少磁盤碎片,應將內容經常改變的目錄放在單獨的分區。從方便備份數據的角度考慮,因為很多備份工具對整個分區進行備份的效率要高,所以我們應將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數據庫的特點,按照本文的各個調諧方面,另外還包括網絡的調諧,對系統性能進行了綜合調諧。在對調諧後的系統的綜合測試來看,系統的性能有很大的改進。    參考資料:    Gerhard Mourani . Securing and Optimizing Linux[M] , OpenNA Inc, May 2001   Daniel Robbins, Advanced filesystem implementor's guide[J/OL], www-106.ibm.com/developerworks/library   Fergus Donohue . System Tuning Info for Linux Servers[R] , people.redhat.com/alikins   Moshe Bar, Linux 技術內幕[M], 清華大學出版社,2001     




 



Copyright © Linux教程網 All Rights Reserved