用Sysctl 調整Linux操作系統的性能


Sysctl是一個允許您改變正在運行中的Linux系統的接口。它包含一些 TCP/IP 堆棧和虛擬內存系統的高級選項, 這可以讓有經驗的管理員提高引人注目的系統性能。用sysctl可以讀取設置超過五百個系統變量。基於這點,sysctl(8) 提供兩個功能:讀取和修改系統設置。

查看所有可讀變量:

% sysctl -a

讀一個指定的變量,例如 kern.maxproc:

% sysctl kern.maxproc kern.maxproc: 1044

要設置一個指定的變量,直接用 variable=value 這樣的語法:

# sysctl kern.maxfiles=5000

kern.maxfiles: 2088 –> 5000

sysctl -w

-w     Use this option when you want to change a sysctl setting.

注意,這個參數是用來改變當前值即虛擬文件系統/proc下的值.

sysctl -p

-p     Load  in  sysctl settings from the file specified or /etc/sysctl.conf if none given.  Specifying - as filename means reading data from standard input.

注: 指定要加載的配置文件並顯示參數.如果不指定加載文件的路徑,默認為:/etc/sysctl.conf

比如,如果你添加了某個參數到/etc/sysctl.conf,

echo "net.ipv4.tcp_keepalive_time=20">>/etc/sysctl.conf

那么運行sysctl -p將重新加載配置文件,這樣新增加到配置文件的參數便能及時生效了.並且還會顯示所有該配置文件中的參數.

您可以使用sysctl修改系統變量,也可以通過編輯sysctl.conf文件來修改系統變量。sysctl.conf 看起來很像 rc.conf。它用 variable=value 的形式來設定值。指定的值在系統進入多用戶模式之后被設定。並不是所有的變量都可以在這個模式下設定。

sysctl 變量的設置通常是字符串、數字或者布爾型。 (布爾型用 1 來表示'yes',用 0 來表示'no')。

      ###############################

net.inet.ip.sourceroute=0

net.inet.ip.accept_sourceroute=0

#############################

通過源路由,攻擊者可以嘗試到達內部IP地址 --包括RFC1918中的地址,所以

不接受源路由信息包可以防止你的內部網絡被探測。

#################################

net.inet.tcp.drop_synfin=1

###################################

安全參數,編譯內核的時候加了options TCP_DROP_SYNFIN才可以用,可以阻止某些OS探測。

##################################

kern.maxvnodes=8446

vnode 是對文件或目錄的一種內部表達。 因此, 增加可以被操作系統利用的 vnode 數量將降低磁盤的 I/O。

一般而言, 這是由操作系統自行完成的,也不需要加以修改。但在某些時候磁盤 I/O 會成為瓶頸,

而系統的 vnode 不足, 則這一配置應被增加。此時需要考慮是非活躍和空閑內存的數量。

要查看當前在用的 vnode 數量:

# sysctl vfs.numvnodes

vfs.numvnodes: 91349

要查看最大可用的 vnode 數量:

# sysctl kern.maxvnodes

kern.maxvnodes: 100000

如果當前的 vnode 用量接近最大值,則將 kern.maxvnodes 值增大 1,000 可能是個好主意。

您應繼續查看 vfs.numvnodes 的數值, 如果它再次攀升到接近最大值的程度,

仍需繼續提高 kern.maxvnodes。 在 top(1) 中顯示的內存用量應有顯著變化,

更多內存會處於活躍 (active) 狀態。

####################################

kern.maxproc: 964

Maximum number of processes

####################################

kern.maxprocperuid: 867

Maximum processes allowed per userid

####################################

因為我的maxusers設置的是256,20+16*maxusers=4116。

maxprocperuid至少要比maxproc少1,因為init(8) 這個系統程序絕對要保持在運作狀態。

我給它設置的2068。

kern.maxfiles: 1928

系統中支持最多同時開啟的文件數量,如果你在運行數據庫或大的很吃描述符的進程,那么應該設置在20000以上,

比如kde這樣的桌面環境,它同時要用的文件非常多。

一般推薦設置為32768或者65536。

####################################

kern.argmax: 262144

  maximum number of bytes (or characters) in an argument list.

命令行下最多支持的參數,比如你在用find命令來批量刪除一些文件的時候

find . -name "*.old" -delete,如果文件數超過了這個數字,那么會提示你數字太多的。

可以利用find . -name "*.old" -ok rm {} ;來刪除。

默認的參數已經足夠多了,因此不建議再做修改。

####################################

kern.securelevel: -1

  -1:這是系統默認級別,沒有提供任何內核的保護錯誤;

0:基本上作用不多,當你的系統剛啟動就是0級別的,當進入多用戶模式的時候就自動變成1級了。

1:在這個級別上,有如下幾個限制:

a. 不能通過kldload或者kldunload加載或者卸載可加載內核模塊;

b. 應用程序不能通過/dev/mem或者/dev/kmem直接寫內存;

