Linux服務器網絡參數優化

     續TimeWait,收集了一下Linux網絡參數的優化技巧,紅帽官網有相關說明html

     收集了一下,挺多的。註釋很詳細了:web

# 對於一個新建鏈接,內核要發送多少個SYN鏈接請求才決定放棄。<=255,默認值是5,對應於180秒左右時間。(對於大負載而物理通訊良好的網絡而言,這個值偏高,可修改成2。這個值僅僅是針對對外的鏈接,對進來的鏈接,是由tcp_retries1決定的)
net.ipv4.tcp_syn_retries = 2

# 對於遠端的鏈接請求SYN,內核會發送SYN+ACK數據報,以確認收到上一個SYN鏈接請求包。這是所謂的三次握手( threeway handshake)機制的第二個步驟。這裏決定內核在放棄鏈接以前所送出的SYN+ACK數目。<=255,默認值是5,對應於180秒左右時間。(能夠根據上面的tcp_syn_retries來決定這個值)
net.ipv4.tcp_synack_retries = 2


# 當keepalive打開的狀況下,TCP發送keepalive消息的頻率。(默認值是7200(2小時),服務器建議設爲1800)
net.ipv4.tcp_keepalive_time = 1800

# TCP發送keepalive探測以肯定該鏈接已經斷開的次數。(默認值是9,設置爲5比較合適)
net.ipv4.tcp_keepalive_probes = 5

# 探測消息發送的頻率,乘以tcp_keepalive_probes就獲得對於從開始探測以來沒有響應的鏈接殺除的時間。(默認值爲75秒,推薦設爲15秒)
net.ipv4.tcp_keepalive_intvl = 15

# 放棄迴應一個TCP鏈接請求前﹐須要進行多少次重試。RFC規定最低的數值是3﹐也是默認值創建不調整。
net.ipv4.tcp_retries1 = 3

# 在丟棄激活(已創建通信情況)的TCP鏈接以前﹐須要進行多少次重試。默認值爲15,根據RTO的值來決定,至關於13-30分鐘(RFC1122規定,必須大於100秒)。(我建議修改成了5)
net.ipv4.tcp_retries2 = 3

# 在近端丟棄TCP鏈接以前﹐要進行多少次重試。默認值是7個﹐在大負載服務器上建議調整爲3)
net.ipv4.tcp_orphan_retries = 3

# 對於本端斷開的socket鏈接,TCP保持在FIN-WAIT-2狀態的時間。對方可能會斷開鏈接或一直不結束鏈接或不可預料的進程死亡。默認值爲60 秒,推薦參考值爲30。若是您的機器爲負載很重的web服務器﹐您可能要冒內存被大量無效數據報填滿的風險﹐FIN-WAIT-2 sockets的危險性低於FIN-WAIT-1﹐由於它們最多隻吃1.5K的內存﹐可是它們存在時間更長。另外參考tcp_max_orphans。
net.ipv4.tcp_fin_timeout = 30

# 系統在同時所處理的最大timewait sockets數目。若是超過此數的話﹐time-wait socket會被當即砍除而且顯示警告信息。默認180000,不建議修改。之因此要設定這個限制﹐純粹爲了抵禦那些簡單的DoS***﹐千萬不要人爲的下降這個限制﹐不過﹐若是網絡條件須要比默認值更多﹐則能夠提升它(或許還要增長內存)。
net.ipv4.tcp_max_tw_buckets = 180000

# 打開快速TIME-WAIT sockets回收。默認關閉,建議打開。
net.ipv4.tcp_tw_recycle = 1

# 該文件表示是否容許從新應用處於TIME-WAIT狀態的socket用於新的TCP鏈接。默認關閉,建議打開。
net.ipv4.tcp_tw_reuse = 1

# 系統所能處理不屬於任何進程的TCP sockets最大數量。假如超過這個數量﹐那麼不屬於任何進程的鏈接會被當即reset,並同時顯示警告信息。之因此要設定這個限制,純粹爲了抵禦那些簡單的DoS***。千萬不要依賴這個或是人爲的下降這個限制(這個值Redhat AS版本中設置爲32768,可是不少防火牆修改的時候,建議該值修改成2000)
net.ipv4.tcp_max_orphans = 32768

# 當守護進程太忙而不能接受新的鏈接,就象對方發送reset消息,默認值是false。這意味着當溢出的緣由是由於一個偶然的猝發,那麼鏈接將恢復狀態。只有在你確信守護進程真的不能完成鏈接請求時纔打開該選項,該選項會影響客戶的使用。(對待已經滿載的sendmail,apache這類服務的時候,這個能夠很快讓客戶端終止鏈接,能夠給予服務程序處理已有鏈接的緩衝機會,因此不少防火牆上推薦打開它)
net.ipv4.tcp_abort_on_overflow = 1

# 只有在內核編譯時選擇了CONFIG_SYNCOOKIES時纔會發生做用。當出現syn等候隊列出現溢出時象對方發送syncookies。目的是爲了防止syn flood***。
# 注意:該選項千萬不能用於那些沒有收到***的高負載服務器,若是在日誌中出現synflood消息,可是調查發現沒有收到synflood***,而是合法用戶的鏈接負載太高的緣由,你應該調整其它參數來提升服務器性能。參考:
# tcp_max_syn_backlog
# tcp_synack_retries
# tcp_abort_on_overflow
# syncookie嚴重的違背TCP協議,不容許使用TCP擴展,可能對某些服務致使嚴重的性能影響(如SMTP轉發)。(注意,該實現與BSD上面使用的tcp proxy同樣,是違反了RFC中關於tcp鏈接的三次握手實現的,可是對於防護syn-flood的確頗有用。)
net.ipv4.tcp_syncookies = 0

# 使用TCP urg pointer字段中的主機請求解釋功能。大部份的主機都使用老舊的BSD解釋,所以若是您在Linux打開它﹐或會致使不能和它們正確溝通。
net.ipv4.tcp_stdurg = 0

# 對於那些依然還未得到客戶端確認的鏈接請求﹐須要保存在隊列中最大數目。對於超過128Mb內存的系統﹐默認值是1024﹐低於128Mb的則爲128。若是服務器常常出現過載﹐能夠嘗試增長這個數字。警告﹗假如您將此值設爲大於1024﹐最好修改include/net/tcp.h裏面的 TCP_SYNQ_HSIZE﹐以保持TCP_SYNQ_HSIZE*16<=tcp_max_syn_backlog﹐而且編進核心以內。(SYN Flood***利用TCP協議散佈握手的缺陷,僞造虛假源IP地址發送大量TCP-SYN半打開鏈接到目標系統,最終致使目標系統Socket隊列資源耗 盡而沒法接受新的鏈接。爲了應付這種***,現代Unix系統中廣泛採用多鏈接隊列處理的方式來緩衝(而不是解決)這種***,是用一個基本隊列處理正常的完 全鏈接應用(Connect()和Accept() ),是用另外一個隊列單獨存放半打開鏈接。這種雙隊列處理方式和其餘一些系統內核措施(例如Syn-Cookies/Caches)聯合應用時,可以比較有效的緩解小規模的SYN Flood***(事實證實<1000p/s)加大SYN隊列長度能夠容納更多等待鏈接的網絡鏈接數,因此對Server來講能夠考慮增大該值。)
net.ipv4.tcp_max_syn_backlog = 1024

# 該文件表示設置tcp/ip會話的滑動窗口大小是否可變。參數值爲布爾值,爲1時表示可變,爲0時表示不可變。tcp/ip一般使用的窗口最大可達到 65535字節,對於高速網絡,該值可能過小,這時候若是啓用了該功能,可使tcp/ip滑動窗口大小增大數個數量級,從而提升數據傳輸的能力(RFC 1323)。(對普通地百M網絡而言,關閉會下降開銷,因此若是不是高速網絡,能夠考慮設置爲0)
net.ipv4.tcp_window_scaling = 1

# Timestamps用在其它一些東西中﹐能夠防範那些僞造的sequence號碼。一條1G的寬帶線路或許會重遇到帶out-of-line數值的舊 sequence號碼(假如它是因爲上次產生的)。Timestamp會讓它知道這是個'舊封包'。(該文件表示是否啓用以一種比超時重發更精確的方法(RFC 1323)來啓用對RTT的計算;爲了實現更好的性能應該啓用這個選項。) 
net.ipv4.tcp_timestamps = 1

# 使用Selective ACK﹐它能夠用來查找特定的遺失的數據報---所以有助於快速恢復狀態。該文件表示是否啓用有選擇的應答(Selective Acknowledgment),這能夠經過有選擇地應答亂序接收到的報文來提升性能(這樣可讓發送者只發送丟失的報文段)。(對於廣域網通訊來講這個選項應該啓用,可是這會增長對CPU的佔用。)
net.ipv4.tcp_sack = 1

# 打開FACK擁塞避免和快速重傳功能。(注意,當tcp_sack設置爲0的時候,這個值即便設置爲1也無效)
net.ipv4.tcp_fack = 1

# 容許TCP發送"兩個徹底相同"的SACK。
net.ipv4.tcp_dsack = 1apache

相關文章
相關標籤/搜索