linux 系統優化

概述

1. “/etc/profile”文件

2. “bdflush”參數

3. “ip_local_port_range”參數

4. “/etc/nsswitch.conf”文件

5. “/proc”文件系統

6. “ulimit”參數


1. “/etc/profile”文件

“etc/profile”文件含有系統大量的環境和啓動程序的配置信息。你在該文件中進行的配置,可以通過申請全局環境變量來實現。因此,在該文件中設置優化標誌,是一種明智的選擇。要想使x86程序獲得最佳性能,可以在編譯時,使用最佳的優化選項-O9 。許多程序的“Makefile”文件中已經含有-O2選項,而-O9使編譯器採用最高級別的優化。儘管它將增加最終程序的大小,但這樣可以獲得更高的運行速度。編譯時,使用“-fomit-frame-pointer”選項,程序運行時,訪問變量時將使用堆棧。但是,使用這一選項,生產的代碼將無法調試。使用“-mcpu=cpu_type”和“-march=cpu_type”選項,Gcc將針對這種型號CPU進行專門的優化,但生成的代碼只能在所指定的CPU或更高系列的CPU上運行。

對於CPU i686或PentiumPro、Pentium II、Pentium III

在“/etc/profile”文件中 , 加入一行:

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

對於CPU i586或Pentium

在“etc/profile”文件中, 加入一行:

CFLAGS=’-O3 -march=pentium -mcpu=pentium -ffast-math -funroll-loops -fomit-frame-pointer -fforce-
mem -fforce-addr -malign-double -fno-exceptions’

對於CPU i486

在“etc/profile”文件中, 加入一行:

CFLAGS=’-O3 -funroll-all-loops -malign-double -mcpu=i486 -march=i486 -fomit-frame-pointer -fno-exceptions’

在進行完以上設置之後,緊接者着把“CFLAGS LANG LESSCHARSET”加入到“etc/profile”文件中的“export”行中:

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

然後,重新登錄,這時,環境變量CFLAGS已經被賦值,編譯器和其它配置工具可以使用它。對Pentium(Pro/II/III)的優化必須使用egcs或pgcc編譯器。Linux的缺省安裝中,已經裝上了egcs,所以無需擔心。

基準測試結果(按體系結構分類):
由於CPU的體系結構和使用的gcc/egcs的版本不同,優化選項也會不同。下面的圖表可以幫助你根據自己的CPU和編譯器,選擇最佳的編譯選項。

Redhat 6.1中安裝的編譯器的版本是egcs 2.91.66,但是,即使你安裝的就是Redhat 6.1,在選擇編譯選項之前也務必檢查一下編譯器的版本.

爲了確認編譯器的版本,使用如下命令:

[root@deep]# egcs --version。

注意:所有的測試結果可以從GCC的主頁:http://egcs.cygnus.com/上檢索到。

現舉例說明:

對於CPU pentium II/III(i686),安裝了egcs-2.91.66,最佳的編譯選項是:

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

對於CPU pentium (i586),安裝了egcs-2.91.66,最佳的編譯選項是:

CFLAGS=’-O3 -march=pentium -mcpu=pentium -ffast-math -funroll-loops -fomit-frame-pointer -fforce-mem -fforce-addr -malign-double -fno-exceptions’

對於 CPU i486,安裝了egcs-2.91.66,最佳的編譯選項是:

CFLAGS=’-O3 -funroll-all-loops -malign-double -mcpu=i486 -march=i486 -fomit-frame-pointer -fno-exceptions’

-funroll-loops選項

對“loop unrolling”進行優化,只對在編譯或運行時循環次數能確定的循環語句有效。

-funroll-all-loops

對“loop unrolling”進行優化,對所有的循環語句有效,擔通常使程序運行變慢。

-ffast-math

該選項使GCC可以不遵從ANSI或IEEE的規則,以獲得運行更快的優化代碼。例如:它允許編譯器假設sqrt()函數的輸入參數非負以及所有的浮點數的值都是NaNs。

-malign-double

GCC把 double, long double, and long long類型變量定界在雙字還是單字邊界上,由該選項控制。double類型變量定界於雙字邊界時,產生的代碼在Pentium機器上可以運行得更快一些,但是會佔用更多的內存。

-mcpu=cpu_type

設定在生成指令時缺省的機器和CPU類型,設定好某一特定的CPU類型後,編譯器將針對這種芯片產生相應的指令,如果不使用“-march= cpu_type”選項,編譯器不會產生任何不能在i386上運行的代碼。“i586”等價於“pentium”,“i686”等價於 “pentiumpro”,“k6”指明是使用AMD的芯片而非Intel系列。

-march=cpu_type

爲指定類型的機器和CPU產生指令。這裏的CPU類型與“-mcpu”中列出的相同。而且,使用本選項已經隱含了“-mcpu=cpu_type”選項。

-fforce-mem

對於涉及內存操作的運算,強制把操作數拷貝到寄存器中。這是通過把所有的內存引用轉換成潛在的普通子表達式,以獲得優化代碼。如果,這些內存引用不是普通子表達式,可以通過指令的組合,消除單獨的寄存器裝載。

-fforce-addr

運算前把內存地址常數拷貝到寄存器中。所產生的優化代碼與選項“-fforce-mem”類似。

-fomit-frame-pointer

對於不必要的框架指針(frame pointer),不在寄存器中保存。這就避免了相應的用於保存、設置和恢復框架指針所需的指令;這樣,許多函數中可以使用額外的寄存器。但是,這一選項使得在大多數機器上無法進行調試。

注意:本書將要討論的所有優化,缺省都是針對Pentium II/III 系列CPU。因此,如有必要,對於某些專門的CPU需要調整編譯參數。

