第八章 系統(tǒng)調(diào)校
8.1 監(jiān)看系統(tǒng)效能
FreeBSD 是一個(gè)高效能的操作系統(tǒng),預(yù)設(shè)的系統(tǒng)參數(shù)已符合大多數(shù)應(yīng)用的需求。然而,針對(duì)不同的系統(tǒng)服務(wù)及軟件應(yīng)用,我們可以使用系統(tǒng)內(nèi)附的工具來進(jìn)行細(xì)部的調(diào)校。
在進(jìn)行調(diào)校之前,我們可以先使用一些系統(tǒng)內(nèi)附的工具來查看目前系統(tǒng)效能。我們之前已經(jīng)介紹過 top 這個(gè)指令,它可以讓我們看目前系統(tǒng)中所有行程的狀況、CPU、內(nèi)存、及虛擬內(nèi)存的使用情形。這里我們介紹另一個(gè)好用的工具 systat。systat 可以用來顯示網(wǎng)絡(luò)使用情形、硬盤 I/O、CPU 等信息,可以說是最完整的系統(tǒng)監(jiān)看工具。它的使用方法如下:
systat [-display] [refresh-interval]
其中 display 為我們所要顯示的信息項(xiàng)目,我們也可以在進(jìn)入 systat 后變更顯示項(xiàng)目,而 refresh-interval 為多久要更新一次屏幕,單位是秒。以下為可用的 display 參數(shù):
顯示模式 | 意義 |
pigs | 顯示目前系統(tǒng)中使用 CPU 最多的行程名稱。如果所有行程的 CPU 使用量未滿 100%,則多出來的部份顯示為 IDLE。 |
icmp | 統(tǒng)計(jì)目前 ICMP 封包的進(jìn)出情形。 |
icmp6 | 顯示 IPv6 的 ICMP 封包進(jìn)出情形。 |
ip | 顯示 IP 層的封包統(tǒng)計(jì)及 UDP 封包信息。 |
ip6 | 和 IP 一樣,但只顯示 IPv6 的封包。 |
tcp | 顯示 TCP 的封包統(tǒng)計(jì)。 |
iostat | 顯示 I/O 狀況統(tǒng)計(jì),并分類為各種模式顯示。 |
swap | 顯示目前各個(gè)儲(chǔ)存空間上的虛擬內(nèi)存的使用情形。 |
mbufs | 顯示 mbufs 被使用的狀態(tài)。 |
vmstat | 這是我們最常用的顯示模式,它顯示了最多的信息,包含 I/O、虛擬內(nèi)存、mbufs、網(wǎng)絡(luò)等信息。 |
netstat | 顯示網(wǎng)絡(luò)的使用情形。 |
ifstat | 顯示各個(gè)網(wǎng)絡(luò)適配卡的使用情形。 |
進(jìn)行 systat 之后,我們可以先按冒號(hào)「:」再打上述各種顯示模式來變更顯示的信息,如果要離開,則先按冒號(hào),再按 quit 即可,或者也可以直接打「:q」。
讓我們來看一下 vmstat 的情形,并指定每一秒鐘更新一次畫面:
# systat -vm 1
4 users Load 0.02 0.02 0.00 6 11 13:35 Mem:KB REAL VIRTUAL VN PAGER SWAP PAGER Tot Share Tot Share Free in out in out Act 39068 4900 130008 10864 80100 count All 182200 7440 2692520 17828 pages Interrupts Proc:r p d s w Csw Trp Sys Int Sof Flt cow 368 total 48 751 2 467 543 20 58304 wire 100 0: clk 66744 act 1: atkb 2.3%Sys 0.0%Intr 0.8%User 0.0%Nice 96.9%Idl 47532 inact 128 8: rtc | | | | | | | | | | 10760 cache 71 9: vr0 => 69340 free 69 11: vr1 daefr 12: psm Namei Name-cache Dir-cache prcfr 13: npx Calls hits % hits % react 14: ata pdwak 15: ata zfod pdpgs Disks ad0 ofod intrn KB/t 0.00 %slo-z 35664 buf tps 0 tfree 54 dirtybuf MB/s 0.00 17812 desiredvnodes % busy 0 16909 numvnodes 8706 freevnodes |
如果您對(duì)于 systat 所顯示的各個(gè)字段有疑問,請(qǐng) man systat。
8.2 使用 sysctl 調(diào)校
sysctl 是一個(gè)用來在系統(tǒng)運(yùn)作中查看及調(diào)整系統(tǒng)參數(shù)的工具。有的 sysctl 參數(shù)只是用來回報(bào)目前的系統(tǒng)狀況,例如回報(bào)目前已開機(jī)時(shí)間、所使用的操作系統(tǒng)版本、核心名稱等等;而有的可以讓我們修改參數(shù)以調(diào)整系統(tǒng)運(yùn)作的行為,例如網(wǎng)絡(luò)暫存內(nèi)存的大小、最大的上線人數(shù)等等。而這些可以調(diào)整的參數(shù)中必須在一開機(jī)系統(tǒng)執(zhí)行其它程序前就設(shè)定好,有的可以在開機(jī)完后任意調(diào)整。
首先我們可以使用下列指令來查看目前所有的 sysctl 參數(shù)及其狀況:
# sysctl -a | more kern.ostype: FreeBSD kern.osrelease: 5.2.1-RELEASE kern.osrevision: 199506 kern.version: FreeBSD 5.2.1-RELEASE #0: Sun Apr 11 16:16:08 CST 2004 alex@alexwang.com:/usr/src/sys/i386/compile/ALEX kern.maxvnodes: 17812 kern.maxproc: 2020 kern.maxfiles: 4040 kern.argmax: 65536 kern.securelevel: -1 kern.hostname: alexwang.com kern.hostid: 0 kern.clockrate: { hz = 100, tick = 10000, profhz = 1024, stathz = 128 } kern.posix1version: 200112 kern.ngroups: 16 kern.job_control: 1 kern.saved_ids: 0 kern.boottime: { sec = 1081672724, usec = 885137 } Sun Apr 11 16:38:44 2004 kern.domainname: kern.osreldate: 502010 kern.bootfile: /boot/kernel/kernel kern.maxfilesperproc: 3636 kern.maxprocperuid: 1818 kern.ipc.maxsockbuf: 262144 kern.ipc.sockbuf_waste_factor: 8 kern.ipc.somaxconn: 128 kern.ipc.max_linkhdr: 16 kern.ipc.max_protohdr: 60 kern.ipc.max_hdr: 76 kern.ipc.max_datalen: 132 kern.ipc.nmbclusters: 9024 ………略………
我們也可以使用 sysctl 顯示單一的參數(shù)值,例如:
# sysctl kern.ipc.maxsockbuf kern.ipc.maxsockbuf: 262144
并非所有的參數(shù)都可以使用 sysctl 進(jìn)行調(diào)整,而且有的參數(shù)對(duì)于效能的影響并不大。我們僅在此說明一些影響較明顯的設(shè)定。
8.2.1 kern.ipc.maxsockets
這是用來設(shè)定系統(tǒng)最大可以開啟的 socket 數(shù)目。如果您的服務(wù)器會(huì)提供大量的 FTP 服務(wù),而且??焖俚膫鬏斠恍┬n案,您也許會(huì)發(fā)現(xiàn)常傳輸?shù)揭话刖椭袛?。因?yàn)?FTP 在傳輸檔案時(shí),每一個(gè)檔案都必須開啟一個(gè) socket 來傳輸,但關(guān)閉 socket 需要一段時(shí)間,如果傳輸速度很快,而檔案又多,則同一時(shí)間所開啟的 socket 會(huì)超過原本系統(tǒng)所許可的值,這時(shí)我們就必須把這個(gè)值調(diào)大一點(diǎn)。除了 FTP 外,也許有其它網(wǎng)絡(luò)程序也會(huì)有這種問題。
然而,這個(gè)值必須在系統(tǒng)一開機(jī)就設(shè)定好,所以如果要修改這項(xiàng)設(shè)定,我們必須修改 /boot/loader.conf 才行。例如,我們要將它改成最多同時(shí)可以有 16424 個(gè) socket,則必須在 /boot/loader.conf 中加入下列這一行:
kern.ipc.maxsockets="16424" |
8.2.2 net.inet.ip.portrange.*
net.inet.ip.portrange.* 是用來控制 TCP 及 UDP 所使用的 port 范圍,這個(gè)范圍被分成三個(gè)部份,低范圍、預(yù)設(shè)范圍、及高范圍。讓我們看一下目前各范圍 port 的情形:
# sysctl -a|grep portrange net.inet.ip.portrange.lowfirst: 1023 net.inet.ip.portrange.lowlast: 600 net.inet.ip.portrange.first: 1024 net.inet.ip.portrange.last: 5000 net.inet.ip.portrange.hifirst: 49152 net.inet.ip.portrange.hilast: 65535
一般的網(wǎng)絡(luò)程序都會(huì)用到預(yù)設(shè)范圍的 port,然而,這個(gè)預(yù)設(shè)范圍只從 1024 到 5000,這對(duì)于一臺(tái)忙碌的 FTP server 或 proxy server 可能會(huì)有不足的情形。所以我們可以手動(dòng)調(diào)整一下 net.inet.ip.portrange.last 這個(gè)值,將它調(diào)為 10000、20000、甚至 40000 都是合理的。如果要在一開機(jī)就調(diào)整這個(gè)值,我們可以修改 /etc/sysctl.conf,并增加下列這一行:
net.inet.ip.portrange.last=40000 |
8.2.3 kern.ipc.shm_use_phys
kern.ipc.shm_use_phys 這個(gè)選項(xiàng)預(yù)設(shè)為 0 (關(guān)閉),我們可以將它設(shè)為 1 (打開)。如果我們將它設(shè)成 1,則所有 System V 共享內(nèi)存 (share memory,一種程序間溝通的方式)部份都會(huì)被留在實(shí)體的內(nèi)存 (physical memory) 中,而不會(huì)被放到硬盤上的 swap 空間。我們知道物理內(nèi)存的存取速度比硬盤快許多,而當(dāng)物理內(nèi)存空間不足時(shí),部份數(shù)據(jù)會(huì)被放到虛擬的內(nèi)存上,從物理內(nèi)存和虛擬內(nèi)存之間移轉(zhuǎn)的動(dòng)作就叫作 swap。如果時(shí)常做 swap 的動(dòng)作,則需要一直對(duì)硬盤作 I/O,速度會(huì)很慢。因此,如果我們有大量的程序 (數(shù)百個(gè)) 需要共同分享一個(gè)小的共享內(nèi)存空間,或者是共享內(nèi)存空間很大時(shí),我們可以將這個(gè)值打開。
這個(gè)值可以在開機(jī)完成后才設(shè)定,因此只要放在 /etc/sysctl.conf 中即可:
kern.ipc.shm_use_phys=1 |
8.2.4 vfs.vmiodirenable
這個(gè)選項(xiàng)預(yù)設(shè)被設(shè)為 1,也就是打開的狀態(tài)。它被用來決定一個(gè)目錄中的結(jié)構(gòu) (目錄下的其它文件名稱等等) 被快取在內(nèi)存中的行為。一般的目錄結(jié)構(gòu)可能都不大,而這些目錄結(jié)構(gòu)會(huì)被快取在物理內(nèi)存中。物理內(nèi)存中所存放的目錄結(jié)構(gòu)快取有限,所以不管我們的物理內(nèi)存有多大,預(yù)設(shè)都只會(huì)快取一定大小的目錄結(jié)構(gòu)。如果我們將這個(gè)選項(xiàng)打開,系統(tǒng)將 buffer cache 放在虛擬內(nèi)存的快取中,目錄結(jié)構(gòu)也就會(huì)被存放在虛擬內(nèi)存中。這樣的好處是所有的內(nèi)存空間都可以被拿來做目錄的快取,而缺點(diǎn)是最小用來存放目錄結(jié)構(gòu)的快取會(huì)從 512 bytes 變成 4K。
如果您的系統(tǒng)物理內(nèi)存空間有限,建議您將這個(gè)選項(xiàng)關(guān)閉。但如果您的系統(tǒng)需要進(jìn)行大量檔案操作,例如 proxy、多人使用的郵件服務(wù)器、或是 news server 等,建議將這個(gè)選項(xiàng)打開。
8.2.5 vfs.write_behind
這個(gè)選項(xiàng)預(yù)設(shè)為 1,也就是打開的狀態(tài)。在打開時(shí),在系統(tǒng)需要寫入數(shù)據(jù)在硬盤或其它儲(chǔ)存設(shè)備上時(shí),它會(huì)等到收集了一個(gè) cluster 單位的數(shù)據(jù)后再一次寫入,否則會(huì)在一個(gè)暫存區(qū)空間有寫入需求時(shí)就立即寫到硬盤上。這個(gè)選項(xiàng)打開時(shí),對(duì)于一個(gè)大檔案寫入速度非常有幫助。但如果您遇到有很多行程延滯在等待寫入動(dòng)作時(shí),您可能必須關(guān)閉這個(gè)功能。
8.2.6 vfs.hirunningspace
這個(gè)值決定了系統(tǒng)可以將多少數(shù)據(jù)放在寫入儲(chǔ)存設(shè)備的等候區(qū)。通常使用默認(rèn)值即可,但當(dāng)我們有多顆硬盤時(shí),我們可以將它調(diào)大為 4MB 或 5MB。但必須注意的是,太大的值反而會(huì)造成效能低落。
8.2.7 net.inet.tcp.sendspace 及 net.inet.tcp.recvspace
這二個(gè)選項(xiàng)分別控制了網(wǎng)絡(luò) TCP 聯(lián)機(jī)所使用的傳送及接收暫存區(qū)的大小。預(yù)設(shè)的傳送暫存區(qū)為 32K,而接收暫存區(qū)為 64K。如果需要加速 TCP 的傳輸,可以將這二個(gè)值調(diào)大一點(diǎn),但缺點(diǎn)是太大的值會(huì)造成系統(tǒng)核心占用太多的內(nèi)存。如果我們的機(jī)器會(huì)同時(shí)服務(wù)數(shù)百或數(shù)千個(gè)網(wǎng)絡(luò)聯(lián)機(jī),那么這二個(gè)選項(xiàng)最好維持默認(rèn)值,否則會(huì)造成系統(tǒng)核心內(nèi)存不足。但如果我們使用的是 gigabite 的網(wǎng)絡(luò),將這二個(gè)值調(diào)大會(huì)有明顯效能的提升。傳送及接收的暫存區(qū)大小可以分開調(diào)整,例如,假設(shè)我們的系統(tǒng)主要做為網(wǎng)頁服務(wù)器,我們可以將接收的暫存區(qū)調(diào)小一點(diǎn),并將傳送的暫存區(qū)調(diào)大,如此一來,我們就可以避免占去太多的核心內(nèi)存空間。
還有要注意的是,除了這二個(gè)選項(xiàng)可以控制網(wǎng)絡(luò)傳輸暫存區(qū)大小外,route 這個(gè)指令也可以用來依路由路徑的不同指定暫存區(qū)大小。另外 ipfw 等防火墻軟件也可以用來限制每個(gè)聯(lián)機(jī)所能使用的網(wǎng)絡(luò)頻寬。
如果我們將傳送或接收的暫存區(qū)設(shè)為大于 65535,除非我們的服務(wù)器本身及客戶端所使用的操作系統(tǒng)支持 TCP 協(xié)議的 windows scaling extension (請(qǐng)參考 RFC 1323 文件)。FreeBSD 預(yù)設(shè)已支援 rfs1323 (即 sysctl 的 net.inet.tcp.rfc1323 選項(xiàng))。
8.2.8 net.inet.tcp.always_keepalive
當(dāng)這個(gè)選項(xiàng)打開時(shí),系統(tǒng)會(huì)定期送出「keepalives」以檢查一個(gè) TCP 聯(lián)機(jī)是否中斷。在打開的狀況下,所有運(yùn)作的網(wǎng)絡(luò)程序都會(huì)有定時(shí)檢查聯(lián)機(jī)是否中斷的功能,否則只有當(dāng)應(yīng)用程序本身支持時(shí)才有此功能。這個(gè)選項(xiàng)打開的好處是讓系統(tǒng)更便于管理網(wǎng)絡(luò)聯(lián)機(jī),尤其是當(dāng)我們系統(tǒng)中常有一些莫名其妙就中斷聯(lián)機(jī)的使用者時(shí)。例如,當(dāng)一個(gè)使用者利用撥接連到系統(tǒng)時(shí),很可能在完成一個(gè)完整的 TCP 聯(lián)機(jī)之前,就因?yàn)閾芙又袛喽斐陕?lián)機(jī)異常中斷。當(dāng)然,在某些情況下,也有可能會(huì)造成系統(tǒng)誤判網(wǎng)絡(luò)聯(lián)機(jī)已中斷而結(jié)束這個(gè) TCP 聯(lián)機(jī)。
8.2.9 net.inet.tcp.delayed_ack
TCP 協(xié)議有一個(gè)特性,就是當(dāng)收到客戶端的數(shù)據(jù)時(shí),會(huì)傳回一個(gè) ACK (acknowledgement) 的封包,以確認(rèn)已收到數(shù)據(jù)。然而,我們也可以將 ACK 封包和所要回傳的資料一起送出。例如,當(dāng)我使用 telnet 進(jìn)入系統(tǒng)時(shí),在輸入指定時(shí),當(dāng)我們?cè)阪I盤上敲打一個(gè)字符,系統(tǒng)會(huì)送回一個(gè)表示已接收到該字符的 ACK 封包,并傳回一個(gè)含有該字符的封包以在終端機(jī)上顯示。當(dāng) net.inet.tcp.delayed_ack 打開時(shí),系統(tǒng)會(huì)將 ACK 和顯示該字符的封包一傳送,而不需分成二個(gè)封包。所以這個(gè)選項(xiàng)打開時(shí),可以將封包數(shù)量減少一半,以加速網(wǎng)絡(luò)傳輸。其它的網(wǎng)絡(luò)服務(wù),例如,WWW、SMTP、POP3 等也都具有這種特性。
8.2.10 kern.ipc.somaxconn
這個(gè)選項(xiàng)控制了 TCP 聯(lián)機(jī)等候區(qū)最多可以等待的聯(lián)機(jī)數(shù)量,其默認(rèn)值為 128,不過這個(gè)值對(duì)于一臺(tái)忙碌的服務(wù)器而言可能小了點(diǎn)。例如大型的網(wǎng)頁服務(wù)器、郵件服務(wù)器,我們可以將它設(shè)為 1024。要注意的是在一些網(wǎng)絡(luò)服務(wù)的程序中,如 Apache 及 sendmail 也有自己的等待數(shù)量設(shè)定,我們可能也要在那些軟件上做一些設(shè)定才會(huì)讓 kern.ipc.somaxconn 發(fā)生作用。將這個(gè)選項(xiàng)的值調(diào)大一點(diǎn)還有一個(gè)好處,就是在面對(duì) Denial of service 的攻擊時(shí),有較好的防衛(wèi)能力。
8.2.11 kern.maxfiles
這個(gè)選項(xiàng)控制了系統(tǒng)中支持最多開啟的檔案數(shù)量,這個(gè)值通常是幾千個(gè)檔,但對(duì)于一臺(tái)忙碌的數(shù)據(jù)庫系統(tǒng)或是會(huì)開啟許多檔案的服務(wù)器而言,我們可以將它調(diào)高為一、二萬。
8.2.12 kern.maxusers
這是用來控制系統(tǒng)內(nèi)部表格(internal system tables)大小的參數(shù),它的值大約是您期望系統(tǒng)同一時(shí)間會(huì)上線使用的使用者數(shù)量。我們?cè)诤诵脑O(shè)定檔中有一個(gè) maxusers 的選項(xiàng),如果您使用的是 FreeBSD 4.5 以上的版本,建議您只要在核心設(shè)定檔中將它 0 即可,系統(tǒng)會(huì)在一開機(jī)時(shí)自動(dòng)依您的內(nèi)存大小調(diào)整這個(gè)值。如果我們使用的是 FreeBSD 4.5 以后的版本,要調(diào)整這個(gè)值時(shí),我們可以在 /boot/loader.conf 中加入該選項(xiàng)的設(shè)定,例如:
kern.maxusers=256 |
如果您使用 FreeBSD 4.4 以前的版本,則只能重新編譯核心以改變這項(xiàng)設(shè)定。
這個(gè)值一定要設(shè)定大于四,maxusers 的值決定了處理程序所容許的最大值,20+16*maxusers 就是你將得到的所容許處理程序。系統(tǒng)一開機(jī)就必須要有 18 個(gè)處理程序 (process),即便是簡(jiǎn)單的執(zhí)行指令 man 又會(huì)產(chǎn)生 9 個(gè) process,所以將這個(gè)值設(shè)為 64 應(yīng)該是一個(gè)合理的數(shù)目。如果你的系統(tǒng)會(huì)出現(xiàn) proc table full 的訊息的話,可以就把它設(shè)大一點(diǎn),例如 128。除非您的系統(tǒng)會(huì)需要同時(shí)開啟很多檔案,否則請(qǐng)不要設(shè)定超過 256。
8.2.13 kern.ipc.nmbclusters
這個(gè)值用來調(diào)整系統(tǒng)在開機(jī)后所要分配給網(wǎng)絡(luò) mbufs 的 cluster 數(shù)量,由于每個(gè) cluster 大小為 2K,所以當(dāng)這個(gè)值為 1024 時(shí),也是會(huì)用到 2MB 的核心內(nèi)存空間。我們可以簡(jiǎn)單的估計(jì)出大約需要的大小,例如,假設(shè)我們的網(wǎng)頁同時(shí)約有 1000 個(gè)聯(lián)機(jī),而 TCP 傳送及接收的暫存區(qū)大小都是 16K,則最糟的情況下,我們會(huì)需要 (16K+16K) * 1024,也就是 32MB 的空間,然而所需的 mbufs 大概是這個(gè)空間的二倍,也就是 64MB,所以所需的 cluster 數(shù)量為 64MB/2K,也就是 32768。對(duì)于內(nèi)存有限的機(jī)器,建議值是 1024 到 4096 之間,而當(dāng)擁有海量存儲(chǔ)器空間時(shí),我們可以將它設(shè)定為 4096 到 32768 之間。我們可以使用 netstat 這個(gè)指令并加上參數(shù) -m 來查看目前所使用的 mbufs 數(shù)量。
當(dāng)我們要修改這個(gè)值是,必須在一開機(jī)就修改,所以只能在 /boot/loader.conf 中加入修改的設(shè)定,例如:
kern.ipc.nmbclusters=16384 |
8.2.14 hw.ata.wc
這個(gè)選項(xiàng)用來打開 IDE 硬盤快取。當(dāng)打開時(shí),如果有數(shù)據(jù)要寫入硬盤時(shí),硬盤會(huì)假裝已完成寫入,并將數(shù)據(jù)快取起來。這種作法會(huì)加速硬盤的存取速度,但當(dāng)系統(tǒng)異常關(guān)機(jī)時(shí),比較容易造成數(shù)據(jù)遺失。不過由于關(guān)閉這個(gè)功能所帶來的速度差異實(shí)在太大,建議您還是保留原本打開的狀態(tài)吧。
8.3 調(diào)整硬盤參數(shù)
磁盤空間的配置對(duì)于系統(tǒng)效能影響很大,當(dāng)我們?cè)诜指畲疟P時(shí),應(yīng)該分割一個(gè)小型的空間給根目錄,接著再分割一個(gè)空間給 swap,讓這二個(gè)空間放在硬盤最外圈,以加速存取速度。最后再慢慢的分割其它的空間,并將最大的空間放到最后。例如,我們?cè)诮⒋疟P空間時(shí),可以依序建立以下的空間:/ (256MB)、Swap (512MB)、/tmp (512MB)、/var (256MB)、/usr (4GB)、/home (25GB),讓最大的空間放到最后。
在分割硬盤時(shí),我們可以依我們所提供的服務(wù)來決定各個(gè)分割區(qū)的大小。將整個(gè)硬盤只分割一個(gè)大的 / 分割區(qū)往往不一個(gè)好主意。首先,對(duì)于主要作為讀取用途的目錄和以寫入為主的目錄最好分開為不同的分割區(qū),如此一來,我們可以針對(duì)這些不同用途的分割區(qū)進(jìn)行調(diào)校。例如,/var 及 /var/tmp 常會(huì)被寫入數(shù)據(jù),而 /usr 通常只用來讀取,在分割磁盤時(shí),我們將最常寫入的 /var、/var/tmp 放在最大的磁盤分割區(qū) /home 之前,將有助于速度的提升。另外,我們將 / 獨(dú)立分割成一個(gè)只會(huì)做讀取動(dòng)作的空間,在異常關(guān)機(jī)時(shí),磁盤空間也比較不會(huì)損毀。分割成多個(gè)磁盤空間可以讓我們使用 newfs 或 tunefs 等工具來進(jìn)行調(diào)效,這也是只分割一個(gè)單一的空間所做不到的事。
FreeBSD 的檔案系統(tǒng)在 block size 為 8K 或 16K 時(shí)有最好的表現(xiàn),而使用 newfs 進(jìn)行格式化時(shí),預(yù)設(shè)的 block size
為 16K。然而,當(dāng)我們的服務(wù)器是做為數(shù)據(jù)庫用途時(shí),由于數(shù)據(jù)庫的存取是隨機(jī)存取,所以在 block size 為 8K 時(shí)會(huì)有比較好的表現(xiàn)。如果我們將
block size 設(shè)為 16K 以上,比較容易造成空間浪費(fèi)及空間破碎的問題,進(jìn)而造成效能低落。
當(dāng)我們的分割區(qū)主要存放大量小型檔案時(shí),例如 BBS 或 news server,我們會(huì)將 block size 調(diào)小一點(diǎn),如 8K 或是 4K。而在 newfs
時(shí),我們也會(huì)指定 fragment size,它的值最好是 block size 的八分之一,例如當(dāng) block size 為 8K 時(shí),我們會(huì)使用 newfs
-b 8192 -f 1024 來格式化硬盤。如果您使用的是 /stand/sysinstall 來分割硬盤,您可以在分割硬盤時(shí)按 N 來設(shè)定 newfs
option。
當(dāng)我們的分割區(qū)主要用來存放少量大文件時(shí),例如數(shù)據(jù)庫,我們可以使用 newfs 參數(shù) -i 設(shè)定 inode 所占空間大一點(diǎn)以減少 inode 的數(shù)量 (也就是可以建立的檔案及目錄數(shù)量),讓系統(tǒng)在不正常關(guān)機(jī)后,開機(jī)時(shí)進(jìn)行 fsck 時(shí)可以快一點(diǎn)。不過在修改 inode 數(shù)量時(shí)要注意,否則您可能會(huì)遇到硬盤空間明明未滿卻無法新增檔案的窘境。若要使用大型的 inode,F(xiàn)reeBSD 建議的 inode 大小為 32768、65536、或 262144,再大的話只會(huì)降低效能。
我們?cè)谑褂?/stand/sysinstall 新增一個(gè)分割區(qū)時(shí),您會(huì)發(fā)現(xiàn)在 Newfs 字段中,除了 / 及 swap 外,其它的分割區(qū) newfs 字段都有一個(gè) UFS2+S 的設(shè)定,如圖 8-1 所示:
圖 8-1
您所看到的 S 表示使用 Soft Updates。Soft Updates 可以用來加速系統(tǒng)寫入檔案及目錄的系統(tǒng)數(shù)據(jù),對(duì)于新增及刪除檔案的速度有明顯的提升。Soft Updates 可以讓我們?cè)趯懭胭Y料時(shí)保有完整性,在面臨系統(tǒng)不正常關(guān)機(jī)時(shí),能讓所寫入的數(shù)據(jù)盡量完整。而其缺點(diǎn)是在刪除或更新檔案時(shí),硬盤空間的釋放較慢,這個(gè)缺點(diǎn)在于一個(gè)快要滿的分割區(qū)中比較明顯。例如,當(dāng)我們的 / 目錄快滿時(shí),我們更新該分割區(qū)的數(shù)據(jù)時(shí),可能會(huì)因?yàn)榉指顓^(qū)在刪除數(shù)據(jù)后空間釋放較慢而使空間不足而失敗,進(jìn)而造成某些檔案無法使用。所以 FreeBSD 預(yù)設(shè)并未在 / 目錄中使用 Soft Updates。
Soft Update 除了可以在格式化硬盤時(shí)就將它啟動(dòng)外,F(xiàn)reeBSD 有一個(gè)用來調(diào)整硬盤參數(shù)的指令 tunefs 可以在分割完硬盤后啟用 Soft Updates。不過 tunefs 只能在該儲(chǔ)存空間尚未被掛入前使用,所以如果您要使用 tunefs,只能在單人模式下使用。
8.4 虛擬內(nèi)存管理
當(dāng)我們?cè)诜指?Swap 空間時(shí),它的大小最少必須是物理內(nèi)存的二倍。例如,當(dāng)我們有 512 MB RAM 時(shí),最小應(yīng)該要有 1GB 的 Swap。因?yàn)? FreeBSD 核心對(duì)于虛擬內(nèi)存的管理上,當(dāng) Swap 有物理內(nèi)存二倍以上時(shí)有最佳的效能。太小的 Swap 空間會(huì)造成效能低落,即使您不必用到那么大的空間,因?yàn)槟壳坝脖P都很大,建議您還是將它的值調(diào)大一點(diǎn)。另外,當(dāng)我們有多顆硬盤時(shí),建議將 Swap 空間分別存放在每一個(gè)硬盤上,而且每顆硬盤上的 Swap 空間大小要一致,雖然大小不一致時(shí),F(xiàn)reeBSD 還是可以處理,但效能會(huì)差很多。