1. 程式人生 > >Linux TCP/IP調優-Linux內核參數註釋

Linux TCP/IP調優-Linux內核參數註釋

單獨 keepalive cep ans 作用 必須 reset sequence bsd

固定文件的內核參數

下列文件所在目錄:

/proc/sys/net/ipv4/
名稱默認值建議值描述
tcpsyn_retries 5 1 對於一個新建連接,內核要發送多少個SYN連接請求才決定放棄。不應該大於255,默認值是5,對應於180毫秒左右時間。(對於大負載而物理通信良好的網絡來說,這個值偏高,可以修改為2。這個值僅僅是針對對外的連接,對進來的連接,是由tcp_retries1決定)
tcp_synack_retries 5 1 對於遠端的連接請求SYN,內核會發送SYN+ACK數據包,以確認收到上一個SYN連接請求包。這是所謂的三次握手機制的第二個步驟。這裏決定內核再放棄之前所發送出的SYN+ACK數目。不應該大於255,默認值是5,對應於180秒左右時間。
tcp_keepalive_time 7200 600 TCP發送keepalive探測消息的間隔時間(秒),用於確認TCP連接是否有效。防止兩邊建立連接但不發送數據的攻擊。
tcp_keepalive_probes 9 3 TCP發送keepalive探測消息的間隔時間(秒),用於確認TCP連接是否有效。
tcp_keepalive_intvl 74 15 探測消息未獲得響應時,重發該消息的間隔時間(秒)。默認值為75秒。 (對於普通應用來說,這個值有一些偏大,可以根據需要改小.特別是web類服務器需要改小該值,15是個比較合適的值)
tcp_retries1 3 3 放棄回應一個TCP連接請求前﹐需要進行多少次重試
。RFC 規定最低的數值是3
tcp_retries2 15 5 在丟棄激活(已建立通訊狀況)的TCP連接之前﹐需要進行多少次重試。默認值為15,根據RTO的值來決定,相當於13-30分鐘(RFC1122規定,必須大於100秒).(這個值根據目前的網絡設置,可以適當地改小,我的網絡內修改為了5)
tcp_orphan_retries 7 3 在近端丟棄TCP連接之前﹐要進行多少次重試。默認值是7個﹐相當於 50秒 - 16分鐘﹐視 RTO 而定。如果您的系統是負載很大的web服務器﹐那麽也許需要降低該值﹐這類 sockets 可能會耗費大量的資源。另外參的考tcp_max_orphans。(事實上做NAT的時候,降低該值也是好處顯著的,我本人的網絡環境中降低該值為3)
tcp_fin_timeout 60 2 對於本端斷開的socket連接,TCP保持在FIN-WAIT-2狀態的時間。對方可能會斷開連接或一直不結束連接或不可預料的進程死亡。默認值為 60 秒
tcp_max_tw_buckets 180000 36000 系統在同時所處理的最大 timewait sockets 數目。如果超過此數的話﹐time-wait socket 會被立即砍除並且顯示警告信息。之所以要設定這個限制﹐純粹為了抵禦那些簡單的 DoS 攻擊﹐不過﹐如果網絡條件需要比默認值更多﹐則可以提高它(或許還要增加內存)。(事實上做NAT的時候最好可以適當地增加該值)
tcp_tw_recycle 0 1 打開快速 TIME-WAIT sockets 回收。除非得到技術專家的建議或要求﹐請不要隨意修改這個值。(做NAT的時候,建議打開它)
tcp_tw_reuse 0 1 表示是否允許重新應用處於TIME-WAIT狀態的socket用於新的TCP連接(這個對快速重啟動某些服務,而啟動後提示端口已經被使用的情形非常有幫助)
tcp_max_orphans 8192 32768 系統所能處理不屬於任何進程的TCP sockets最大數量。假如超過這個數量﹐那麽不屬於任何進程的連接會被立即reset,並同時顯示警告信息。之所以要設定這個限制﹐純粹為了抵禦那些簡單的 DoS 攻擊﹐千萬不要依賴這個或是人為的降低這個限制。如果內存大更應該增加這個值。(這個值Redhat AS版本中設置為32768,但是很多防火墻修改的時候,建議該值修改為2000)
tcp_abort_on_overflow 0 0 當守護進程太忙而不能接受新的連接,就象對方發送reset消息,默認值是false。這意味著當溢出的原因是因為一個偶然的猝發,那麽連接將恢復狀態。只有在你確信守護進程真的不能完成連接請求時才打開該選項,該選項會影響客戶的使用。(對待已經滿載的sendmail,apache這類服務的時候,這個可以很快讓客戶端終止連接,可以給予服務程序處理已有連接的緩沖機會,所以很多防火墻上推薦打開它)
tcp_synookies 0 1 只有在內核編譯時選擇了CONFIG_SYNCOOKIES時才會發生作用。當出現syn等候隊列出現溢出時象對方發送syncookies。目的是為了防止syn flood攻擊。
tcp_stdurg 0 0 使用 TCP urg pointer 字段中的主機請求解釋功能。大部份的主機都使用老舊的 BSD解釋,因此如果您在 Linux 打開它﹐或會導致不能和它們正確溝通。
tcp_max_syn_backlog 1024 16384 對於那些依然還未獲得客戶端確認的連接請求﹐需要保存在隊列中最大數目。對於超過 128Mb 內存的系統﹐默認值是 1024 ﹐低於 128Mb 的則為 128。如果服務器經常出現過載﹐可以嘗試增加這個數字。警告﹗假如您將此值設為大於 1024﹐最好修改include/net/tcp.h裏面的TCP_SYNQ_HSIZE﹐以保持TCP_SYNQ_HSIZE*16(SYN Flood攻擊利用TCP協議散布握手的缺陷,偽造虛假源IP地址發送大量TCP-SYN半打開連接到目標系統,最終導致目標系統Socket隊列資源耗盡而無法接受新的連接。為了應付這種攻擊,現代Unix系統中普遍采用多連接隊列處理的方式來緩沖(而不是解決)這種攻擊,是用一個基本隊列處理正常的完全連接應用(Connect()和Accept() ),是用另一個隊列單獨存放半打開連接。這種雙隊列處理方式和其他一些系統內核措施(例如Syn-Cookies/Caches)聯合應用時,能夠比較有效的緩解小規模的SYN Flood攻擊(事實證明)
tcp_window_scaling 1 1 該文件表示設置tcp/ip會話的滑動窗口大小是否可變。參數值為布爾值,為1時表示可變,為0時表示不可變。tcp/ip通常使用的窗口最大可達到 65535 字節,對於高速網絡,該值可能太小,這時候如果啟用了該功能,可以使tcp/ip滑動窗口大小增大數個數量級,從而提高數據傳輸的能力(RFC 1323)。(對普通地百M網絡而言,關閉會降低開銷,所以如果不是高速網絡,可以考慮設置為0)
tcp_timestamps 1 1 Timestamps 用在其它一些東西中﹐可以防範那些偽造的 sequence 號碼。一條1G的寬帶線路或許會重遇到帶 out-of-line數值的舊sequence 號碼(假如它是由於上次產生的)。Timestamp 會讓它知道這是個 ‘舊封包’。(該文件表示是否啟用以一種比超時重發更精確的方法(RFC 1323)來啟用對 RTT 的計算;為了實現更好的性能應該啟用這個選項。)
tcp_sack 1 1 使用 Selective ACK﹐它可以用來查找特定的遺失的數據報— 因此有助於快速恢復狀態。該文件表示是否啟用有選擇的應答(Selective Acknowledgment),這可以通過有選擇地應答亂序接收到的報文來提高性能(這樣可以讓發送者只發送丟失的報文段)。(對於廣域網通信來說這個選項應該啟用,但是這會增加對 CPU 的占用。)
tcp_fack 1 1 打開FACK擁塞避免和快速重傳功能。(註意,當tcp_sack設置為0的時候,這個值即使設置為1也無效)[這個是TCP連接靠譜的核心功能]
tcp_dsack 1 1 允許TCP發送”兩個完全相同”的SACK
tcp_ecn 0 0 TCP的直接擁塞通告功能
tcp_reordering 3 6 TCP流中重排序的數據報最大數量。 (一般有看到推薦把這個數值略微調整大一些,比如5)
tcp_retans_collapse 1 0 對於某些有bug的打印機提供針對其bug的兼容性。(一般不需要這個支持,可以關閉它)
tcp_wmem:mindefaultmax 4096 16384 131072 8192 131072 16777216 發送緩存設置min:為TCP socket預留用於發送緩沖的內存最小值。每個tcp socket都可以在建議以後都可以使用它。默認值為4096(4K)。 default:為TCP socket預留用於發送緩沖的內存數量,默認情況下該值會影響其它協議使用的net.core.wmem_default 值,一般要低於net.core.wmem_default的值。默認值為16384(16K)。 max: 用於TCP socket發送緩沖的內存最大值。該值不會影響net.core.wmem_max,”靜態”選擇參數SO_SNDBUF則不受該值影響。默認值為131072(128K)。(對於服務器而言,增加這個參數的值對於發送數據很有幫助,在我的網絡環境中,修改為了51200 131072 204800)
tcprmem:mindefaultmax 4096 87380 174760 32768 131072 16777216 接收緩存設置。同tcp_wmem
tcp_mem:mindefaultmax 根據內存計算 786432 1048576 1572864 low:當TCP使用了低於該值的內存頁面數時,TCP不會考慮釋放內存。即低於此值沒有內存壓力。(理想情況下,這個值應與指定給 tcp_wmem 的第 2 個值相匹配 - 這第 2 個值表明,最大頁面大小乘以最大並發請求數除以頁大小 (131072 300 / 4096)。 ) pressure:當TCP使用了超過該值的內存頁面數量時,TCP試圖穩定其內存使用,進入pressure模式,當內存消耗低於low值時則退出pressure狀態。(理想情況下這個值應該是 TCP 可以使用的總緩沖區大小的最大值 (204800 300 / 4096)。 ) high:允許所有tcp sockets用於排隊緩沖數據報的頁面量。(如果超過這個值,TCP 連接將被拒絕,這就是為什麽不要令其過於保守 (512000 300 / 4096) 的原因了。 在這種情況下,提供的價值很大,它能處理很多連接,是所預期的 2.5 倍;或者使現有連接能夠傳輸 2.5 倍的數據。 我的網絡裏為192000 300000 732000) *一般情況下這些值是在系統啟動時根據系統內存數量計算得到的
tcp_app_win 31 31 保留max(window/2^tcp_app_win, mss)數量的窗口由於應用緩沖。當為0時表示不需要緩沖。
tcp_adv_win_scale 2 2 計算緩沖開銷。 bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale > 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale BOOLEAN>0)
tcp_low_latency 0 0 允許 TCP/IP 棧適應在高吞吐量情況下低延時的情況;這個選項一般情形是的禁用。(但在構建Beowulf 集群的時候,打開它很有幫助)
tcp_westwood 0 0 啟用發送者端的擁塞控制算法,它可以維護對吞吐量的評估,並試圖對帶寬的整體利用情況進行優化;對於 WAN 通信來說應該啟用這個選項
tcp_bic 0 0 為快速長距離網絡啟用 Binary Increase Congestion;這樣可以更好地利用以 GB 速度進行操作的鏈接;對於 WAN 通信應該啟用這個選項。
ip_forward 0 1 NAT必須開啟IP轉發支持,把該值寫1
ip_local_port_range:minmax 32768 61000 1024 65000 表示用於向外連接的端口範圍,默認比較小,這個範圍同樣會間接用於NAT表規模。
ip_conntrack_max 65535 65535 系統支持的最大ipv4連接數,默認65536(事實上這也是理論最大值),同時這個值和你的內存大小有關,如果內存128M,這個值最大8192,1G以上內存這個值都是默認65536