2. “bdflush”參數

下文討論目錄“/proc/sys/vm”下的系統控制文件,且只在Linux內核版本2.2下有效。控制該目錄下的文件,可以調整Linux內核子系統--虛擬內存(VM)的行爲,其中bdflush文件對於硬盤使用有一定影響。該文件控制了bdflush內核守護進程的行爲。我們通常使用以下命令來提高文件系統的性能:

echo "100 1200 128 512 15 5000 500 1884 2">/proc/sys/vm/bdflush

修改某些值,可以使系統響應更快,例如:可以使系統在寫入硬盤之前等待更長時間,從而避免了一些硬盤訪問的衝突。

把該命令加入文件“etc/rc.d/rc.local”之中,每次重新啓動機器時,就不必再次手工敲入這條命令了。

如果需要進一步理解如何改進有關虛擬內存、硬盤緩衝和交換空間(swap)的內核參數,可以參照“/usr/src/linux/Documentation/sysctl/vm.txt”。

3. “ip_local_port_range”參數

下文討論目錄“/proc/sys/net/ipv4/ip_local_port_range”下的系統控制文件,且只在Linux內核版本2.2下有效。

“ip_local_port_range”文件中有兩個參數分別定義了用作TCP和UDP本地端口的端口範圍。第一個參數是第一個端口號。第二個參數是最後一個本地端口號。對於使用率很高的系統,可以修改爲:32768到61000。

echo *32768 61000* > /proc/sys/net/ipv4/ip_local_port_range

把該命令加入文件“/etc/rc.d/rc.local”之中,每次重新啓動機器時,就不必再次手工敲入這條命令了。

4. “/etc/nsswitch.conf”文件

“etc/nsswitch.conf”文件定義了系統使用哪些服務來解析主機名、獲得口令文件和組文件(group file)。我們的系統中由於沒有使用NIS服務,因此口令文件和組文件我們沒有使用。這裏,我們只討論該文件中的hosts這一行。

編輯“nsswitch.conf”文件(vi /etc/nsswitch.conf),把host一行改爲:

"hosts: dns files"

含義:當請求解析地址時,首先訪問DNS服務器,如果DNS服務器沒有響應,則使用“/etc/hosts”文件。

我建議把該文件中每一行中的NIS都刪掉。當然,如果你一定要使用NIS,就不能刪掉NIS。最後,這個文件會是這樣:

passwd: files
shadow: files
group: files
hosts: dns files
bootparams: files
ethers: files
netmasks: files
networks: files
protocols: files
rpc: files
services: files
automount: files
aliases: files

5. “/proc”文件系統

下文討論目錄“proc/sys/fs”下的系統控制文件,且只在Linux內核版本2.2下有效。該目錄下的文件可以用來調整和監測Linux內核的一些行爲。對這些文件的誤操作可能攪亂系統,因此在實際調整系統之前,最好把文檔和源代碼都讀一下。

適當的增加“/proc/sys/fs/file-max”的值:每4M內存對應256,例如:內存爲128M的機器,該值可以設爲8192(128/4 =32 32*256=8192)。同理,可以增加“/proc/sys/fs/inode-max”的值,使其值爲打開文件數目的3到4倍(8192*4= 32768)。這是因爲:i節點的數目至少等於打開的文件數,一般而言,對於大文件,i節點數遠大於打開的文件數目。

用於改變/proc目錄及其子目錄下的任意參數的常用命令是(必須以root登錄): echo “新的參數值”> “/proc/所需更改的文件”,對於上面所涉及的修改,其命令爲:

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

上文所討論的方法修改了內核源代碼的常數。但是,在新的內核源代碼樹中並不能起作用,因此還不能算是最好的方法。最好的一種方法是把上述命令加入文件“etc/rc.d/rc.local”之中。在該文件的最後加入以下兩行(假設系統有128M內存):

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

其中的數值因系統不同,差異很大,應該根據各自系統,按照上述的公式計算。一臺文件服務器或WEB服務器需要打開的文件數目就很大,而用於數值的服務器該數值就較小。

對於內存非常多的系統,特別是512M或更多內存的系統,打開的文件數和i節點數最好不要超過50,000和150,000。

“file-max”參數是指Linux內核可以分配的文件句柄的最大數目。當系統經常報錯:文件句柄不夠時,就需要適當增大該參數的值。系統缺省值爲:4096。

“inode-max”參數是指系統i節點句柄的最大數目。其值應該是file-max值的3到4倍。因爲標準輸入輸出文件和網絡套接字都要使用i節點來進行處理。如果系統經常性的出現i節點被耗盡的情況,就需要增大其值。

6. “ulimit”參數

Linux本身對每個用戶擁有的最大進程數有限制。可以在用戶根目錄下的“.bashrc”文件或者實際使用與“.bashrc”功能相當的shell的腳本中加入這種限制。編輯“.bashrc”文件(例如:vi /root/.bashrc)並加入下面一行:

ulimit -u unlimited

然後退出,重新登錄。爲了驗證,可以以root身份登錄,然後鍵入: “ulimit –a”,在最大用戶進程數一項中應該顯示“unlimited”,例如:

[root@deep]# ulimit -a
core file size (blocks) 1000000
data seg size (kbytes) unlimited
file size (blocks) unlimited
max memory size (kbytes) unlimited
stack size (kbytes) 8192
cpu time (seconds) unlimited
max user processes unlimited * this line.
pipe size (512 bytes) 8
open files 1024
virtual memory (kbytes) 2105343

注意:你可能更傾向於在命令行鍵入“unlimit –u”而不是把它加入到文件“/root/.bashrc”中。但爲保險起見,建議還是把它加入文件“/root/.bashrc”中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章