萬盛學電腦網

 萬盛學電腦網 >> FreeBSD介紹 >> FreeBSD下的系統性能調優

FreeBSD下的系統性能調優

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子系統能很好的對自己做調整。
如果你在運行面向網絡的應用,net.inet.tcp.sendspace和net.inet.tcp. recvspace是特別令人感興趣sysctl。它們控制任何一個tcp連接允許的發送和接收緩沖區的大小。缺省是16K。通過增加缺省值犧牲更多內核內存你總能夠獲得更高的帶寬利用率。如果你正在服務成百上千個連接,我們不建議你增加缺省值,因為那樣很容易因為滯
copyright © 萬盛學電腦網 all rights reserved