c. 不能直接往已經裝在(mounted)的磁盤寫東西,也就是不能格式化磁盤,但是可以通過標准的內核接口執行寫操作;

d. 不能啟動X-windows,同時不能使用chflags來修改文件屬性;

2:在 1 級別的基礎上還不能寫沒裝載的磁盤,而且不能在1秒之內制造多次警告,這個是防止DoS控制台的;

3:在 2 級別的級別上不允許修改IPFW防火牆的規則。

如果你已經裝了防火牆,並且把規則設好了,不輕易改動,那么建議使用3級別,如果你沒有裝防火牆,而且還准備裝防火牆的話,不建議使用。

我們這里推薦使用 2 級別,能夠避免比較多對內核攻擊。

     ####################################

kern.maxfilesperproc: 1735

每個進程能夠同時打開的最大文件數量,網上很多資料寫的是32768

除非用異步I/O或大量線程,打開這么多的文件恐怕是不太正常的。

我個人建議不做修改,保留默認。

####################################

kern.ipc.maxsockbuf: 262144

最大的套接字緩沖區,網上有建議設置為2097152(2M)、8388608(8M)的。

我個人倒是建議不做修改,保持默認的256K即可,緩沖區大了可能造成碎片、阻塞或者丟包。

####################################

kern.ipc.somaxconn: 128

最大的等待連接完成的套接字隊列大小,即並發連接數。

高負載服務器和受到Dos攻擊的系統也許會因為這個隊列被塞滿而不能提供正常服務。

默認為128,推薦在1024-4096之間,根據機器和實際情況需要改動,數字越大占用內存也越大。

####################################

kern.ipc.nmbclusters: 4800

這個值用來調整系統在開機后所要分配給網絡 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=32768

####################################

kern.ipc.shmmax: 33554432

共享內存和信號燈("System VIPC")如果這些過小的話,有些大型的軟件將無法啟動

安裝xine和mplayer提示的設置為67108864,即64M,

如果內存多的話,可以設置為134217728,即128M

####################################

kern.ipc.shmall: 8192

  共享內存和信號燈("System VIPC")如果這些過小的話,有些大型的軟件將無法啟動

安裝xine和mplayer提示的設置為32768

####################################

kern.ipc.shm_use_phys: 0

如果我們將它設成 1,則所有 System V 共享內存 (share memory,一種程序間溝通的方式)部份都會被留在實體的內存 (physical memory) 中,

而不會被放到硬盤上的 swap 空間。我們知道物理內存的存取速度比硬盤快許多,而當物理內存空間不足時,

部份數據會被放到虛擬的內存上,從物理內存和虛擬內存之間移轉的動作就叫作 swap。如果時常做 swap 的動作,

則需要一直對硬盤作 I/O,速度會很慢。因此,如果我們有大量的程序 (數百個) 需要共同分享一個小的共享內存空間,

或者是共享內存空間很大時,我們可以將這個值打開。

這一項,我個人建議不做修改,除非你的內存非常大。

####################################

kern.ipc.shm_allow_removed: 0

共享內存是否允許移除?這項似乎是在fb下裝vmware需要設置為1的,否則會有加載SVGA出錯的提示

作為服務器,這項不動也罷。

####################################

kern.ipc.numopensockets: 12

已經開啟的socket數目,可以在最繁忙的時候看看它是多少,然后就可以知道maxsockets應該設置成多少了。

####################################

kern.ipc.maxsockets: 1928

這是用來設定系統最大可以開啟的 socket 數目。如果您的服務器會提供大量的 FTP 服務,

而且常快速的傳輸一些小檔案,您也許會發現常傳輸到一半就中斷。因為 FTP 在傳輸檔案時,

每一個檔案都必須開啟一個 socket 來傳輸,但關閉 socket 需要一段時間,如果傳輸速度很快,

而檔案又多,則同一時間所開啟的 socket 會超過原本系統所許可的值,這時我們就必須把這個值調大一點。

除了 FTP 外,也許有其它網絡程序也會有這種問題。

然而,這個值必須在系統一開機就設定好,所以如果要修改這項設定,我們必須修改 /boot/loader.conf 才行

kern.ipc.maxsockets="16424"

####################################

kern.ipc.nsfbufs: 1456

經常使用 sendfile(2) 系統調用的繁忙的服務器,

有必要通過 NSFBUFS 內核選項或者在 /boot/loader.conf (查看 loader(8) 以獲得更多細節) 中設置它的值來調節 sendfile(2) 緩存數量。

這個參數需要調節的普通原因是在進程中看到 sfbufa 狀態。sysctl kern.ipc.nsfbufs 變量在內核配置變量中是只讀的。

這個參數是由 kern.maxusers 決定的,然而它可能有必要因此而調整。

在/boot/loader.conf里加入

kern.ipc.nsfbufs="2496"

####################################

kern.maxusers: 59

maxusers 的值決定了處理程序所容許的最大值,20+16*maxusers 就是你將得到的所容許處理程序。

