深入解析常見三次握手異常
時間:2021-10-08 16:36:27
手機(jī)看文章
掃描二維碼
隨時隨地手機(jī)看文章
[導(dǎo)讀]在后端接口性能指標(biāo)中一類重要的指標(biāo)就是接口耗時。具體包括平均響應(yīng)時間TP90、TP99耗時值等。這些值越低越好,一般來說是幾毫秒,或者是幾十毫秒。如果響應(yīng)時間一旦過長,比如超過了1秒,在用戶側(cè)就能感覺到非常明顯的卡頓。如果長此以往,用戶可能就直接用腳投票,卸載我們的App了。在正...
在后端接口性能指標(biāo)中一類重要的指標(biāo)就是接口耗時。具體包括平均響應(yīng)時間 TP90、TP99 耗時值等。這些值越低越好,一般來說是幾毫秒,或者是幾十毫秒。如果響應(yīng)時間一旦過長,比如超過了 1 秒,在用戶側(cè)就能感覺到非常明顯的卡頓。如果長此以往,用戶可能就直接用腳投票,卸載我們的 App 了。
在正常情況下一次 TCP 連接耗時也就大約是一次 RTT 多一點(diǎn)。但事情不一定總是這么美好,總會有意外發(fā)生。在某些情況下,可能會導(dǎo)致連接耗時上漲、CPU 處理開銷增加、甚至是超時失敗。今天飛哥就來說一下我在線上遇到過的那些 TCP 握手相關(guān)的各種異常情況。
一、客戶端 connect 異常
端口號和 CPU 消耗這二者聽起來感覺沒啥太大聯(lián)系。但我卻遭遇過因?yàn)槎丝谔柌蛔銓?dǎo)致 CPU 消耗大幅上漲的情況。來聽飛哥分析分析為啥會出現(xiàn)這種問題!客戶端在發(fā)起 connect 系統(tǒng)調(diào)用的時候,主要工作就是端口選擇(參見TCP連接中客戶端的端口號是如何確定的?)。在選擇的過程中,有個大循環(huán),從 ip_local_port_range 的一個隨機(jī)位置開始把這個范圍遍歷一遍,找到可用端口則退出循環(huán)。如果端口很充足,那么循環(huán)只需要執(zhí)行少數(shù)幾次就可以退出。但假設(shè)說端口消耗掉很多已經(jīng)不充足,或者干脆就沒有可用的了。那么這個循環(huán)就得執(zhí)行很多遍。我們來看下詳細(xì)的代碼。//file:net/ipv4/inet_hashtables.c
int?__inet_hash_connect(...)
{
?inet_get_local_port_range(