下列文件所在目錄:

/proc/sys/net/ipv4/netfilter/
名稱默認值建議值描述
ip_conntrack_max 65535 65535 系統支持的最大ipv4連接數,默認65536(事實上這也是理論最大值),同時這個值和你的內存大小有關,如果內存128M,這個值最大8192,1G以上內存這個值都是默認65536,這個值受/proc/sys/net/ipv4/ip_conntrack_max限制
ip_conntrack_tcp_timeout_established 432000 180 已建立的tcp連接的超時時間,默認432000,也就是5天。影響:這個值過大將導致一些可能已經不用的連接常駐於內存中,占用大量鏈接資源,從而可能導致NAT ip_conntrack: table full的問題。建議:對於NAT負載相對本機的 NAT表大小很緊張的時候,可能需要考慮縮小這個值,以盡早清除連接,保證有可用的連接資源;如果不緊張,不必修改
ip_conntrack_tcp_timeout_time_wait 120 120 time_wait狀態超時時間,超過該時間就清除該連接
ip_conntrack_tcp_timeout_close_wait 60 60 close_wait狀態超時時間,超過該時間就清除該連接
ip_conntrack_tcp_timeout_fin_wait 120 120 fin_wait狀態超時時間,超過該時間就清除該連接

下列文件所在目錄:

