Linux內核優化參數

主要是指在Linux系統中針對服務應用而進行的系統內核參數調整,優化沒有的標準,根據實際需求優化纔是最合適的。

1、編輯內核配置文件

vim /etc/sysctl.conf     #添加或是修改以下參數

2、參數及簡單說明

net.ipv4.tcp_fin_timeout = 2           #保持在FIN-WAIT-2狀態的時間,使系統可以處理更多的連接。此參數值爲整數,單位爲秒。
net.ipv4.tcp_tw_reuse = 1              #開啓重用,允許將TIME_WAIT socket用於新的TCP連接。默認爲0,表示關閉。
net.ipv4.tcp_tw_recycle = 1            #開啓TCP連接中TIME_WAIT socket的快速回收。默認值爲0,表示關閉。
net.ipv4.tcp_syncookies = 1            #開啓SYN cookie,出現SYN等待隊列溢出時啓用cookie處理,防範少量的SYN攻擊。默認爲0,表示關閉。
net.ipv4.tcp_keepalive_time = 600      #keepalived啓用時TCP發送keepalived消息的拼度。默認位2小時。
net.ipv4.tcp_keepalive_probes = 5      #TCP發送keepalive探測以確定該連接已經斷開的次數。根據情形也可以適當地縮短此值。
net.ipv4.tcp_keepalive_intvl = 15      #探測消息發送的頻率,乘以tcp_keepalive_probes就得到對於從開始探測以來沒有響應的連接殺除的時間。默認值爲75秒,也就是沒有活動的連接將在大約11分鐘以後將被丟棄。對於普通應用來說,這個值有一些偏大,可以根據需要改小.特別是web類服務器需要改小該值。
net.ipv4.ip_local_port_range = 1024 65000 #指定外部連接的端口範圍。默認值爲32768 61000。
net.ipv4.tcp_max_syn_backlog = 262144  #表示SYN隊列的長度,預設爲1024,這裏設置隊列長度爲262 144,以容納更多的等待連接。
net.ipv4.tcp_max_tw_buckets =5000      #系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數值將立刻被清楚並輸出警告信息。默認值爲180000。對於squid來說效果不是很大,但可以控制TIME_WAIT套接字最大值,避免squid服務器被拖死。 
net.ipv4.tcp_syn_retries = 1           #表示在內核放棄建立連接之前發送SYN包的數量。
net.ipv4.tcp_synack_retries = 1        #設置內核放棄連接之前發送SYN+ACK包的數量。
net.core.somaxconn = 16384             #定義了系統中每一個端口最大的監聽隊列的長度, 對於一個經常處理新連接的高負載 web服務環境來說,默認值爲128,偏小。
net.core.netdev_max_backlog = 16384    #表示當在每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許發送到隊列的數據包的最大數量。
net.ipv4.tcp_max_orphans = 16384       #表示系統中最多有多少TCP套接字不被關聯到任何一個用戶文件句柄上。如果超過這裏設置的數字,連接就會復位並輸出警告信息。這個限制僅僅是爲了防止簡單的DoS攻擊。此值不能太小。 

3、客戶端的典型狀態轉移參數

處於FIN_WAIT_2狀態的客戶端需要等待服務器發送結束報文段,才能轉移至TIME_WAIT狀態,否則它將一直停留在這個狀態。如果不是爲了在半關閉狀態下繼續接收數據,連接長時間地停留在FIN_WAIT_2狀態並無益處。連接停留在FIN_WAIT_2狀態的情況可能發生在:客戶端執行半關閉後,未等服務器關閉連接就強行退出了。此時客戶端連接由內核來接管,可稱之爲孤兒連接(和孤兒進程類似)。
Linux爲了防止孤兒連接長時間存留在內核中,定義了兩個內核參數:
/proc/sys/net/ipv4/tcp_max_orphans  #指定內核能接管的孤兒連接數目
/proc/sys/net/ipv4/tcp_fin_timeout  #指定孤兒連接在內核中生存的時間

4、TCP重傳參數

1、異常網絡狀況下(開始出現超時或丟包),TCP控制數據傳輸以保證其承諾的可靠服務。

2、TCP服務必須能夠重傳超時時間內未收到確認的TCP報文段。爲此,TCP模塊爲每個TCP報文段都維護一個重傳定時器,該定時器在TCP報文段第一次被髮送時啓動。如果超時時間內未收到接收方的應答,TCP模塊將重傳TCP報文段並重置定時器。至於下次重傳的超時時間如何選擇,以及最多執行多少次重傳,就是TCP的重傳策略。

