1. 程式人生 > >tcp_tw_reuse、tcp_tw_recycle 使用場景及注意事項

tcp_tw_reuse、tcp_tw_recycle 使用場景及注意事項

linux TIME_WAIT 相關引數:

net.ipv4.tcp_tw_reuse = 0    表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連線,預設為0,表示關閉
net.ipv4.tcp_tw_recycle = 0  表示開啟TCP連線中TIME-WAIT sockets的快速回收,預設為0,表示關閉
net.ipv4.tcp_fin_timeout = 60  表示如果套接字由本端要求關閉,這個引數決定了它保持在FIN-WAIT-2狀態的時間(可改為30,一般來說FIN-WAIT-2的連線也極少)

注意:

- 不像Windows 可以修改登錄檔修改2MSL 的值,linux 是沒有辦法修改MSL的,tcp_fin_timeout 不是2MSL 而是Fin-WAIT-2狀態。

- tcp_tw_reuse 和SO_REUSEADDR 是兩個完全不同的東西。

1. tw_reuse,tw_recycle 必須在客戶端和服務端timestamps 開啟時才管用(預設開啟)

2. tw_reuse 只對客戶端起作用,開啟後客戶端在1s內回收

3. tw_recycle 對客戶端和伺服器同時起作用,開啟後在 3.5*RTO 內回收,RTO 200ms~ 120s 具體時間視網路狀況。

  內網狀況比tw_reuse 稍快,公網尤其行動網路大多要比tw_reuse 慢,優點就是能夠回收服務端的TIME_WAIT數量

對於客戶端

1. 作為客戶端因為有埠65535問題,TIME_OUT過多直接影響處理能力,開啟tw_reuse 即可解決,不建議同時開啟tw_recycle,幫助不大。

2. tw_reuse 幫助客戶端1s完成連接回收,基本可實現單機6w/s請求,需要再高就增加IP數量吧。

3. 如果內網壓測場景,且客戶端不需要接收連線,同時tw_recycle 會有一點點好處。

4. 業務上也可以設計由服務端主動關閉連線

對於服務端

1. 開啟tw_reuse無效

2. 線上環境 tw_recycle 不要開啟

   伺服器處於NAT 負載後,或者客戶端處於NAT後(這是一定的事情,基本公司家庭網路都走NAT);

 公網服務開啟就可能造成部分連線失敗,內網的話倒是可以視情況開啟;

   像我所在公司對外服務都放在NAT負載後面,負載會把timestamp 都給清空,好吧,就算你開啟也不起作用。

3. 伺服器TIME_WAIT 高怎麼辦

   不像客戶端有埠限制,處理大量TIME_WAIT Linux已經優化很好了,每個處於TIME_WAIT 狀態下連線記憶體消耗很少,

而且也能通過tcp_max_tw_buckets = 262144 配置最大上限,現代機器一般也不缺這點記憶體。

    下面像我們一臺每秒峰值1w請求的http 短連線服務,長期處於tw_buckets 溢位狀態,

tw_socket_TCP 佔用70M, 因為業務簡單服務佔用CPU 200% 執行很穩定。

複製程式碼

slabtop

262230 251461  95%    0.25K  17482       15     69928K tw_sock_TCP

 ss -s
Total: 259 (kernel 494)
TCP:   262419 (estab 113, closed 262143, orphaned 156, synrecv 0, timewait 262143/0), ports 80

Transport Total     IP        IPv6
*         494       -         -        
RAW       1         1         0        
UDP       0         0         0        
TCP       276       276       0        
INET      277       277       0        
FRAG      0         0         0    
複製程式碼

唯一不爽的就是:

系統日誌中overflow 錯誤一直在刷屏,也許該把buckets 調大一下了

TCP: time wait bucket table overflow
TCP: time wait bucket table overflow
TCP: time wait bucket table overflow
TCP: time wait bucket table overflow
TCP: time wait bucket table overflow

5. 業務上也可以設計由客戶端主動關閉連線