系統一開機就必須要有 18 個處理程序 (process),即便是簡單的執行指令 man 又會產生 9 個 process,

所以將這個值設為 64 應該是一個合理的數目。

如果你的系統會出現 proc table full 的訊息的話,可以就把它設大一點,例如 128。

除非您的系統會需要同時開啟很多檔案,否則請不要設定超過 256。

可以在 /boot/loader.conf 中加入該選項的設定,

kern.maxusers=256

####################################

kern.coredump: 1

如果設置為0,則程序異常退出時不會生成core文件,作為服務器,不建議這樣。

####################################

kern.corefile: %N.core

可設置為kern.corefile="/data/coredump/%U-%P-%N.core"

其中 %U是UID,%P是進程ID,%N是進程名,當然/data/coredump必須是一個實際存在的目錄

####################################

vm.swap_idle_enabled: 0

vm.swap_idle_threshold1: 2

vm.swap_idle_threshold2: 10

#########################

在有很多用戶進入、離開系統和有很多空閑進程的大的多用戶系統中很有用。

可以讓進程更快地進入內存,但它會吃掉更多的交換和磁盤帶寬。

系統默認的頁面調度算法已經很好了,最好不要更改。

########################

vfs.ufs.dirhash_maxmem: 2097152

#########################

默認的dirhash最大內存,默認2M

增加它有助於改善單目錄超過100K個文件時的反復讀目錄時的性能

建議修改為33554432(32M)

#############################

vfs.vmiodirenable: 1

#################

這個變量控制目錄是否被系統緩存。大多數目錄是小的,在系統中只使用單個片斷(典型的是1K)並且在緩存中使用的更小 (典型的是512字節)。

當這個變量設置為關閉 (0) 時,緩存器僅僅緩存固定數量的目錄,即使您有很大的內存。

而將其開啟 (設置為1) 時,則允許緩存器用 VM 頁面緩存來緩存這些目錄,讓所有可用內存來緩存目錄。

不利的是最小的用來緩存目錄的核心內存是大於 512 字節的物理頁面大小(通常是 4k)。

我們建議如果您在運行任何操作大量文件的程序時保持這個選項打開的默認值。

這些服務包括 web 緩存,大容量郵件系統和新聞系統。

盡管可能會浪費一些內存,但打開這個選項通常不會降低性能。但還是應該檢驗一下。

####################

vfs.hirunningspace: 1048576

############################

這個值決定了系統可以將多少數據放在寫入儲存設備的等候區。通常使用默認值即可,

但當我們有多顆硬盤時,我們可以將它調大為 4MB 或 5MB。

注意這個設置成很高的值(超過緩存器的寫極限)會導致壞的性能。

不要盲目的把它設置太高!高的數值會導致同時發生的讀操作的遲延。

#############################

vfs.write_behind: 1

#########################

這個選項預設為 1,也就是打開的狀態。在打開時,在系統需要寫入數據在硬盤或其它儲存設備上時,

它會等到收集了一個 cluster 單位的數據后再一次寫入,否則會在一個暫存區空間有寫入需求時就立即寫到硬盤上。

這個選項打開時,對於一個大的連續的文件寫入速度非常有幫助。但如果您遇到有很多行程延滯在等待寫入動作時,您可能必須關閉這個功能。

############################

net.local.stream.sendspace: 8192

##################################

本地套接字連接的數據發送空間

建議設置為65536

###################################

net.local.stream.recvspace: 8192

##################################

本地套接字連接的數據接收空間

建議設置為65536

###################################

net.inet.ip.portrange.lowfirst: 1023

net.inet.ip.portrange.lowlast: 600

net.inet.ip.portrange.first: 49152

net.inet.ip.portrange.last: 65535

net.inet.ip.portrange.hifirst: 49152

net.inet.ip.portrange.hilast: 65535

###################

以上六項是用來控制TCP及UDP所使用的port范圍,這個范圍被分成三個部份,低范圍、預設范圍、及高范圍。

這些是你的服務器主動發起連接時的臨時端口的范圍,預設的已經1萬多了,一般的應用就足夠了。

如果是比較忙碌的FTP server,一般也不會同時提供給1萬多人訪問的,

當然如果很不幸,你的服務器就要提供很多,那么可以修改first的值,比如直接用1024開始

#########################

net.inet.ip.redirect: 1

#########################

設置為0,屏蔽ip重定向功能

###########################

net.inet.ip.rtexpire: 3600

net.inet.ip.rtminexpire: 10

########################

很多apache產生的CLOSE_WAIT狀態,這種狀態是等待客戶端關閉,但是客戶端那邊並沒有正常的關閉,於是留下很多這樣的東東。

建議都修改為2

#########################

以上內容未經本站驗證,請在使用之前使用sysctl grep option對選項默認值進行查找,對於命令無法搜索到的選項請謹慎操作,可能導致無法啟動系統或者系統某些功能異常.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM