歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> FreeBSD下的系統性能調優

FreeBSD下的系統性能調優

日期:2017/2/28 11:16:21   编辑:關於Unix


SYSTEM SETUP-DISK LABEL,NEWFS,TUNE FS,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-f2048-b16384。。。。使用更大的塊尺寸將導致緩沖區碎塊,降低性能.如果大分區主要趨向於使用少量的大文件,例如數據庫文件。你可以增加 bytes/inode比例,它減少該分區的i節點的數量(最大可被建立的文件和目錄數量 )。減少文件系統i節點數量可以大大減少fsck(8)在系統崩潰後恢復的時間。不要使用這個選項,除非你確實在這個分區存放大文件.如果你過度這樣做,你可能會被文件系統依然有大量的空間而不能創建文件的事情所困擾。使用32768, 65536或262144bytes/inode是建議的值。你可以調的更高,但是那只影響fsck的恢復時間.例如,newfs-i32768...
最後,增加cylinders/group比例可把i節點間距放的更近。這樣可以增加目錄性能和減少fsck的是時間.如果你使用這個選項,我建議最大化。使用newfs-c999,然後newfs報錯會告訴你最大可能的值.
tunefs(8)可以進一步調整文件系統。這個命令可以運行在單用戶方式而不用重新格式化文件系統。然而,這個程序可能是系統中最容易被濫用的程序。許多人企圖通過把最小自由空間百份比設置為0來增加可使用的文件系統空間,這可導致嚴重的文件系統碎片,我們不建議這樣做。實際上唯一值得使用的tunefs 選項是使用tunefs-nenable/filesystem打開softupdates開關(注意:在5.x中,可以用newfs-U選項打開)。softupdates戲劇性地提高meta-data的性能,主要是文件創建和刪除。我們建議對所有的文件系統都打開softupdates開關。 softupdates有兩個副作用你必須知道:首先softupdats保證當系統崩潰時文件系統狀態的一致性的,但是更新磁盤可能要延時幾秒種。如果系統崩潰,可能丟失更多的數據。第二,softupdates延時文件系統自由塊的釋放,如果你的文件系統將要滿了(例如,根文件系統),對系統做一次升級,例如,makeinsta- llworld,可能導致空間不夠而失敗.
大量的運行時mount選項可以幫你調整系統。最明顯最危險的是async。不要嘗試使用它,這太危險了.一個危險性更少但是很有用的選項是noatime。UNIX文件系統通常更新文件或目錄的最近存取時間,這個操作在FreeBSD內部被延時寫處理,通常不會成為系統的負擔.如果你的系統連續存取巨量的文件,緩沖區會被更新atime而弄髒變的緊張,成為系統負擔.
例如,你正在運行一個高負載的web服務器,或者一個有大量讀者的news服務器,你可以考慮在大分區上關掉atime更新的mount選項.不要無理由的在任何地方關掉atime更新選項,例如,你最好在那些以讀居多的分區上保持打開這個選項,例如/和/usr。(特別是/,因為很多系統工具使用atime字段報告系統狀況)。
STRIPING DISKS
在一個更大的系統上,你可能把一個分區分布(strip)到幾個驅動器上去以建立一個更大的分區。striping可以通過把操作分開到不同的磁盤上去而提高文件系統性能。vinum(8)和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及VMpagecache相關的sysctl。我們不建議去弄亂它們。從FreeBSD4.3開始,VM子系統能很好的對自己做調整。
例如,如果你有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.maxfiles決定系統支持打開多少個文件。缺省的是幾千個但如果你在運行數據庫或大的很吃描述符的進程可以把它設到1萬或2萬個。
vm.swap_idle_enabled在大的多用戶系統中是很有用的,那裡有大量的用戶進入和離開系統而且有大量的空閒進程。那種系統趨勢是對於空閒內存的保留上產生大量持續的壓力。打開這個功能調整換出(空閒秒數)。通過vm.swap_idle_ threhold1和vm.swap_idle_threshold2允許你以比普通換出算法更快的速度降低與空閒進程聯系著的頁面的優先級。這等於幫了換出守護進程(pageout daemon)一把。不要打開這個選項,除非你需要它,因為你在做的交易是預先而不是後來吃掉更多的交換空間和磁盤帶寬。在一個小系統上這個選項有影響而在一個已經發生換頁的大系統上這個選項允許VM系統更加容易地把整個進程換出或換如內存。
BOOT-TIME SYSCTL TUNING
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支持 4MBMMU頁面,內核用來將自己影射到內存中,在重負荷的系統調用下這會增加性能。
IDE WRITECACHE
FreeBSD4.3不認真考慮地將IDE寫緩存關閉。這降低了到IDE磁盤的寫盤帶寬,但是考慮到硬盤廠商引入的嚴重的數據一致性問題而言是必要的。基本問題是 IDE驅動器在寫完成上說謊。當IDE寫緩沖打開時,IDE硬盤不僅不會按次序將數據寫入磁盤,而且在嚴重的磁盤負荷下有時會永遠耽擱有些數據塊。當系統崩潰或掉電時會導致嚴重的文件系統損壞。所以我們的缺省值是安全的。不幸的是結果是巨大的性能損失,我們投降了並在發行後把缺省值改了過來。你應該通過查看hw.ata.wc這個sysctl來檢查你系統上的缺省值。如果IDE寫緩沖是關閉的,你可以將通過將hw.ata.wc內核變量設置為1而將它改回來。這必須在bootloader(8)啟動時做。企圖在內核啟動後在做是沒有作用的。請參見 ata(4)和loader(8)。
還有IDE硬盤的一個試驗性的功能叫做hw.ata.tags(也能夠在bootloader中設置)允許寫緩沖被安全地打開。這是將SCSI的tagging功能帶到IDE驅動器上。寫這篇文章時只有IBM的DPTA和DTLA驅動器支持這個功能。警告!這些驅動器明顯有質量控制方面的問題,所以我建議你不要在這個時候買。如果你需要性能,選用SCSI吧。
CPU,MEMORY,DISK,NETWORK
做何種調整依賴於你的系統在負載變大時哪一部分開始成為瓶頸。如果你的系統用完了CPU(空閒時間為0%)那你需要升級CPU或轉移到SMP的主板(多CPU),或者你需要重新回顧你那個引起負荷的程序並試著優化它。如果系統正有大量的頁面交換,需要考慮增加內存。如果系統真讓磁盤滿載通常能看到高CPUidle值和滿載的磁盤。systat(1)可用於監視這個情況。對付磁盤滿載有很多種方法:增加內存用於緩沖,鏡象磁盤,把操作分到不同的機器等等。如果磁盤性能是個問題而且正在使用IDE硬盤,切換到SCSI能幫大忙。現代IDE驅動器與SCSI在低級順序帶寬上比較時,當你開始尋找,SCSI驅動器通常會贏。
最後,你可能用完了網絡帶寬。提高網絡性能的第一道防線用switch替換hub,特別是今天switch和hub一樣便宜。hub由於沖突補償在重負載下有嚴重問題,一個壞主機會嚴重影響整個LAN。第二是盡可能優化網絡路徑。例如,在firewall(7)中我們描述了一個保護內部主機的拓撲結構,外部可視主機不通過它路由。按照你的需要,使用100BaseT而不是10BaseT,或使用1000BaseT而不是100BaseT。許多瓶頸發生在廣域網連接上(例如mode,T1,DSL等)。如果要擴展鏈路是不可能的,可以使用dummynet(4)功能實現流量限制以阻止高負載服務(例如web服務)影響其他服務 (例如email服務),或正好相反。在家庭安裝中,可以讓交互式的傳輸的優先級高於你輸出的其他服務(web服務,email等)。
Copyright © Linux教程網 All Rights Reserved