當心!TCP本機客戶端連線本機伺服器

2021-07-05 11:31:14 字數 1660 閱讀 3582

上週,在我們進行效能測試的時候,發現了乙個問題。

我們的伺服器上啟了乙個redis服務端,偵聽0.0.0.0的1234埠,同處在本機的另外乙個程序會頻繁發起到該服務端的短連線,結果導致了兩個問題:

1.大量的time_wait狀態的連線;

2.發起連線的程序的cpu佔用率接近100%。

這兩個結果嚴重影響了我們閘道器的效能,在分析具體原因之前,首先做乙個提倡,那就是:本機連線本機,首選unix域套接字而不是tcp!

原因其實不需要資料分析,僅僅理論分析就夠了,前提是你要做linux核心協議棧的ip層處理以及軟中斷排程有足夠的理解,當然,這些都很簡單。

首先我們來看看問題1。time_wait就不多說了,只要任何一端主動斷開連線,那麼它最終可能將會進入time_wait狀態,具體是否會進入在linux上取決於幾個因素,第一,你有沒有兩端開啟timestamps,如果開啟了,你有沒有在服務端開啟recycle,如果開啟了,那麼time_wait套接字就會迅速消失,也就是說,想讓recycle起作用,你一定要開啟timestamps。如果沒有timestamps,那麼就會有大量的time_wait狀態的套接字。

在linux核心協議棧的實現中,所有連線本機的資料流,其路由選擇最終都會到定向到loopback,如果你沒有繫結源ip位址,那麼源/目標ip位址均為127.0.0.1!如果服務埠是固定的,那麼最終會接受65535-1個連線,減1的原因在於服務端已經bind了服務埠,因此客戶端不能再次bind。這是合理的,因為按照四元組唯一性考慮,乙個服務只能接受乙個特定ip位址的65535個連線或者65534個連線,但是問題是,如果需求巨大,這顯然不能滿足要求,你要知道,作為伺服器而言,它要考慮的是總的最大併發連線數,一台機器上同時發起6萬多個連線的可能性並不大,因此tcp在大多數情況下是合理,採用16bit的埠號剛剛好,因為協議頭不能太大,否則載荷率就會變小,這顯然是網路傳輸所要求的,然而本機連本機時,並不需要網路傳輸,你想當然會認為有多少需求就要都要滿足,不過tcp並不適合這種場合。

本機連本機,沒有網路傳輸帶來的延遲,吞吐限制也僅限於本機資源利用,因此併發10萬甚至更多的需求都是合理的,可是tcp並不能滿足,原因就在於它只有16bit的埠號,目標埠固定,同時只能有65534個連線。如何解決呢?我們知道127.0.0.0/8都是屬於loopback的,我們可以採用不同的源ip位址,如果想這麼做,有兩個選擇,那就是要麼客戶端bind源ip為127.x.y.z,要麼snat成127.x.y.z,這樣就可以接受海量的連線需求了。但是這並不是最終的解決方案,為什麼非要用tcp呢?tcp本來就是為網路傳輸設計的,它的流控應對不同的主機,擁控應對反覆無常的網路,在本機,這些都不是問題,所以本機連本機,最好使用本機套接字,比如unix域套接字。

再來看問題2,乙個連線本機的tcp資料報最終到達了loopback的xmit傳送函式,其中簡單的排程了本cpu上的乙個軟中斷處理,然後會在下一次中斷結束後排程其執行,這有很大機率是在當前傳送程序的上下文中進行的,也就是說,傳送程序在其上下文中進行了傳送操作,而此時軟中斷借用了其上下文觸發了接收操作,再然後,lock的開銷就很明顯,由於大量的tw套接字的insert和delete,需要頻繁lock雜湊表,這種開銷完全記帳到了傳送程序的名下,也是不公平的。

注意,linux核心中,softirq會在兩種上下文中執行,一種是硬體中斷後的任意上下文中,一種是每cpu乙個核心執行緒的上下文中,後者會記帳給top命令的si百分比,前者則會記帳給任意被中斷的程序。

Redis如何通過本機客戶端訪問遠端伺服器端

預設無許可權控制 遠端服務連線 redis cli h 127.0.0.1 p 6379 windows下 redis cli.exe h 127.0.0.1 p 6379 redis 127.0.0.1 6379 遠端服務停止 redis cli h 172.168.10.254 p6379 sh...

安裝sitecore資料庫和客戶端到本機

提前先裝好資料庫和iis 安裝過程省略。2.iis配置 sitecore自動在iis中建立好了 的物理路徑即為安裝路徑下的website資料夾 3.hosts設定 4.在瀏覽器中輸入 或網域名稱就可以訪問啦。sitecore管理後台登入,後加 sitecore login進入登入頁面,預設使用者名稱...

cacti監內網本機TCP連線狀況

cacti是由php開發的網頁,執行於la nmp平台,可利用snmp獲取資料,週期性的執行能夠取得資料的命令,將取回的資料儲存至rrd檔案當中,利用rrdtool繪出圖形。snmp原理詳解 rrdtool原理詳解 lamp環境已經編譯搭建 虛擬主機配置 documentroot web vhost...