伺服器超時時間和請求佇列大小設定

2021-09-12 09:57:13 字數 2188 閱讀 4364

伺服器超時時間和請求列表大小關乎程式的健壯性。設定過小,會導致有效的請求被丟掉。 設定過大,嚴重的情況下會引起雪崩。

很多後台碼農對超時時間的設定都沒什麼概念,特別是剛畢業的後台碼農。 一般都是參照前人的**,設定乙個相同的超時,而且一般都是比較大的超時,只要程式能跑就沒問題了。

後台服務基本上要設定兩個超時,一是去請求其他服務時設定的超時,我們稱之為請求超時時間, 一是對整個請求的處理超時,我們稱之為處理超時時間。

一般後台服務都會請求後端服務去取資料的操作,這時需要設定乙個超時,當達到超時時, 後端服務還沒回包,則把當前的請求設為失敗的請求。我們不能一直等到後端回包, 假如後端服務出問題了,一直不回包,那麼當前的處理就會一直在等待。如果是同步請求, 那麼當前的處理執行緒就會一直卡在那裡,處理不了佇列的其他請求了。

收到乙個請求進行處理時,對其打上設定超時的計時器。如果超時了,直接給客戶端返回超時。 客戶端請求我們的伺服器時,同樣會應用到上面的請求超時設定,客戶端會設定自己的請求超時。 如果我們沒有對這個請求的處理設定超時,或者設定不合理,在客戶端上,當前處理已經超時, 這時我們才處理完成回包,這個回包給到客戶端就會被丟棄了。

那麼我們要怎麼設定超時呢。

對於請求超時時間,在後端服務正常的情況下,我們觀察發起請求到收到響應所需要花的平均時間。 在這個平均時間上設定高一點的時間為超時時間。假如,後端服務的平均超時為100ms, 那麼我們可以設定150ms的超時。

對於處理超時時間,我們先來看一下同步模型的處理,非同步模型我們在後面再討論, 我們觀察整個處理過程所需要的平均耗時(cost_time)。 對於請求在佇列中等待到處理的時間稱為等待時間(wait_time)。 佇列長度為n,則最大超時時間應該設定為:(n-1)*wait_time+cost_time+調高的值。

設定的處理超時,一般還要比客戶端的請求超時低。不會就會出現上面說的丟棄響應包的情況。 通常,我們在假設處理超時設定合理的情況下,請求超時要根據處理超時時間來進行設定。

對於請求超時,如果是跨idc、跨地域呼叫的話,我們還需要考慮資料的傳輸時間。 假如乙個idc在廣州,乙個在北京。兩地距離2000km,通過內網專線進行通訊。傳輸速度以光速計算, 傳輸一次需要(200010^3)/(310^8),約等於7ms。使用tcp通訊,需要先握手再進行傳輸。 通訊過程如下:

大概需要30ms左右,再加上折射,可能要加多40ms的傳輸耗時,這在請求耗時中佔比是比較大的。 所以在考慮跨機房距離比較遠的時候,如果根據後端的處理耗時來設定請求耗時時,需要考慮傳輸耗時。

一般情況下,我們的服務會設定乙個請求列隊來快取請求的資料,worker從列隊裡取資料進行處理。

如果佇列設定太小,可能伺服器還沒飽和,就直接把請求拒絕了,降低了我們伺服器的處理能力。 假如我們只有乙個worker使用進行同步模型進行處理請求,每個請求請求處理10ms,處理超時設定為2000ms, 那麼2000ms可以處理200個請求。但是佇列只設定100個buffer,那麼第101個包過來的時候直接響應佇列滿的錯, 這就把處理能力降低了一半。

如果佇列太大,客戶端等待時間會過長,如果再加上超時設定不合理,則有可能會引起雪崩。

假設我們只有乙個worker使用同步模型進行處理請求,每個請求平均需要100ms的耗時。 假如我們設定的處理超時為2000ms。佇列長度設為21。 當請求壓力上來的時候,佇列一下子就被壓滿了,而且佇列每移走乙個,就會有乙個請求進來, 這樣,佇列永遠都是滿的。對於佇列中的第n個包(入隊時的位置),則需要等待前面n-1個處理完, 等待時間為(n-1)100ms,再加上處理耗時為100ms,則總耗時為(n-1)100+100ms=n*100ms。 所以剛開始入隊的第21個,耗時需要2100ms,已經超時了,所以處理完後就已經超時了。 對於所有入隊位置在第21的請求,最後都是超時的。我們設定的情況是請求壓力比較大, 也就是說佇列會一直都是滿的。所以所有的包計算處理都是浪費資源。

綜合以上兩個例子,對於同步模型,不能忽略處理超時時間的設定來設定請求佇列的大小。

對於非同步模型,在io的時候,workder可以排程去處理其他的請求,這樣可以加大服務的吞吐量。 我們可以把佇列的大小調高,當處理到io的時候,就去處理拿下乙個請求來進行處理。但是, 這樣做的會把很多請求都往io的對端去,如果對端是乙個服務,這樣會把壓力壓到對端去, 所以對端也要做好耗時和佇列的設定,以免把對端壓死。非同步模型的佇列大小,我們逐步調整佇列的大小, 對服務進行壓測,讓服務的cpu達到瓶頸,然後把佇列設定到比此值稍大即可。因為是非同步處理。

同樣的,對於非同步模型,所有的io時間都不會把請求阻塞住了。所以,對於非同步模型, 我們只要把處理超時設為平均耗時加上調高的值即可。

詳解Nginx伺服器中配置超時時間

這篇文章主要介紹了nginx伺服器中配置超時時間的方法,同時也對nginx中的時間管理機制作了詳細的介紹,需要的朋友可以參考下 一 啥時候用到 用來設定請求資源和伺服器返回的時間,保證乙個請求占用固定時間,超出後報504超時!這樣可以保證乙個請求占用過長時間。二 主要引數 使用nginx伺服器如果遇...

android HttP請求伺服器,連線超時

override public void onclick view v toast.maketext getactivity tempurl tempurl,toast.length short show url new url allfinalinfo.server url for int i 0...

qtp監聽請求響應時間,伺服器ip,

qtp結合httpwatch監聽請求響應時間,伺服器ip,返回狀態碼,從而對出錯的介面進行簡單分析 聞 click ip plugin.log.entries.item 0 serverip 獲取ip位址 code plugin.log.entries.item 0 statuscode 獲取狀態碼...