linux核心引數最佳化(七)

紫翼龍王夜發表於2015-04-08

1Linux核心引數最佳化

     核心引數是使用者和系統核心之間互動的一個介面,透過這個介面,使用者可以在系統執行的同時動態更新核心配置,而這些核心引數是透過Linux Proc檔案系統存在的。因此,可以透過調整Proc檔案系統達到最佳化Linux效能的目的。

一、sysctl命令

sysctl命令用來配置與顯示在/proc/sys目錄中的核心引數.如果想使引數長期儲存,可以透過編輯/etc/sysctl.conf檔案來實現。

 

 命令格式:

 sysctl [-n] [-e] -w variable=value

 sysctl [-n] [-e] -p (default /etc/sysctl.conf)

 sysctl [-n] [-e] –a

 

常用引數的意義:

 -w  臨時改變某個指定引數的值,如

        # sysctl -w net.ipv4.ip_forward=1

 -a  顯示所有的系統引數

 -p從指定的檔案載入系統引數,預設從/etc/sysctl.conf 檔案中載入,如:

# echo 1 > /proc/sys/net/ipv4/ip_forward

# sysctl -w net.ipv4.ip_forward=1

 以上兩種方法都可能立即開啟路由功能,但如果系統重啟,或執行了

     # service network restart

命令,所設定的值即會丟失,如果想永久保留配置,可以修改/etc/sysctl.conf檔案,將 net.ipv4.ip_forward=0改為net.ipv4.ip_forward=1

 

二、linux核心引數調整:linux 核心引數調整有兩種方式

 

方法一:修改/proc下核心引數檔案內容,不能使用編輯器來修改核心引數檔案,理由是由於核心隨時可能更改這些檔案中的任意一個,另外,這些核心引數檔案都是虛擬檔案,實際中不存在,因此不能使用編輯器進行編輯,而是使用echo命令,然後從命令列將輸出重定向至 /proc 下所選定的檔案中。如:將 timeout_timewait 引數設定為30秒:

# echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout

引數修改後立即生效,但是重啟系統後,該引數又恢復成預設值。因此,想永久更改核心引數,需要修改/etc/sysctl.conf檔案

 

   方法二.修改/etc/sysctl.conf檔案。檢查sysctl.conf檔案,如果已經包含需要修改的引數,則修改該引數的值,如果沒有需要修改的引數,在sysctl.conf檔案中新增引數。如:

   net.ipv4.tcp_fin_timeout=30

儲存退出後,可以重啟機器使引數生效,如果想使引數馬上生效,也可以執行如下命令:

   # sysctl  -p
三、sysctl.conf

 檔案中引數設定及說明

1、常見配置

1.  net.ipv4.ip_local_port_range = 1024 65536    

2.  net.core.rmem_max=16777216   

3.  net.core.wmem_max=16777216   

4.  net.ipv4.tcp_rmem=4096 87380 16777216    

5.  net.ipv4.tcp_wmem=4096 65536 16777216    

6.  net.ipv4.tcp_fin_timeout = 30   

7.  net.core.netdev_max_backlog = 30000   

8.  net.ipv4.tcp_no_metrics_save=1   

9.  net.core.somaxconn = 262144   

10. net.ipv4.tcp_syncookies = 1   

11. net.ipv4.tcp_max_orphans = 262144   

12. net.ipv4.tcp_max_syn_backlog = 262144   

13. net.ipv4.tcp_synack_retries = 2   

14. net.ipv4.tcp_syn_retries = 2   

 

net.ipv4.ip_local_port_range:用來指定外部連線的埠範圍,預設是32 76861 000,這裡設定為102465 536

net.core.rmem_max:指定接收套接字緩衝區大小的最大值,單位是位元組。

net.core.wmem_max:指定傳送套接字緩衝區大小的最大值,單位是位元組。

net.ipv4.tcp_rmem:此引數與net.ipv4.tcp_wmem都是用來最佳化TCP接收/傳送緩衝區的,包含3個整數值,分別是mindefaultmax

對於tcp_rmemmin表示為TCP socket預留的用於接收快取的最小記憶體數量,default表示為TCP socket預留的用於接收快取的預設的記憶體值,max表示用於TCP socket接收快取的記憶體最大值。

對於tcp_wmemmin表示為TCP socket預留的用於傳送快取的記憶體最小值,default表示為TCP socket預留的用於傳送快取的預設的記憶體值,max表示用於TCP socket傳送快取的記憶體最大值。

net.ipv4.tcp_fin_timeout:此引數用於減少處於FIN-WAIT-2連線狀態的時間,使系統可以處理更多的連線。此引數值為整數,單位為秒。

