FreeBSD下的系統性能調優
SYSTEM SETUP - DISKLABEL,NEWFS,TUNEFS,SWAP
當用disklabel(8)在你的硬盤上布局文件系統時,重要的是要記住硬盤在傳送
數據時外磁道比內磁道快。為了利用這個特點,你應該把較小的文件系統和交
換區靠近外磁道,隨后是較大的文件系統,最后是最大的文件系統。還有重要
的是把標準文件系統大小確定在當你要增加這臺機器負荷時也不需要重定他
們的大小。我經常建立的文件系統的次序是128M的root,1G的swap,128M的
/var/tmp,3G的/usr,其余的空間留給/home。
典型地,你應該把交換區大小定為2倍的內存大小。如果你沒有很多內存,那樣
的話,你將需要更多的交換區空間。不建議將交換區定在小于256M,當你確定
交換區大小的時候,你要考慮到將來可能要擴充內存。內核的VM(虛擬內存)換頁
算法性能是準對交換區至少是內存大小2倍的條件進行優化的。配置太小的交換
區會導致VM頁面掃描的低效率,當內存擴充后,隨之也會導致問題。最后在一個
有多個SCSI硬盤的大系統上(或者有多個IDE磁盤工作在多個IDE 控制器上),
我們強烈建議在每個驅動器上配置交換分區,每個交換分區的大小應該是幾乎
一樣的,內核能處理任意大小的交換區,但是內部數據結構放大到最大分區的4
倍大小。保持交換分區同樣的大小允許內核優化地將交換空間交叉分布在N個
磁盤上。不要擔心這樣做有點過份,交換區是UNIX的救星,甚至于你雖然通常不用
那么多交換區,在被迫重新啟動之前,它也可以給你時間去從一個出軌的程序中
把系統恢復過來。
怎樣為你的/var分區定大小主要依賴于你將怎樣使用這臺機器。這個分區主要
存放郵箱,打印緩沖區和日志文件。有些人甚至于把/var/log作為一個獨立的
分區(但是除非有特別的情況,這樣做不值得,只會浪費一個分區ID)。如果你這
臺機器主要用做郵件或打印服務器,或者運行一個大訪問量的WEB服務器,你應
該考慮把這個分區建的更大一點,可能1G或更多。很容易低估日志文件的存儲需
求。
確定/var/tmp的大小依賴于你將需要怎樣使用你的臨時文件。128M是建議的最
小的尺寸。注意sysinstall將建立一個/tmp目錄,但是通常把/tmp作為/var/tmp
的連接是個好注意。為臨時文件建立一個分區有兩個重要的原因: 首先,它減少
了系統崩潰后文件系統損壞的可能性,再就是減少一個出軌程序填滿[/var]/tmp
時影響其他重要子系統(mail,logging等等)的機會。填滿[/var]/tmp是經常發
生的問題。
在以前/tmp和/var/tmp是不同的東西,但是引入/var(和/var/tmp)是被程序員
引起的大迷惑,今天的程序間或使用一個或另一個,它們兩者變的沒有區別。
所以把它們變成一個臨時目錄是有道理的.然而,當你處理/tmp時,有一件事
情是你不想做的,就是把/tmp駐留在根分區上,導致根分區被填滿或崩潰后重
啟時文件系統損壞.
/usr分區存放大量用于支持系統的文件,子目錄/usr/local存放大量從ports(7)
安裝的文件.如果你不那么多使用ports,也不將系統源代碼(/usr/src)存放在
機器上,你可以為/usr節省1G的磁盤空間.相反,如果你安裝大量的ports(特
別是窗口管理和Linux仿真)建議你至少2G的/usr,如果你還要將系統源代碼放
在機器上,我們建議你3G的/usr,不要低估所需的空間,它會慢慢爬起來,讓你
大吃一驚.
/home分區存放用戶自己的數據,我通常把余下的空間留給這個分區.
為什么要分區? 為什么不建一個大的/分區就行了? 那樣我就不需要考慮分區大
小問題。有幾個原因顯示這不是個好注意。首先,每個分區都有不同的操作特征,
分開它們有利于文件系統準對這些特征調整它自己.例如,根和/usr分區主要是
讀操作,只有少量的寫,而大量的讀和寫可以發生在/var在/var/tmp。把小的但
是具有更繁忙的寫操作的分區分開,就不會影響讀操作居多的分區.再就是,把
寫操作居多的分區靠近磁盤外側(例如,不是在一個大分區前,而是分區表后)有
利于對你經常需要的分區增加性能。你可能也需要在大分區中的I/O性能,但是
它們是那樣的大以至于把它們移到磁盤外側也不會顯著增加性能,但是把/var移
到磁盤外側會有顯著的不同.
正確分區你的系統允許你調整newfs(8)和tunefs(8)的參數。調整newfs(8)需要更
多的經驗,但是會帶來顯著的性能提高。有三個參數可以相對安全的調整:
blocksize(塊尺寸),bytes/inode(每i節點字節數)和cylinders/group(每組柱面
數).
當塊尺寸是8K或16K時,FreeBSD運行的最好.缺省的文件系統塊尺寸是8K。對于
一個大的分區使用16K塊尺寸是個好注意.這同樣需要你指定碎片(Fragment)大小。
我們建議碎片總是塊大小的1/8(其他的碎片尺寸測的不多)。newfs(8)選項是
newfs -f 2048 -b 16384。。。。使用更大的塊尺寸將導致緩沖區碎塊,降低性能.
如果大分區主要趨向于使用少量的大文件,例如數據庫文件。你可以增加
bytes/inode比例,它減少該分區的i節點的數量(最大可被建立的文件和目錄數量
)。減少文件系統i節點數量可以大大減少fsck(8)在系統崩潰后恢復的時間。不要
使用這個選項,除非你確實在這個分區存放大文件.如果你過度這樣做,你可能
會被文件系統依然有大量的空間而不能創建文件的事情所困擾。使用32768,
65536或262144 bytes/inode是建議的值。你可以調的更高,但是那只影響fsck的
恢復時間.例如,newfs -i 32768...
最后,增加cylinders/group比例可把i節點間距放的更近。這樣可以增加目錄性能
和減少fsck的是時間.如果你使用這個選項,我建議最大化。使用newfs -c999,
然后newfs報錯會告訴你最大可能的值.
tunefs(8)可以進一步調整文件系統。這個命令可以運行在單用戶方式而不用重
新格式化文件系統。然而,這個程序可能是系統中最容易被濫用的程序。許多人
企圖通過把最小自由空間百份比設置為0來增加可使用的文件系統空間,這可
導致嚴重的文件系統碎片,我們不建議這樣做。實際上唯一值得使用的tunefs
選項是使用tunefs -n enable /filesystem 打開softupdates開關(注意:在5.x中,
可以用newfs -U選項打開)。softupdates戲劇性地提高meta-data的性能,主要
是文件創建和刪除。我們建議對所有的文件系統都打開softupdates開關。
softupdates有兩個副作用你必須知道: 首先softupdats保證當系統崩潰時文件
系統狀態的一致性的,但是更新磁盤可能要延時幾秒種。如果系統崩潰,可能
丟失更多的數據。第二,softupdates延時文件系統自由塊的釋放,如果你的文
件系統將要滿了(例如,根文件系統),對系統做一次升級,例如,make insta-
llworld,可能導致空間不夠而失?。?
大量的運行時mount選項可以幫你調整系統。最明顯最危險的是async。不要嘗試
使用它,這太危險了.一個危險性更少但是很有用的選項是noatime。UNIX文件
系統通常更新文件或目錄的最近存取時間,這個操作在FreeBSD內部被延時寫處
理,通常不會成為系統的負擔.如果你的系統連續存取巨量的文件,緩沖區會被
更新atime而弄臟變的緊張,成為系統負擔.
例如,你正在運行一個高負載的web服務器,或者一個有大量讀者的news服務器,
你可以考慮在大分區上關掉atime更新的mount選項.不要無理由的在任何地方關
掉atime更新選項,例如,你最好在那些以讀居多的分區上保持打開這個選項,
例如/和/usr。(特別是/,因為很多系統工具使用atime字段報告系統狀況)。
STRIPING DISKS
在一個更大的系統上,你可能把一個分區分布(strip)到幾個驅動器上去以建立
一個更大的分區。striping可以通過把操作分開到不同的磁盤上去而提高文件
系統性能。vinum(8)和clearcase/" target="_blank" >ccd(4)可以建立strip化的文件系統。通常的說,strip
化一個小的分區例如根和/var/tmp或以讀居多的分區例如/usr是徹底浪費時間。
你應該strip化那些需要嚴重的I/O性能的分區,典型的是/var,/home和定制的
用來存放數據庫和web頁的分區。選擇正確的strip尺寸是同樣重要的。文件系
統企圖把meta-data放在2的倍數邊界上,你總是希望減少查找而不是增加查找。
這意味著你要使用大的離心strip大小例如1152個扇區,使得順序I/O不用查找
幾個磁盤而meta-data將分布在不同的磁盤上而不是集中在一個磁盤上。如果
你真的很老練,我們建議你使用FreeBSD支持的控制器列表中的真正的硬件raid
控制器。
SYSCTL TUNING
在系統中有幾百個sysctl(8)變量,包括那些看起來可以調整但是實際上不是
的那些。在這個文檔中我們將只是涵蓋那些會最大地影響系統的sysctl。
kern.ipc.shm_use_phys缺省是0,可以被設置成0(off)或1。把它設置1引起
SysV共享內存段被映射到不可交換的物理內存上。這個功能只影響那些或者
(A)映射少量內存并在很多進程間共享或(B)映射大量內存并在任意數量的進
程間共享內存的情況。這個功能允許內核通過將共享內存頁鎖定在核心存儲
中而消除大量的內部內存管理和頁面跟蹤的開銷,使得它們不可被換出。
vfs。vmiodirenable缺省是0(不久將改為1)可以設置為0(off)或1(on)。這個
參數控制目錄怎樣被緩存。大多數目錄是小的而且只使用在文件系統中的一
個碎塊(典型的是1K)甚至在緩沖區中更小(典型的是512字節)。然而,在缺省
的操作模式中,緩沖取只緩沖固定數量的目錄哪怕你有巨量內存。把這個
sysctl打開就允許緩沖區利用虛擬內存頁緩沖來緩沖目錄。這樣做的一個缺
點是最少也要用去一個物理頁面(典型的是4K)而不是512字節。如果正在你正
在運行一個需要操作大量文件的服務,我們建議你打開這個選項。這些服務
包括web頁緩沖,大mail系統,news系統。打開這個選項通常情況下不會導致
性能下降哪怕甚至內存浪費,但是你要嘗試去發現。
有幾個和buffer-cache及VM page cache相關的sysctl。我們不建議去弄亂
它們。從FreeBSD 4.3開始,VM 子系統能很好的對自己做調整。
如果你在運行面向網絡的應用.net.inet.tcp.sendspace和net.inet.tcp.
recvspace是特別令人感興趣sysctl。它們控制任何一個tcp連接允許的發送
和接收緩沖區的大小。缺省是16K。通過增加缺省值犧牲更多內核內存你總能
夠獲得更高的帶寬利用率。如果你正在服務成百上千個連接,我們不建議你
增加缺省值,因為那樣很容易因為滯留的連接累積起來后用完內存。
但是如果你需要高帶寬甚于更少的連接數量,特別是你有千兆以太網,增加
缺省值將會得到完全不同的結果。你可以分開調整接收和發送緩沖區的大小。
例如,如果你的機器主要是做web服務的,那么你可以減少接收緩沖區的大小
用來增加發送緩沖區的大小而不用吃掉更多的內核內存。注意路由表(參見
route(8))能用于與路由相關的發送和接收緩沖去的缺省大小。另外一
個工具是你能用防火墻規則中的管道(pipe)限制從某個IP地址或端口區出去
或進來的流量。
例如,如果你有T1線路,你可能想要限制web流量為整個T1線路的70%而把余
下的帶寬留給mail和交互方式的使用。通常一個被繁忙地訪問的web服務器
不會顯著的增加對其他服務的時延,但是強制這個限制能使事情更加光滑導
致更長時間的穩定。為了確信不使用太多的帶寬,許多人也人為地強制帶寬
限制。
除非雙方主機支持TCP的窗口伸縮擴展,把TCP發送和接收緩沖區定為大于65535
將導致魔術般的性能提升,窗口伸縮由net.inet.tcp.rfc1323控制。這個
擴展應該被使能并且為了在一些網絡鏈路上獲得好的性能,TCP緩沖區大小
應該設置為大于65536,特別是千兆廣域網和高時延的衛星鏈路。
我們建議你打開這個開關(設置為1)并且讓net.inet.tcp.always_keepalive
也設置為1。缺省是off的。這增加了一些網絡帶寬的使用,但是一些死掉的
連接最終能被識別并清除。死的TCP連接是被撥號用戶存取的系統的一個特別
的問題,因為用戶經常斷開modem而不正確的關閉活動的連接。
kern.ipc.somaxconn限制接收TCP連接的偵聽隊列(listen queue)的大小。缺省
是128,這對在一個繁忙的web服務器環境中可靠的處理新的連接來說太小了。
在那樣的環境中,我們建議增加這個值調到1024或更高。服務進程可能自己限
制偵聽隊列的長度(例如sendmail(8),apache)但是總會有一個配置項在配置文件
中允許你調整隊列的大小。大的偵聽隊列也能更好的抵擋DOS攻擊。
kern.maxfiles決定系統支持打開多少個文件。缺省的是幾千個但如果你在運行
數據庫或大的很吃描述符的進程可以把它設到1萬或2萬個。
vm.swap_idle_enabled在大的多用戶系統中是很有用的,那里有大量的用戶進
入和離開系統而且有大量的空閑進程。那種系統趨勢是對于空閑內存的保留上產
生大量持續的壓力。打開這個功能調整換出(空閑秒數)。通過vm.swap_idle_
threhold1和vm.swap_idle_threshold2允許你以比普通換出算法更快的速度降
低與空閑進程聯系著的頁面的優先級。這等于幫了換出守護進程(pageout
daemon)一把。不要打開這個選項,除非你需要它,因為你在做的交易是預先
而不是后來吃掉更多的交換空間和磁盤帶寬。在一個小系統上這個選項有影響
而在一個已經發生換頁的大系統上這個選項允許VM系統更加容易地把整個進程
換出或換如內存。
BOOT-TIME SYSCTL TUNING
有些sysctl在運行時是不能調整的因為內存申請必須在引導的早期進行。要改
變這些sysctl,你必須把這些值放在loader.conf(5)并且重新啟動系統。
kern.maxusers缺省值是難以相信的低。對于現在大多數機器,你可能需要增
加這個值到64,128或256。我們不建議你超過256除非你需要一個巨大的文件
描述符數量。網絡緩沖區也將被影響但是可以由另外的內核選項來控制。不要
只是使用maxusers來增加網絡mbuf。比FreeBSD4.4舊的系統沒有這個sysctl需
要使用內核配置選項maxusers來設置。
kern.ipc.nmbclusters可以調整用來增加系統愿意申請的網絡mbuf的數量。每
個cluster(簇)大概2K的內存,所以值1024代表保留2M內核內存作為網絡緩沖區。
你可以簡單的計算出需要多少。如果你有一個web服務器最多可以有1000個并發
連接,每個連接吃掉16K接收和發送緩沖區,你大概需要32MB的網絡緩沖區來對
付它。一個比較粗糙的方法是乘以2,所以32MBx2 = 64MB/2K = 32768。所以這
個情況下你將需要設置nmbclusters到32768。我們建議為那些內存不多的機器
設置1024到4096而4096到32768為那些有很多內存的機器。無論如何如何你不能
設置一個很隨意的值,這可能導致啟動時崩潰。netstat(1)的-m選項可以用來查
看網絡緩沖區的使用情況。老的FreeBSD系統沒有這個sysctl,所以需要設置內核
配置選項NMBCLUSTERS。
越來越多的程序正在使用sendfile()系統調用通過網絡傳送文件。
kern.ipc.nsfbufs用來控制sendfile()可以使用的多少文件系統緩沖區數量來
進行工作。這個參數名義上隨maxusers伸縮,所以你不應該去弄亂這個參數,
除非在非常特殊的場合。
KERNEL CONFIG TUNING
在一個大系統中有大量的內核選項你可能需要擺弄。為了改變這些選項你需要從
源代碼編譯內核。config(8)和手冊是學習怎樣做這件事情的好起點。通常建立
你自己的定制的內核的第一件事情是去掉所有你不用的驅動程序和服務。刪除
象INET6和你不用的驅動程序可以減少內核的大小,有時候能達1兆或幾兆,留
出更多的內存給應用程序。
SCSI_DELAY和IDE_DELAY可用于減少系統啟動時間。缺省值相當高,在啟動時可
引起15秒以上的延時。減少SCSI_DELAY到5秒通常是可行的。減少IDE_DELAY也是
行的但是你必須更小心點。
有很多*_CPU的選項你可以注釋掉。如果你想讓內核只能在奔騰類CPU上運行,
你可以輕松的拿掉I386_CPU和I486_CPU,如果你相信你CPU可以被認作奔騰2或
更好的CPU,你可以拿掉I586_CPU。有些clone可能被認作奔騰或486,沒有這
些選項將不能啟動。如果它能工作,真是太偉大了! 操作系統將能更好地使用
高端CPU的的MMU功能,任務切換,記時,甚至設備操作。另外,高端CPU支持
4MB MMU頁面,內核用來將自己影射到內存中,在重負荷的系統調用下這會增
加性能。
IDE WRITE CACHE
FreeBSD 4.3不認真考慮地將IDE寫緩存關閉。這降低了到IDE磁盤的寫盤帶寬,
但是考慮到硬盤廠商引入的嚴重的數據一致性問題而言是必要的?;締栴}是
IDE驅動器在寫完成上說謊。當IDE寫緩沖打開時,IDE硬盤不僅不會按次序將
數據寫入磁盤,而且在嚴重的磁盤負荷下有時會永遠耽擱有些數據塊。當系統
崩潰或掉電時會導致嚴重的文件系統損壞。所以我們的缺省值是安全的。不幸
的是結果是巨大的性能損失,我們投降了并在發行后把缺省值改了過來。你
應該通過查看hw.ata.wc這個sysctl來檢查你系統上的缺省值。如果IDE寫緩沖
是關閉的,你可以將通過將hw.ata.wc內核變量設置為1而將它改回來。這必須
在boot loader(8)啟動時做。企圖在內核啟動后在做是沒有作用的。請參見
ata(4)和loader(8)。
還有IDE硬盤的一個試驗性的功能叫做hw.ata.tags(也能夠在boot loader中設
置)允許寫緩沖被安全地打開。這是將SCSI的tagging功能帶到IDE驅動器上。
寫這篇文章時只有IBM的DPTA和DTLA驅動器支持這個功能。警告!這些驅動器
明顯有質量控制方面的問題,所以我建議你不要在這個時候買。如果你需要性
能,選用SCSI吧。
CPU,MEMORY,DISK,NETWORK
做何種調整依賴于你的系統在負載變大時哪一部分開始成為瓶頸。如果你的系統
用完了CPU(空閑時間為0%)那你需要升級CPU或轉移到SMP的主板(多CPU),或者
你需要重新回顧你那個引起負荷的程序并試著優化它。如果系統正有大量的頁面
交換,需要考慮增加內存。如果系統真讓磁盤滿載通常能看到高CPU idle值和滿載
的磁盤。systat(1)可用于監視這個情況。對付磁盤滿載有很多種方法:增加內存
用于緩沖,鏡象磁盤,把操作分到不同的機器等等。如果磁盤性能是個問題而且
正在使用IDE硬盤,切換到SCSI能幫大忙?,F代IDE驅動器與SCSI在低級順序帶寬
上比較時,當你開始尋找,SCSI驅動器通常會贏。
最后,你可能用完了網絡帶寬。提高網絡性能的第一道防線用switch替換hub,特
別是今天switch和hub一樣便宜。hub由于沖突補償在重負載下有嚴重問題,一個
壞主機會嚴重影響整個LAN。第二是盡可能優化網絡路徑。例如,在firewall(7)中
我們描述了一個保護內部主機的拓撲結構,外部可視主機不通過它路由。按照你的
需要,使用100BaseT而不是10BaseT,或使用1000BaseT而不是100BaseT。許多瓶頸
發生在廣域網連接上(例如mode,T1,DSL等)。如果要擴展鏈路是不可能的,可以
使用dummynet(4)功能實現流量限制以阻止高負載服務(例如web服務)影響其他服務
(例如email服務),或正好相反。在家庭安裝中,可以讓交互式的傳輸的優先級高于
你輸出的其他服務(web服務,email等)。
原文轉自:http://www.anti-gravitydesign.com