原理分析

 1. MSL 由來

  發起連線關閉方回覆最後一個fin 的ack,為避免對方ack 收不到、重發的或還在中間路由上的fin 把新連線給幹掉了,等個2MSL,4min。

  也就是連線有誰關閉的那一方有time_wait問題,被關那方無此問題。

2. reuse、recycle

     通過timestamp的遞增性來區分是否新連線,新連線的timestamp更大,那麼小的timestamp的fin 就不會fin掉新連線。

3. reuse

     通過timestamp 遞增性,客戶端、伺服器能夠處理outofbind fin包

4. recycle

    對於服務端,同一個src ip,可能會是NAT後很多機器,這些機器timestamp遞增性無可保證,伺服器會拒絕非遞增請求連線。

 細節之處還得好好閱讀tcp 協議棧原始碼了

建議閱讀以下參考:


相關推薦

tcp_tw_reusetcp_tw_recycle 使用場景注意事項

linux TIME_WAIT 相關引數: net.ipv4.tcp_tw_reuse = 0 表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連線,預設為0,表示關閉 net.ipv4.tcp_tw_recycle = 0 表示開啟T

ORACLE分割槽表梳理系列(一)- 分割槽表概述分類使用方法注意事項

前言 本文著重闡述分割槽表的概念、優勢,以及常用分割槽表的使用方法及使用過程中的注意事項。 對於分割槽表的日常維護方法,如:索引的維護、分割槽的合併等,將在後續文章中再詳細介紹。 本文涉及的相應演示,使用的資料庫版本為oracle 11.2.0.4。 本文常用分割槽表的使

布隆過濾器的原理使用場景注意事項

今天碰到個業務,他的 Redis 叢集有個大 Value 用途是作為布隆過濾器,但溝通的時候被小懟了一下,意思大概是 “布隆過濾器原理都不懂,還要我優化?”。技術菜被人懟認了、怪不得別人,自己之前確實只是聽說過這個,但是沒深入瞭解過,趁這個機會補充一下知識。 在進入正文之前,之前看到

sql查詢語句的書寫順序執行順序注意事項(優化策略)

查詢中用到的關鍵詞主要由6個,分別是:select、from、where、group by、having、order by書寫順序:順序與上一行一致。不過其中select和from為必須,其他關鍵詞是可選執行順序:from、where、group by、having、sele

JSON的使用場景注意事項介紹

上篇我們講解了JSON的誕生原因是因為XML整合到HTML中各個瀏覽器實現的細節不盡相同,所以道格拉斯·克羅克福特(Douglas Crockford) 和 奇普·莫寧斯達(Chip Morningstar)一起從JS的資料型別中提取了一個子集,作為新的資料交換格式,因為主流的瀏覽器使用了通用的JavaScr

深入瞭解typeof與instanceof的使用場景注意事項