例如,在一個tcp會話過程中,在會話結束時,A首先向B傳送一個fin包,在獲得Back確認包後,A就進入FIN-WAIT-2狀態等待Bfin包,然後給Back確認包。net.ipv4.tcp_fin_timeout引數用來設定A進入FIN-WAIT-2狀態等待對方fin包的超時時間。如果時間到了仍未收到對方的fin包就主動釋放該會話。

net.core.netdev_max_backlog:該參數列示當在每個網路介面接收資料包的速率比核心處理這些包的速率快時,允許傳送到佇列的資料包的最大數量。

net.ipv4.tcp_syncookies:表示是否開啟SYN Cookietcp_syncookies是一個開關,該引數的功能有助於保護伺服器免受SyncFlood攻擊。預設值為0,這裡設定為1

net.ipv4.tcp_max_orphans:表示系統中最多有多少TCP套接字不被關聯到任何一個使用者檔案控制程式碼上。如果超過這裡設定的數字,連線就會復位並輸出警告資訊。這個限制僅僅是為了防止簡單的DoS攻擊。此值不能太小。這裡設定為262 144

net.ipv4.tcp_max_syn_backlog:表示SYN佇列的長度,預設為1024,這裡設定佇列長度為262 144,以容納更多的等待連線。

net.ipv4.tcp_synack_retries:這個引數用於設定核心放棄連線之前傳送SYN+ACK包的數量。

net.ipv4.tcp_syn_retries:此參數列示在核心放棄建立連線之前傳送SYN包的數量。

 

四、Linux核心最佳化之TCP/IP相關引數

  所有的TCP/IP調優引數都位於/proc/sys/net/目錄。 例如, 下面是最重要的一些調優引數, 後面是它們的含義:
  1. /proc/sys/net/core/rmem_max — 最大的TCP資料接收緩衝
  2. /proc/sys/net/core/wmem_max — 最大的TCP資料傳送緩衝
  3. /proc/sys/net/ipv4/tcp_timestamps — 時間戳在(請參考RFC 1323)TCP的包頭增加12個位元組
  4. /proc/sys/net/ipv4/tcp_sack — 有選擇的應答
  5. /proc/sys/net/ipv4/tcp_window_scaling — 支援更大的TCP視窗。 如果TCP視窗最大超過65535(64K), 必須設定該數值為1
  6. rmem_default — 預設的接收視窗大小
  7. rmem_max — 接收視窗的最大大小
  8. wmem_default — 預設的傳送視窗大小
  9. wmem_max — 傳送視窗的最大大小
  /proc目錄下的所有內容都是臨時性的, 所以重啟動系統後任何修改都會丟失。
  建議在系統啟動時自動修改TCP/IP引數:

  把下面程式碼增加到/etc/rc.local檔案, 然後儲存檔案, 系統重新引導的時候會自動修改下面的TCP/IP引數:
  echo 256960 > /proc/sys/net/core/rmem_default
  echo 256960 > /proc/sys/net/core/rmem_max
  echo 256960 > /proc/sys/net/core/wmem_default
  echo 256960 > /proc/sys/net/core/wmem_max
  echo 0 > /proc/sys/net/ipv4/tcp_timestamps
  echo 1 > /proc/sys/net/ipv4/tcp_sack
  echo 1 > /proc/sys/net/ipv4/tcp_window_scaling

  TCP/IP引數都是自解釋的, TCP視窗大小設定為256960, 禁止TCP的時間戳(取消在每個資料包的頭中增加12位元組), 支援更大的TCP視窗和TCP有選擇的應答。
  上面數值的設定是根據互連網連線和最大頻寬/延遲率來決定。
  注: 上面例項中的數值可以實際應用, 但它只包含了一部分引數。

  另外一個方法: 使用 /etc/sysctl.conf 在系統啟動時將引數配置成您所設定的值:
  net.core.rmem_default = 256960
  net.core.rmem_max = 256960
  net.core.wmem_default = 256960
  net.core.wmem_max = 256960
  net.ipv4.tcp_timestamps = 0
  net.ipv4.tcp_sack =1
  net.ipv4.tcp_window_scaling = 1

=========================================================================

 

tcp_syn_retries:INTEGER
預設值是5
對於一個新建連線,核心要傳送多少個 SYN 連線請求才決定放棄。不應該大於255,預設值是5,對應於180秒左右時間。(對於大負載而物理通訊良好的網路而言,這個值偏高,可修改為2.這個值僅僅是針對對外的連線,對進來的連線,是由tcp_retries1決定的)


