Linux核心引數調優

Michael_DD發表於2015-01-05
Linux核心引數調優


###################
所有rfc相關的選項都是預設啟用的,因此網上的那些還自己寫rfc支援的都可以扔掉了
############################### 
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



#########################  
net.inet.ip.intr_queue_maxlen: 50
Maximum size of the IP input queue,

如果下面的net.inet.ip.intr_queue_drops一直在增加,
那就說明你的佇列空間不足了,那麼可以考慮增加該值。


##########################
net.inet.ip.intr_queue_drops: 0

Number of packets dropped from the IP input queue,如果你sysctl它一直在增加, 那麼增加net.inet.ip.intr_queue_maxlen的值。



#######################  
net.inet.ip.fastforwarding: 0


如果開啟的話每個目標地址一次轉發成功以後它的資料都將被記錄進路由表和arp資料表,節約路由的計算時間
但會需要大量的核心記憶體空間來儲存路由表。 如果記憶體夠大,開啟吧,呵呵


#############################  
net.inet.ip.random_id: 0

預設情況下,ip包的id號是連續的,而這些可能會被攻擊者利用,比如可以知道你nat後面帶了多少主機。
如果設定成1,則這個id號是隨機的,嘿嘿。


##################### 
net.inet.icmp.maskrepl: 0

防止廣播風暴,關閉其他廣播探測的響應。預設即是,無須修改。


 
############################### 
net.inet.icmp.icmplim: 200

限制系統傳送ICMP速率,改為100吧,或者保留也可,並不會給系統帶來太大的壓力。


 
###########################
net.inet.icmp.icmplim_output: 1
 
如果設定成0,就不會看到提示說Limiting icmp unreach response from 214 to 200 packets per second 等等了
不過禁止輸出容易讓我們忽視攻擊的存在。這個自己看著辦吧。



###################################### 
net.inet.icmp.drop_redirect: 0 net.inet.icmp.log_redirect: 0
 
設定為1,遮蔽ICMP重定向功能


 
###################################
net.inet.icmp.bmcastecho: 0


防止廣播風暴,關閉廣播ECHO響應,預設即是,無須修改。

 
###############################  
net.inet.tcp.mssdflt: 512 net.inet.tcp.minmss: 216

 
資料包資料段最小值,以上兩個選項最好不動!或者只修改mssdflt為1460,minmss不動。 原因詳見/security/2007/1211/article_4.html

 
############################# 
net.inet.tcp.keepidle: 7200000

TCP的套接字的空閒時間,預設時間太長,可以改為600000(10分鐘)。


########################## 
net.inet.tcp.sendspace: 32768


最大的待傳送TCP資料緩衝區空間,應用程式將資料放到這裡就認為傳送成功了,系統TCP堆疊保證資料的正常傳送。


 
####################################
net.inet.tcp.recvspace: 65536

最大的接受TCP緩衝區空間,系統從這裡將資料分發給不同的套接字,增大該空間可提高系統瞬間接受資料的能力以提高效能。


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


#########################
net.inet.udp.maxdgram: 9216
 
最大的傳送UDP資料緩衝區大小,網上的資料大多都是65536,我個人認為沒多大必要, 如果要調整,可以試試24576。


##############################
net.inet.udp.recvspace: 42080

最大的接受UDP緩衝區大小,網上的資料大多都是65536,我個人認為沒多大必要, 如果要調整,可以試試49152。

以上四項配置通常不會導致問題,一般說來網路流量是不對稱的,因此應該根據實際情況調整,並觀察其效果。
如果我們將傳送或接收的暫存區設為大於 65535,除非伺服器本身及客戶端所使用的作業系統都支援 TCP 協議的 windows scaling extension
(請參考 RFC 1323 檔案)。 FreeBSD預設已支援 rfs1323 (即 sysctl 的 net.inet.tcp.rfc1323 選項)。


###################################################  
net.inet.tcp.log_in_vain: 0

記錄下任何TCP連線,這個一般情況下不應該更改。

#################### 
net.inet.tcp.blackhole: 0
 
建議設定為2,接收到一個已經關閉的埠發來的所有包,直接drop,如果設定為1則是隻針對TCP包

 
##################################### 
net.inet.tcp.delayed_ack: 1

當一臺計算機發起TCP連線請求時,系統會回應ACK應答資料包。
該選項設定是否延遲ACK應答資料包,把它和包含資料的資料包一起傳送。
在高速網路和低負載的情況下會略微提高效能,但在網路連線較差的時候, 對方計算機得不到應答會持續發起連線請求,
反而會讓網路更加擁堵,降低效能。 因此這個值我建議您看情況而定,如果您的網速不是問題,可以將封包數量減少一半
如果網路不是特別好,那麼就設定為0,有請求就先回應,這樣其實浪費的網通、電信的頻寬速率而不是你的處理時間

 
############################  
net.inet.tcp.inflight.enable: 1
net.inet.tcp.inflight.debug: 0
net.inet.tcp.inflight.rttthresh: 10
net.inet.tcp.inflight.min: 6144
net.inet.tcp.inflight.max: 1073725440
net.inet.tcp.inflight.stab: 20