與TCP超時重傳相關的兩個內核參數:

/proc/sys/net/ipv4/tcp_retries1,指定在底層IP接管之前TCP最少執行的重傳次數,默認值是3
/proc/sys/net/ipv4/tcp_retries2,指定連接放棄前TCP最多可以執行的重傳次數,默認值15(一般對應13~30min)  

5、實現Nginx高併發的內核參數優化

默認的Linux內核參數考慮的是最通用場景,不符合用於支持高併發訪問的Web服務器的定義,根據業務特點來進行調整,當Nginx作爲靜態web內容服務器、反向代理或者提供壓縮服務器的服務器時,內核參數的調整都是不同的,此處針對最通用的、使Nginx支持更多併發請求的TCP網絡參數做簡單的配置,修改/etc/sysctl.conf來更改內核參數:
 
fs.file-max = 1000000
#表示單個進程較大可以打開的句柄數
 
 
net.ipv4.tcp_tw_reuse = 1
#參數設置爲 1 ,表示允許將TIME_WAIT狀態的socket重新用於新的TCP鏈接,這對於服務器來說意義重大,因爲總有大量TIME_WAIT狀態的鏈接存在
 
 
net.ipv4.tcp_keepalive_time = 600
#當keepalive啓動時,TCP發送keepalive消息的頻度;默認是2小時,將其設置爲10分鐘,可更快的清理無效鏈接
 
 
net.ipv4.tcp_fin_timeout = 30
#當服務器主動關閉鏈接時,socket保持在FIN_WAIT_2狀態的較大時間
 
 
net.ipv4.tcp_max_tw_buckets = 5000
#表示操作系統允許TIME_WAIT套接字數量的較大值,如超過此值,TIME_WAIT套接字將立刻被清除並打印警告信息,默認爲8000,過多的TIME_WAIT套接字會使Web服務器變慢
 
 
net.ipv4.ip_local_port_range = 1024 65000
#定義UDP和TCP鏈接的本地端口的取值範圍
 
 
net.ipv4.tcp_rmem = 10240 87380 12582912
#定義了TCP接受緩存的最小值、默認值、較大值
 
 
net.ipv4.tcp_wmem = 10240 87380 12582912
#定義TCP發送緩存的最小值、默認值、較大值
 
net.core.netdev_max_backlog = 8096
#當網卡接收數據包的速度大於內核處理速度時,會有一個列隊保存這些數據包。這個參數表示該列隊的較大值
 
 
net.core.rmem_default = 6291456
#表示內核套接字接受緩存區默認大小
 
 
net.core.wmem_default = 6291456
#表示內核套接字發送緩存區默認大小
 
 
net.core.rmem_max = 12582912
#表示內核套接字接受緩存區較大大小
 
 
net.core.wmem_max = 12582912
#表示內核套接字發送緩存區較大大小
注意:以上的四個參數,需要根據業務邏輯和實際的硬件成本來綜合考慮
 
 
net.ipv4.tcp_syncookies = 1
#與性能無關。用於解決TCP的SYN攻擊
 
 
net.ipv4.tcp_max_syn_backlog = 8192
#這個參數表示TCP三次握手建立階段接受SYN請求列隊的較大長度,默認1024,將其設置的大一些可使出現Nginx繁忙來不及accept新連接時,Linux不至於丟失客戶端發起的鏈接請求
 
 
net.ipv4.tcp_tw_recycle = 1
#這個參數用於設置啓用timewait快速回收
 
 
net.core.somaxconn=262114
#選項默認值是128,這個參數用於調節系統同時發起的TCP連接數,在高併發的請求中,默認的值可能會導致鏈接超時或者重傳,因此需要結合高併發請求數來調節此值。
 
 
net.ipv4.tcp_max_orphans=262114
#選項用於設定系統中最多有多少個TCP套接字不被關聯到任何一個用戶文件句柄上。如果超過這個數字,孤立鏈接將立即被複位並輸出警告信息。這個限制指示爲了防止簡單的DOS攻擊,不用過分依靠這個限制甚至認爲的減小這個值,更多的情況是增加這個值

生效配置

 sysctl  -p

  



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章