sysctl用法

sysctl 是一個用來在系統運作中查看及調整系統參數的工具。有的 sysctl 參數只是用來回報目前的系統狀況,例如回報目前已開機時間、所使用的操作系統版本、核心名稱等等;而有的可以讓我們修改參數以調整系統運作的行爲,例如網絡暫存內存的大小、最大的上線人數等等。而這些可以調整的參數中必須在一開機系統執行其它程序前就設定好,有的可以在開機完後任意調整。

首先我們可以使用下列指令來查看目前所有的 sysctl 參數及其狀況:

# 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
[email protected]:/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 顯示單一的參數值,例如:

# sysctl kern.ipc.maxsockbuf
kern.ipc.maxsockbuf: 262144
並非所有的參數都可以使用 sysctl 進行調整,而且有的參數對於效能的影響並不大。我們僅在此說明一些影響較明顯的設定。

9.2.1 kern.ipc.maxsockets

這是用來設定系統最大可以開啓的 socket 數目。如果您的服務器會提供大量的 FTP 服務,而且常快速的傳輸一些小檔案,您也許會發現常傳輸到一半就中斷。因爲 FTP 在傳輸檔案時,每一個檔案都必須開啓一個 socket 來傳輸,但關閉 socket 需要一段時間,如果傳輸速度很快,而檔案又多,則同一時間所開啓的 socket 會超過原本系統所許可的值,這時我們就必須把這個值調大一點。除了 FTP 外,也許有其它網絡程序也會有這種問題。

然而,這個值必須在系統一開機就設定好,所以如果要修改這項設定,我們必須修改 /boot/loader.conf 才行。例如,我們要將它改成最多同時可以有 16424 個 socket,則必須在 /boot/loader.conf 中加入下列這一行:

kern.ipc.maxsockets=”16424″

9.2.2 net.inet.ip.portrange.*

net.inet.ip.portrange.* 是用來控制 TCP 及 UDP 所使用的 port 範圍,這個範圍被分成三個部份,低範圍、預設範圍、及高範圍。讓我們看一下目前各範圍 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
一般的網絡程序都會用到預設範圍的 port,然而,這個預設範圍只從 1024 到 5000,這對於一臺忙碌的 FTP server 或 proxy server 可能會有不足的情形。所以我們可以手動調整一下 net.inet.ip.portrange.last 這個值,將它調爲 10000、20000、甚至 40000 都是合理的。如果要在一開機就調整這個值,我們可以修改 /etc/sysctl.conf,並增加下列這一行:

net.inet.ip.portrange.last=40000

9.2.3 kern.ipc.shm_use_phys

kern.ipc.shm_use_phys 這個選項預設爲 0 (關閉),我們可以將它設爲 1 (打開)。如果我們將它設成 1,則所有 System V 共享內存 (share memory,一種程序間溝通的方式)部份都會被留在實體的內存 (physical memory) 中,而不會被放到硬盤上的 swap 空間。我們知道物理內存的存取速度比硬盤快許多,而當物理內存空間不足時,部份數據會被放到虛擬的內存上,從物理內存和虛擬內存之間移轉的動作就叫作 swap。如果時常做 swap 的動作,則需要一直對硬盤作 I/O,速度會很慢。因此,如果我們有大量的程序 (數百個) 需要共同分享一個小的共享內存空間,或者是共享內存空間很大時,我們可以將這個值打開。

這個值可以在開機完成後才設定,因此只要放在 /etc/sysctl.conf 中即可:

kern.ipc.shm_use_phys=1

9.2.4 vfs.vmiodirenable

這個選項預設被設爲 1,也就是打開的狀態。它被用來決定一個目錄中的結構 (目錄下的其它文件名稱等等) 被快取在內存中的行爲。一般的目錄結構可能都不大,而這些目錄結構會被快取在物理內存中。物理內存中所存放的目錄結構快取有限,所以不管我們的物理內存有多大,預設都只會快取一定大小的目錄結構。如果我們將這個選項打開,系統將 buffer cache 放在虛擬內存的快取中,目錄結構也就會被存放在虛擬內存中。這樣的好處是所有的內存空間都可以被拿來做目錄的快取,而缺點是最小用來存放目錄結構的快取會從 512 bytes 變成 4K。

