linux sysctl.conf詳解

小亮520cl發表於2015-05-08
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
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 顯示單一的引數值,例如:


# 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"
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29096438/viewspace-1629379/,如需轉載,請註明出處,否則將追究法律責任。