JavaScript中的資料型別分為兩類,**undefined,number,boolean,string,symbol,bigint,null[^1]組成的基礎型別**和**Object、Function、Array等型別組成的引用型別**。 ![在這裡插入圖片描述](https://img2020.c

重灌系統後,重新安裝ORACLE加環境變數配置客戶端PL/SQL的安裝過程,注意事項(避免再次踩坑)

(1)首先了解什麼是OERACLE及Oracle與PL/SQL是什麼關係: ORACLE是資料庫,有客戶端和伺服器; PLSQL Developer只是第三方工具,服務於ORACLE,類似的工具還有Toad,sqlplus,sql developer等等; 安裝PLSQL Developer

分享知識-快樂自己:Struts2(動態方法動態結果萬用字元方法內部跳轉action跳轉OGNL 的使用注意事項

這裡主要以案例演示:涵蓋以下知識點 1、動態方法呼叫:使用關鍵 符號 ! 進行操作   例如:/名稱空間 ! 方法名 2、動態結果集:就是說,通過後臺返回的結果 ${} 獲取,重定向到符合預期的頁面。 3、萬能萬用字元:*_*  :第一個 * 為 類名、第二個 * 為方

實戰Java高併發程式設計(四鎖的優化注意事項

在多核時代,使用多執行緒可以明顯地提升系統的效能。但事實上,使用多執行緒會額外增加系統的開銷。對於單任務或單執行緒的應用來說,其主要資源消耗在任務本身。對於多執行緒來說,系統除了處理功能需求外,還需要維護多執行緒環境特有的資訊,如執行緒本身的元資料,執行緒的排程,執行緒上下文的切換等。 4.1有

Ubuntu下protobuf的安裝編譯注意事項

Ubuntu下編譯protobuf 1.下載protobuf 下載地址:https://github.com/google/protobuf/releases 2.編譯protobuf 解壓下載的zip包,cd到protobuf的目錄下,執行以下指令: tar -xvf pro

tokuDB儲存引擎的安裝配置使用注意事項

平臺支援: TokuDB 只能在 64-bit Linux 下使用. 最小記憶體要求: TokuDB 需要至少1GB 的實體記憶體,當然這裡建議最好是 2GB . 1、安裝mysql(可以是mariadb、percona或oracle mysql) 安裝p

繼承的概述特點,方法重寫的應用場景&注意事項

第1章 繼承 1.1 繼承的概述 在現實生活中,繼承一般指的是子女繼承父輩的財產。在程式中,繼承描述的是事物之間的所屬關係,通過繼承可以使多種事物之間形成一種關係體系。 1.2 繼承的格式&使用 在程式中,如果想宣告一個類繼承另一個類,需要使用extends關鍵字。 格式

C# 根據當前時間計算周季度年的換算注意事項

public static void ShowTime() { /* * 根據當前時間進行時間段轉換: * 本週、下週、上週 *

Tensorflow兩種資料讀取方法應用對比注意事項

本文對比介紹了兩種Tensorflow針對大資料集的資料讀取方法,具體來說是:方法1:tf.train.slice_input_producer+流水線(這裡用這個API指代這一類,其實還有其他的API)。方法2:Dataset方法,據說是Tensorflow 1.3版本之後

【java基礎】abstract抽象類方法的特點注意事項

摘要:本文引自畢老師Java程式碼。 /* 抽象類: 抽象:籠統,模糊,看不懂!不具體。 特點: 1,方法只有宣告沒有實現時,該方法就是抽象方法,需要被abstract修飾。 抽象方法必須定義在抽象類中。該類必須也被abstract修飾。 2,抽象類不可以被例項化。

二叉樹常用操作演算法集解釋注意事項

二叉樹是一種常用的資料結構,在程式中也經常需要使用二叉樹,但是你所使用語言卻並不一定提供了二叉樹這種資料型別,所以為了方便使用,我們可以自己實現一個二叉樹的資料型別。在需要時就像使用其他已定義的型別一樣方便。 下面給出一些本人寫的演算法和解釋(基於C語言),希望對讀者寫一

關於Android 5.0 6.0 7.0程式碼設定WIFI連線方式為靜態IP或DHCP的方法注意事項

注意:Android6.0以上app不具備刪除,修改WiFi許可權。 如果是自己APP通過程式碼連線的,(如果系統本來就記住了該WIFI,APP裡通過程式碼在連線一次不算),需要許可權 <uses-permission android:name="android.p

MySql指令用法注意事項

MySql指令 查看錶結構 desc table_name; 修改某一列的資料型別 假設表stu有一列id原本的資料型別是int(11)將其型別改為varchar(20)的語句如下:

mac下用git操作(pushpull)過程注意事項

如果存在,先將已有的ssh備份,或者將新建的ssh生成到另外的目錄下 如果不存在,通過預設的引數直接生成ssh 生成過程如下: $ssh-keygen -t rsa -C [email protected](註冊github

ERP選型準備方法注意事項

摘要:伴隨著市場的需求,ERP系統管理廠商如雨後春筍般推向市場,企業在選擇時面臨著多種選擇。本文怡海軟體將針對ERP系統如何選型從選型前的準備工作、瞭解ERP廠商、如何選擇及注意事項等方面進行簡要闡述。關鍵詞:ERP,SAP,Oracle,infor接觸過ERP(Enterprise Resource Pla