限制 TCP 頻寬延遲積和 NetBSD 的 TCP/Vegas 類似。
它可以透過將 sysctl 變數 net.inet.tcp.inflight.enable 設定成 1 來啟用。 系統將嘗試計算每一個連線的頻寬延遲積,
並將排隊的資料量限制在恰好能保持最優吞吐量的水平上。
這一特性在您的伺服器同時向使用普通調變解調器,千兆乙太網,乃至更高速度的光與網路連線 (或其他頻寬延遲積很大的連線) 的時候尤為重要,
特別是當您同時使用滑動窗縮放,或使用了大的傳送視窗的時候。
如果啟用了這個選項,您還應該把 net.inet.tcp.inflight.debug 設定為 0 (禁用除錯), 對於生產環境而言,
將 net.inet.tcp.inflight.min 設定成至少 6144 會很有好處。 然而, 需要注意的是,這個值設定過大事實上相當於禁用了連線頻寬延遲積限制功能。
這個限制特性減少了在路由和交換包佇列的堵塞資料數量,也減少了在本地主機介面佇列阻塞的資料的數量。
在少數的等候佇列中、互動式連線,尤其是透過慢速的調變解調器,也能用低的 往返時間操作。
但是,注意這隻影響到資料傳送 (上載/服務端)。對??萁郵?(下載)沒有效果。 調整 net.inet.tcp.inflight.stab 是 不 推薦的。
這個引數的預設值是 20,表示把 2 個最大包加入到頻寬延遲積視窗的計算中。 額外的視窗似的演算法更為穩定,並改善對於多變網路環境的相應能力,
但也會導致慢速連線下的 ping 時間增長 (儘管還是會比沒有使用 inflight 演算法低許多)。
對於這些情形, 您可能會希望把這個引數減少到 15, 10, 或 5;
並可能因此而不得不減少 net.inet.tcp.inflight.min (比如說, 3500) 來得到希望的效果。
減少這些引數的值, 只應作為最後不得已時的手段來使用。


############################ 
net.inet.tcp.syncookies: 1

SYN cookies是一種用於透過選擇加密的初始化TCP序列號,可以對回應的包做驗證來降低SYN'洪水'攻擊的影響的技術。 預設即是,不需修改


########################  
net.inet.tcp.msl: 30000

這個值網上很多文章都推薦的7500,
還可以改的更小一些(如2000或2500),這樣可以加快不正常連線的釋放過程(三次握手2秒、FIN_WAIT4秒)。

 
#########################
net.inet.tcp.always_keepalive: 1

幫助系統清除沒有正常斷開的TCP連線,這增加了一些網路頻寬的使用,但是一些死掉的連線最終能被識別並清除。
死的TCP連線是被撥號使用者存取的系統的一個特別的問題,因為使用者經常斷開modem而不正確的關閉活動的連線。

 
############################# 
net.inet.udp.checksum: 1


防止不正確的udp包的攻擊,預設即是,不需修改


############################## 
net.inet.udp.log_in_vain: 0

記錄下任何UDP連線,這個一般情況下不應該修改。


####################### 
net.inet.udp.blackhole: 0

建議設定為1,接收到一個已經關閉的埠發來的所有UDP包直接drop



#######################  
net.inet.raw.maxdgram: 8192

Maximum outgoing raw IP datagram size 很多文章建議設定為65536,好像沒多大必要。

 
######################################
net.inet.raw.recvspace: 8192

Maximum incoming raw IP datagram size 很多文章建議設定為65536,好像沒多大必要。
 

####################### 
net.link.ether.inet.max_age: 1200

調整ARP清理的時間,透過向IP路由緩衝填充偽造的ARP條目可以讓惡意使用者產生資源耗竭和效能減低攻擊。
這項似乎大家都未做改動,我建議不動或者稍微減少,比如300(HP-UX預設的5分鐘)


####################### 
net.inet6.ip6.redirect: 1
 
設定為0,遮蔽ipv6重定向功能



###########################  
net.isr.direct: 0


所有MPSAFE的網路ISR對包做立即響應,提高網路卡效能,設定為1。


####################################  
hw.ata.wc: 1

這個選項用來開啟 IDE 硬碟快取。當開啟時,如果有資料要寫入硬碟時,硬碟會假裝已完成寫入,並將資料快取起來。
這種作法會加速硬碟的存取速度,但當系統異常關機時,比較容易造成資料遺失。 不過由於關閉這個功能所帶來的速度差異實在太大,
建議還是保留原本開啟的狀態吧,不做修改。


###################  
security.bsd.see_other_uids: 1 security.bsd.see_other_gids: 1
 
不允許使用者看到其他使用者的程式,因此應該改成0,





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

相關文章