/proc/sys/net/core/
名稱默認值建議值描述
netdev_max_backlog 1024 16384 每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目,對重負載服務器而言,該值需要調高一點。
somaxconn 128 16384** 用來限制監聽(LISTEN)隊列最大數據包的數量,超過這個數量就會導致鏈接超時或者觸發重傳機制**。web應用中listen函數的backlog默認會給我們內核參數的net.core.somaxconn限制到128,而nginx定義的NGX_LISTEN_BACKLOG默認為511,所以有必要調整這個值。對繁忙的服務器,增加該值有助於網絡性能
wmem_default 129024 129024 默認的發送窗口大小(以字節為單位)
rmem_default 129024 129024 默認的接收窗口大小(以字節為單位)
rmem_max 129024 873200 最大的TCP數據接收緩沖
wmem_max 129024 873200 最大的TCP數據發送緩沖

修改內核參數的方法

  1. 使用 echo value 方式直接追加到文件中。 如 echo "1" > /proc/sys/net/ipv4/tcp_syn_retries ,但是這種方式設備重啟後,會恢復成默認值。
  2. 把參數添加到 /etc/sysctl.conf 中,然後執行 sysctl -p 使參數生效。這種方式是永久有效的。

生產環境常用的參數

net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_synack_retries = 1 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_probes = 3 net.ipv4.tcp_keepalive_intvl =15 net.ipv4.tcp_retries2 = 5 net.ipv4.tcp_fin_timeout = 2 net.ipv4.tcp_max_tw_buckets = 36000 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_max_orphans = 32768 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.tcp_wmem = 8192 131072 16777216 net.ipv4.tcp_rmem = 32768 131072 16777216 net.ipv4.tcp_mem = 786432 1048576 1572864 net.ipv4.ip_local_port_range = 1024 65000 net.ipv4.ip_conntrack_max = 65536 net.ipv4.netfilter.ip_conntrack_max=65536 net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=180 net.core.somaxconn = 16384 net.core.netdev_max_backlog = 16384