tcp_synack_retries:INTEGER
預設值是5
對於遠端的連線請求SYN,核心會傳送SYN ACK資料包,以確認收到上一個 SYN連線請求包。這是所謂的三次握手( threewayhandshake)機制的第二個步驟。這裡決定核心在放棄連線之前所送出的 SYN+ACK 數目。不應該大於255,預設值是5,對應於180秒左右時間。(可以根據上面的tcp_syn_retries來決定這個值)


tcp_keepalive_time:INTEGER
預設值是7200(2小時)
keepalive開啟的情況下,TCP傳送keepalive訊息的頻率。(由於目前網路攻擊等因素,造成了利用這個進行的攻擊很頻繁,曾經也有cu的朋友提到過,說如果2邊建立了連線,然後不傳送任何資料或者rst/fin訊息,那麼持續的時間是不是就是2小時,空連線攻擊?tcp_keepalive_time就是預防此情形的.我個人在做nat服務的時候的修改值為1800)


tcp_keepalive_probesINTEGER
預設值是9
TCP傳送keepalive探測以確定該連線已經斷開的次數。(注意:保持連線僅在SO_KEEPALIVE套接字選項被開啟是才傳送.次數預設不需要修改,當然根據情形也可以適當地縮短此值.設定為5比較合適)


tcp_keepalive_intvl:INTEGER
預設值為75
探測訊息傳送的頻率,乘以tcp_keepalive_probes就得到對於從開始探測以來沒有響應的連線殺除的時間。預設值為75秒,也就是沒有活動的連線將在大約11分鐘以後將被丟棄。(對於普通應用來說,這個值有一些偏大,可以根據需要改小.特別是web類伺服器需要改小該值,15是個比較合適的值)


tcp_retries1:INTEGER
預設值是3
放棄回應一個TCP連線請求前﹐需要進行多少次重試。RFC 規定最低的數值是3﹐這也是預設值﹐根據RTO的值大約在3 - 8分鐘之間。(注意:這個值同時還決定進入的syn連線)


tcp_retries2:INTEGER
預設值為15
在丟棄啟用(已建立通訊狀況)TCP連線之前﹐需要進行多少次重試。預設值為15,根據RTO的值來決定,相當於13-30分鐘(RFC1122規定,必須大於100).(這個值根據目前的網路設定,可以適當地改小,我的網路內修改為了5)


tcp_orphan_retries:INTEGER
預設值是7
在近端丟棄TCP連線之前﹐要進行多少次重試。預設值是7個﹐相當於 50 - 16分鐘﹐視 RTO 而定。如果您的系統是負載很大的web伺服器﹐那麼也許需要降低該值﹐這類 sockets 可能會耗費大量的資源。另外參的考tcp_max_orphans(事實上做NAT的時候,降低該值也是好處顯著的,我本人的網路環境中降低該值為3)


tcp_fin_timeout:INTEGER
預設值是60
對於本端斷開的socket連線,TCP保持在FIN-WAIT-2狀態的時間。對方可能會斷開連線或一直不結束連線或不可預料的程式死亡。預設值為60秒。過去在2.2版本的核心中是 180 秒。您可以設定該值﹐但需要注意﹐如果您的機器為負載很重的web伺服器﹐您可能要冒記憶體被大量無效資料包填滿的風險﹐FIN-WAIT-2 sockets 的危險性低於 FIN-WAIT-1 ﹐因為它們最多隻吃 1.5K 的記憶體﹐但是它們存在時間更長。另外參考tcp_max_orphans(事實上做NAT的時候,降低該值也是好處顯著的,我本人的網路環境中降低該值為30)


tcp_max_tw_buckets:INTEGER
預設值是180000
系統在同時所處理的最大 timewaitsockets 數目。如果超過此數的話﹐time-wait socket 會被立即砍除並且顯示警告資訊。之所以要設定這個限制﹐純粹為了抵禦那些簡單的 DoS 攻擊﹐千萬不要人為的降低這個限制﹐不過﹐如果網路條件需要比預設值更多﹐則可以提高它(或許還要增加記憶體)(事實上做NAT的時候最好可以適當地增加該值)


tcp_tw_recycle:BOOLEAN
預設值是0
開啟快速 TIME-WAITsockets 回收。除非得到技術專家的建議或要求﹐請不要隨意修改這個值。(NAT的時候,建議開啟它)
 
tcp_tw_reuse:BOOLEAN
預設值是0
該檔案表示是否允許重新應用處於TIME-WAIT狀態的socket用於新的TCP連線(這個對快速重啟動某些服務,而啟動後提示埠已經被使用的情形非常有幫助)
tcp_max_orphans:INTEGER
預設值是8192
系統所能處理不屬於任何程式的TCP sockets

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

相關文章