如果您的系統物理內存空間有限,建議您將這個選項關閉。但如果您的系統需要進行大量檔案操作,例如 proxy、多人使用的郵件服務器、或是 news server 等,建議將這個選項打開。

9.2.5 vfs.write_behind

這個選項預設爲 1,也就是打開的狀態。在打開時,在系統需要寫入數據在硬盤或其它儲存設備上時,它會等到收集了一個 cluster 單位的數據後再一次寫入,否則會在一個暫存區空間有寫入需求時就立即寫到硬盤上。這個選項打開時,對於一個大檔案寫入速度非常有幫助。但如果您遇到有很多行程延滯在等待寫入動作時,您可能必須關閉這個功能。

9.2.6 vfs.hirunningspace

這個值決定了系統可以將多少數據放在寫入儲存設備的等候區。通常使用默認值即可,但當我們有多顆硬盤時,我們可以將它調大爲 4MB 或 5MB。但必須注意的是,太大的值反而會造成效能低落。

9.2.7 net.inet.tcp.sendspace 及 net.inet.tcp.recvspace

這二個選項分別控制了網絡 TCP 聯機所使用的傳送及接收暫存區的大小。預設的傳送暫存區爲 32K,而接收暫存區爲 64K。如果需要加速 TCP 的傳輸,可以將這二個值調大一點,但缺點是太大的值會造成系統核心佔用太多的內存。如果我們的機器會同時服務數百或數千個網絡聯機,那麼這二個選項最好維持默認值,否則會造成系統核心內存不足。但如果我們使用的是 gigabite 的網絡,將這二個值調大會有明顯效能的提升。傳送及接收的暫存區大小可以分開調整,例如,假設我們的系統主要做爲網頁服務器,我們可以將接收的暫存區調小一點,並將傳送的暫存區調大,如此一來,我們就可以避免佔去太多的核心內存空間。

還有要注意的是,除了這二個選項可以控制網絡傳輸暫存區大小外,route 這個指令也可以用來依路由路徑的不同指定暫存區大小。另外 ipfw 等防火牆軟件也可以用來限制每個聯機所能使用的網絡頻寬。

如果我們將傳送或接收的暫存區設爲大於 65535,除非我們的服務器本身及客戶端所使用的操作系統支持 TCP 協議的 windows scaling extension (請參考 RFC 1323 文件)。FreeBSD 預設已支援 rfs1323 (即 sysctl 的 net.inet.tcp.rfc1323 選項)。

9.2.8 net.inet.tcp.always_keepalive

當這個選項打開時,系統會定期送出「keepalives」以檢查一個 TCP 聯機是否中斷。在打開的狀況下,所有運作的網絡程序都會有定時檢查聯機是否中斷的功能,否則只有當應用程序本身支持時纔有此功能。這個選項打開的好處是讓系統更便於管理網絡聯機,尤其是當我們系統中常有一些莫名其妙就中斷聯機的使用者時。例如,當一個使用者利用撥接連到系統時,很可能在完成一個完整的 TCP 聯機之前,就因爲撥接中斷而造成聯機異常中斷。當然,在某些情況下,也有可能會造成系統誤判網絡聯機已中斷而結束這個 TCP 聯機。

9.2.9 net.inet.tcp.delayed_ack

TCP 協議有一個特性,就是當收到客戶端的數據時,會傳回一個 ACK (acknowledgement) 的封包,以確認已收到數據。然而,我們也可以將 ACK 封包和所要回傳的資料一起送出。例如,當我使用 telnet 進入系統時,在輸入指定時,當我們在鍵盤上敲打一個字符,系統會送回一個表示已接收到該字符的 ACK 封包,並傳回一個含有該字符的封包以在終端機上顯示。當 net.inet.tcp.delayed_ack 打開時,系統會將 ACK 和顯示該字符的封包一傳送,而不需分成二個封包。所以這個選項打開時,可以將封包數量減少一半,以加速網絡傳輸。其它的網絡服務,例如,WWW、 SMTP、POP3 等也都具有這種特性。

9.2.10 kern.ipc.somaxconn

這個選項控制了 TCP 聯機等候區最多可以等待的聯機數量,其默認值爲 128,不過這個值對於一臺忙碌的服務器而言可能小了點。例如大型的網頁服務器、郵件服務器,我們可以將它設爲 1024。要注意的是在一些網絡服務的程序中,如 Apache 及 sendmail 也有自己的等待數量設定,我們可能也要在那些軟件上做一些設定纔會讓 kern.ipc.somaxconn 發生作用。將這個選項的值調大一點還有一個好處,就是在面對 Denial of service 的***時,有較好的防衛能力。

9.2.11 kern.maxfiles

這個選項控制了系統中支持最多開啓的檔案數量,這個值通常是幾千個檔,但對於一臺忙碌的數據庫系統或是會開啓許多檔案的服務器而言,我們可以將它調高爲一、二萬。

9.2.12 kern.maxusers

這是用來控制系統內部表格(internal system tables)大小的參數,它的值大約是您期望系統同一時間會上線使用的使用者數量。我們在覈心設定檔中有一個 maxusers 的選項,如果您使用的是 FreeBSD 4.5 以上的版本,建議您只要在核心設定檔中將它 0 即可,系統會在一開機時自動依您的內存大小調整這個值。如果我們使用的是 FreeBSD 4.5 以後的版本,要調整這個值時,我們可以在 /boot/loader.conf 中加入該選項的設定,例如:

kern.maxusers=256

如果您使用 FreeBSD 4.4 以前的版本,則只能重新編譯核心以改變這項設定。

這個值一定要設定大於四,maxusers 的值決定了處理程序所容許的最大值,20+16*maxusers 就是你將得到的所容許處理程序。系統一開機就必須要有 18 個處理程序 (process),即便是簡單的執行指令 man 又會產生 9 個 process,所以將這個值設爲 64 應該是一個合理的數目。如果你的系統會出現 proc table full 的訊息的話,可以就把它設大一點,例如 128。除非您的系統會需要同時開啓很多檔案,否則請不要設定超過 256。

9.2.13 kern.ipc.nmbclusters

這個值用來調整系統在開機後所要分配給網絡 mbufs 的 cluster 數量,由於每個 cluster 大小爲 2K,所以當這個值爲 1024 時,也是會用到 2MB 的核心內存空間。我們可以簡單的估計出大約需要的大小,例如,假設我們的網頁同時約有 1000 個聯機,而 TCP 傳送及接收的暫存區大小都是 16K,則最糟的情況下,我們會需要 (16K+16K) * 1024,也就是 32MB 的空間,然而所需的 mbufs 大概是這個空間的二倍,也就是 64MB,所以所需的 cluster 數量爲 64MB/2K,也就是 32768。對於內存有限的機器,建議值是 1024 到 4096 之間,而當擁有海量存儲器空間時,我們可以將它設定爲 4096 到 32768 之間。我們可以使用 netstat 這個指令並加上參數 -m 來查看目前所使用的 mbufs 數量。

當我們要修改這個值是,必須在一開機就修改,所以只能在 /boot/loader.conf 中加入修改的設定,例如:

kern.ipc.nmbclusters=16384

這個是我在實際使用服務器中的參數,請在:/etc/sysctl.conf 加入參數

kern.ipc.somaxconn=8192
kern.ipc.maxsockbuf=2097152
kern.maxfilesperproc=32768
kern.maxfiles=65536
#kern.securelevel=0
net.inet.tcp.sendspace=65536
net.inet.tcp.recvspace=32768
net.inet.udp.maxdgram=57344
net.inet.icmp.drop_redirect=1
net.inet.icmp.log_redirect=0
net.inet.ip.redirect=0
net.inet6.ip6.redirect=0
net.inet.icmp.icmplim=100
net.inet.tcp.always_keepalive=0
net.inet.tcp.delayed_ack=0
net.inet.tcp.log_in_vain=0
net.inet.udp.log_in_vain=0
net.inet.tcp.blackhole=2
net.inet.udp.blackhole=1
net.local.stream.sendspace=65535
net.local.stream.recvspace=32768
net.inet.ip.fastforwarding=1查看 # sysctl -a |grep syncookies 是否打開,開着可以防小規模的DDOS
如:# sysctl net.inet.tcp.syncookies=1

# ee /boot/loader.conf

kern.maxdsiz="536870912"
kern.ipc.maxsockets="4008"
kern.ipc.nmbclusters="32768"
kern.ipc.nmbufs="65535"
kern.ipc.nsfbufs="2496"
net.inet.tcp.tcbhashsize="2048"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章