不同的生產環境需要優化的參數基本差不多,只是值有相應的變化。 具體的優化值要參考應用場景,這兒所列出的只是常用的優化參數,是否適合可以參考上面的參數說明描述。

例子:

sudops網站提供的優化例子:

net.core.netdev_max_backlog = 400000 #該參數決定了,網絡設備接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目。 net.core.optmem_max = 10000000 #該參數指定了每個套接字所允許的最大緩沖區的大小 net.core.rmem_default = 10000000 #指定了接收套接字緩沖區大小的缺省值(以字節為單位)。 net.core.rmem_max = 10000000 #指定了接收套接字緩沖區大小的最大值(以字節為單位)。 net.core.somaxconn = 100000 #Linux kernel參數,表示socket監聽的backlog(監聽隊列)上限 net.core.wmem_default = 11059200 #定義默認的發送窗口大小;對於更大的 BDP 來說,這個大小也應該更大。 net.core.wmem_max = 11059200 #定義發送窗口的最大大小;對於更大的 BDP 來說,這個大小也應該更大。 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 #嚴謹模式 1 (推薦) #松散模式 0 net.ipv4.tcp_congestion_control = bic #默認推薦設置是 htcp net.ipv4.tcp_window_scaling = 0 #關閉tcp_window_scaling #啟用 RFC 1323 定義的 window scaling;要支持超過 64KB 的窗口,必須啟用該值。 net.ipv4.tcp_ecn = 0 #把TCP的直接擁塞通告(tcp_ecn)關掉 net.ipv4.tcp_sack = 1 #關閉tcp_sack #啟用有選擇的應答(Selective Acknowledgment), #這可以通過有選擇地應答亂序接收到的報文來提高性能(這樣可以讓發送者只發送丟失的報文段); #(對於廣域網通信來說)這個選項應該啟用,但是這會增加對 CPU 的占用。 net.ipv4.tcp_max_tw_buckets = 10000 #表示系統同時保持TIME_WAIT套接字的最大數量 net.ipv4.tcp_max_syn_backlog = 8192 #表示SYN隊列長度,默認1024,改成8192,可以容納更多等待連接的網絡連接數。 net.ipv4.tcp_syncookies = 1 #表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊,默認為0,表示關閉; net.ipv4.tcp_timestamps = 1 #開啟TCP時間戳 #以一種比重發超時更精確的方法(請參閱 RFC 1323)來啟用對 RTT 的計算;為了實現更好的性能應該啟用這個選項。 net.ipv4.tcp_tw_reuse = 1 #表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認為0,表示關閉; net.ipv4.tcp_tw_recycle = 1 #表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。 net.ipv4.tcp_fin_timeout = 10 #表示如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間。 net.ipv4.tcp_keepalive_time = 1800 #表示當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時,改為30分鐘。 net.ipv4.tcp_keepalive_probes = 3 #如果對方不予應答,探測包的發送次數 net.ipv4.tcp_keepalive_intvl = 15 #keepalive探測包的發送間隔 net.ipv4.tcp_mem #確定 TCP 棧應該如何反映內存使用;每個值的單位都是內存頁(通常是 4KB)。 #第一個值是內存使用的下限。 #第二個值是內存壓力模式開始對緩沖區使用應用壓力的上限。 #第三個值是內存上限。在這個層次上可以將報文丟棄,從而減少對內存的使用。對於較大的 BDP 可以增大這些值(但是要記住,其單位是內存頁,而不是字節)。 net.ipv4.tcp_rmem #與 tcp_wmem 類似,不過它表示的是為自動調優所使用的接收緩沖區的值。 net.ipv4.tcp_wmem = 30000000 30000000 30000000 #為自動調優定義每個 socket 使用的內存。 #第一個值是為 socket 的發送緩沖區分配的最少字節數。 #第二個值是默認值(該值會被 wmem_default 覆蓋),緩沖區在系統負載不重的情況下可以增長到這個值。 #第三個值是發送緩沖區空間的最大字節數(該值會被 wmem_max 覆蓋)。 net.ipv4.ip_local_port_range = 1024 65000 #表示用於向外連接的端口範圍。缺省情況下很小:32768到61000,改為1024到65000。 net.ipv4.netfilter.ip_conntrack_max=204800 #設置系統對最大跟蹤的TCP連接數的限制 net.ipv4.tcp_slow_start_after_idle = 0 #關閉tcp的連接傳輸的慢啟動,即先休止一段時間,再初始化擁塞窗口。 net.ipv4.route.gc_timeout = 100 #路由緩存刷新頻率,當一個路由失敗後多長時間跳到另一個路由,默認是300。 net.ipv4.tcp_syn_retries = 1 #在內核放棄建立連接之前發送SYN包的數量。 net.ipv4.icmp_echo_ignore_broadcasts = 1 # 避免放大攻擊 net.ipv4.icmp_ignore_bogus_error_responses = 1 # 開啟惡意icmp錯誤消息保護 net.inet.udp.checksum=1 #防止不正確的udp包的攻擊 net.ipv4.conf.default.accept_source_route = 0 #是否接受含有源路由信息的ip包。參數值為布爾值,1表示接受,0表示不接受。 #在充當網關的linux主機上缺省值為1,在一般的linux主機上缺省值為0。 #從安全性角度出發,建議你關閉該功能。

Linux TCP/IP調優-Linux內核參數註釋