【案例分享】如何有效管理socket資源

? ? ? ?如今,伴隨著開源軟件、分布式軟件的廣泛應(yīng)用,網(wǎng)絡(luò)在日常運(yùn)維、管理以及運(yùn)行中,起著至關(guān)重要的作用,尤其是對(duì)于mysql、redis、es等關(guān)系型數(shù)據(jù)庫(kù),nosql數(shù)據(jù)庫(kù)和分布式數(shù)據(jù)庫(kù)來(lái)說(shuō)。
? ? ? ?在日常使用時(shí),包含socket連接在內(nèi)的服務(wù)器的總體連接數(shù),往往是衡量、監(jiān)控主機(jī)性能以及操作系統(tǒng)調(diào)優(yōu)時(shí),重點(diǎn)觀察的指標(biāo)之一。?

第1章? 查找你的網(wǎng)絡(luò)連接

通過(guò)上面的ss命令的輸出,我們可以看到,目前服務(wù)器上運(yùn)行著redis服務(wù),端口是6379,進(jìn)程是13434,并且沒(méi)有其他連接到redis服務(wù),因?yàn)槭瞻l(fā)隊(duì)列基本沒(méi)有數(shù)據(jù)。
01、建立連接
使用2臺(tái)客戶端來(lái)連接redis服務(wù)器

02、redis服務(wù)器監(jiān)控

可以看到id 6和8是客戶端連接,id 11是查詢命令的連接。
第2章? 排查連接進(jìn)程
此時(shí),redis服務(wù)器已經(jīng)連接了2個(gè)客戶端,接下來(lái)進(jìn)一步去查看這兩個(gè)連接的信息。
進(jìn)入到redis服務(wù)器的proc下的redis進(jìn)程目錄的fd目錄下,

注意看227329與114533,與之前的ss輸出可以匹配上。
01、查看tcp連接信息
我們已經(jīng)知道了客戶端的連接socket是227329與114533,那可以到proc下的tcp目錄里查看tcp連接的信息。

可以看到id為4,5的兩條記錄,與之前看到的tcp連接相符,通過(guò)轉(zhuǎn)換至十進(jìn)制,分別是10.10.1.65/10.10.1.64。
以id為5的記錄舉例,3F010A0A:18EB是本地的ip與端口,40010A0A:8000是遠(yuǎn)程的ip與端口。
第3章? 關(guān)閉socket連接
01、關(guān)閉連接
通過(guò)如上步驟,已經(jīng)找到了2個(gè)客戶端的socket連接,那接下來(lái)可以針對(duì)性地關(guān)閉socket連接。

以10.10.1.65這條連接為例,進(jìn)行關(guān)閉。

02、TCP監(jiān)控
關(guān)閉后再次查看連接情況

03、客戶端監(jiān)控

第4章? TCP連接
01、3次連接

通過(guò)上圖可以看到,TCP初始連接要經(jīng)過(guò)3個(gè)步驟建立連接
a)?? 客戶端告訴服務(wù)端,我要申請(qǐng)建立一條連接。
b)?? 客戶端告訴服務(wù)端,我要開啟一個(gè)socket連接。
c)?? 服務(wù)端確認(rèn)回復(fù)客戶端,申請(qǐng)已收到,并且我也要在你的服務(wù)器上開啟一個(gè)socket連接。
d)?? 客戶端回復(fù)服務(wù)端,確認(rèn)。
e)?? 至此TCP連接建立完成。
02、4次揮手

通過(guò)上圖可以看到,TCP斷開連接有4個(gè)步驟
a)?? 關(guān)閉一方發(fā)起請(qǐng)求,告知被關(guān)閉一方,“我要關(guān)閉連接了”
b)?? 被動(dòng)關(guān)閉一方回復(fù)“確認(rèn)”
可以看到我們剛才的記錄中,關(guān)閉了socket之后,立即進(jìn)入了fin-wait-2狀態(tài)。
c)?? 待數(shù)據(jù)發(fā)送完成后,被動(dòng)一方會(huì)再次發(fā)送一條信息,告訴主動(dòng)關(guān)閉一方,“我的數(shù)據(jù)已發(fā)送完成,可以關(guān)閉連接了?!?/p>
d)?? 默認(rèn)是2ms時(shí)間,主動(dòng)關(guān)閉一方會(huì)徹底關(guān)閉TCP連接。
03、如何提高系統(tǒng)并發(fā)量
a)?? TCP連接就是在客戶機(jī)、服務(wù)器上的一對(duì)socket。它們都在各自內(nèi)核對(duì)象上記錄了雙方的ip對(duì)、端口對(duì)(也就是我們常說(shuō)的四元組),通過(guò)這個(gè)記錄在通信時(shí)找到對(duì)方。
b)?? TCP連接發(fā)送方在發(fā)送網(wǎng)絡(luò)包的時(shí)候,會(huì)把這份信息復(fù)制到IP Header上。網(wǎng)絡(luò)包帶著這份信物穿過(guò)互聯(lián)網(wǎng),到達(dá)目的服務(wù)器。目的服務(wù)器內(nèi)核會(huì)按照 IP 包 header 中攜帶的信物(四元組)去匹配找到正確的socket(連接)。
c)?? 在這個(gè)過(guò)程里可以看到,客戶端的端口只是這個(gè)四元組里的一元。哪怕兩條連接用的是同一個(gè)端口號(hào),但只要客戶端ip不一樣,或者是服務(wù)器不一樣,都不影響內(nèi)核正確尋找到對(duì)應(yīng)的連接。?
d)?? 所以在客戶端增加TCP最大并發(fā)能力有兩個(gè)方法:
?● 為客戶端配置多個(gè)ip?
?● 連接多個(gè)不同的server