當(dāng)前位置:首頁 > 公眾號精選 > CPP開發(fā)者
[導(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(
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉
關(guān)閉