web高效能三大定理及證明

2021-07-09 20:10:34 字數 2424 閱讀 6544

仿照古時牛頓三大定律,這裡提出web高效能三大定理,主要是對web系統效能度量值的一些內在關係的描述,這裡的定理不能像牛頓三大定理那樣在力學界起到基礎支撐的作用,它只是為我們在設計高效能的web系統時的一些思考進行更形式化的描述。

1. 併發定理

乙個系統的併發度等於請求處理耗時與系統的吞吐量的乘積

併發度: 乙個系統在同時處理的請求個數。

請求處理耗時: 乙個請求從進入系統處理到處理完畢經過的時間。

吞吐量: 系統在現有資源情況下單位時間中(每秒)能完成的請求數。

證明:

我們假設乙個簡單的情況,即每乙個請求都是完全一樣的,耗時也都一樣,在實際系統中各項效能度量值都是不同且不斷變化的,我們這個假設反映了系統的一種平均情況。

設併發度的值為curr,請求處理耗時為cost,吞吐量的值為qps。

設單位時間進入系統處理階段的請求數為n1, 單位時間系統能夠完成的請求數為n2,根據吞吐量定義,n2即系統吞吐量。

在系統中n1是無法大於n2的值的, 不能處理而放在某種外部佇列中的請求我們不認為其進入了處理階段, 即進入系統請求的最大速率也等於吞吐量的值,即有n1=n2=qps。

在某個時間點t, 它有多少正在處理的請求呢,這代表了curr的值,它的值等於已到達系統的請求數減去已結束的請求數。

到達的請求數等於時長乘以請求到達速率,即:

到達的請求數 = t*n1 = t*n2= t*qps

已結束的請求數應該是在t-cost時間點之前就已經到達的請求數, 很好理解,在t-cost時間點之前到達的請求,在t時刻剛好都處理結束了,即

已結束的請求數 = (t-cost)*qps

curr = t*qps - (t-cost)*qps = cost *qps,這證明了我們的併發定理,即:

併發度 = 請求處理耗時 *吞吐量

說明:

該定理描述了併發度與耗時及吞吐量的一種關係,但併發度往往不是系統能夠決定的,比如12306這種購票**,高峰期的併發度**於頁面操作的使用者數,所以對於設計系統者來說,併發度可以理解為乙個我們無法控制的常數,即

請求處理耗時 *吞吐量 = const

一般來說,為了提高系統吞吐量,我們要降低請求處理耗時,為了降低請求的耗時,我們要提高系統吞吐量。

2. 延時定理

在乙個高併發且有排隊的系統中,請求延時隨時間成線性增長

乙個請求處理過程中需要使用各種系統資源,如網路讀寫,cpu計算,磁碟讀寫等等,在高併發的狀況下,這些資源不是即時可得的,這就需要排隊,另外我們可能人為設計一些應用層佇列讓請求排隊,如nginx非同步模型中的請求佇列。

證明:

我們將系統中的所有佇列簡化為乙個單一佇列。

設請求延時的值為cost, 吞吐量的值為qps。

設單位時間進入系統的請求數為n1, 不同於併發定理中描述的n1值,這n1值表示進入了系統,但不一定進行了處理,可能在乙個佇列中等待處理。設單位時間系統能夠完成的請求為n2,n2=qps, 在高併發情況下, 會有n1>n2。 同時設請求不用排隊的情況下耗時為t, 即純資源計算耗時,此時佇列長度為1,只有當前請求本身。 設某乙個時間點t 系統佇列長度為l,l表示還有多少個待處理請求,則佇列末端乙個請求的耗時就等於佇列長度乘以單個請求的耗時,即:

cost = l* t

而佇列累積長度等於到達的請求數減去已完成的請求數,即:

l = n1*t- n2*t = (n1-n2) * t

即 cost = (n1-n2) * t* t = ( n1-qps)*t*t

這證明了延時定理中的耗時與時間增長的線性關係,增長係數為( n1-qps)*t。

說明:

在乙個高併發系統中,當使用者請求速度大於系統吞吐量時,單個請求隨時間增長耗時就越長,到後面,耗時會長到難以忍受的程度,為了避免這種情況,我們需要設定系統中的佇列的最大長度,不能讓佇列長度無限增長。

3. 吞吐量定理

乙個系統的吞吐量等於各子系統最小吞吐量的值

乙個請求的處理可能分為多個階段,比如先進行網路讀寫,再cpu計算,最後寫磁碟,還可能與第三方服務互動,階段間的處理對不同請求來說都是可以並行的,即乙個請求在進行cpu計算時,同時另乙個請求可以寫磁碟,這對於具有最小吞吐量的處理階段的系統資源來說,不會處於空閒狀態,所以它也等於整個系統的吞吐量。

對於任何乙個處理階段來說,吞吐量等於處理耗時的倒數。

定理較直觀,證明略

說明:

為了提高系統的吞吐量,我們需要找到具有最小吞吐量的處理階段,即找出系統的瓶頸所在,只有對系統處理瓶頸的階段進行優化才能提高整體吞吐量。

程式語言的三大定理

最近看到不少文章,作者去比較兩種或者多種語言以試圖證明他喜愛的語言更棒。我仔細觀察過,通常而言,這些文章會側重在其他語言 指非作者喜愛的語言 的弱點上 有時候,會舉例來證明其他語言的冗長,得出結論說自己的語言 更少 更簡捷。在我看來,雖然是針對其他語言的 弱點 但作者寫這樣的文章也無可厚非,畢竟這樣...

程式語言的三大定理

最近看到不少文章,作者去比較兩種或者多種語言以試圖證明他喜愛的語言更棒。我仔細觀察過,通常而言,這些文章會側重在其他語言 指非作者喜愛的語言 的弱點上 有時候,會舉例來證明其他語言的冗長,得出結論說自己的語言 更少 更簡捷。在我看來,雖然是針對其他語言的 弱點 但作者寫這樣的文章也無可厚非,畢竟這樣...

程式語言的三大定理

最近看到不少文章,作者去比較兩種或者多種 語言以試圖證明他喜愛的語言更棒。我仔細觀察過,通常而言,這些文章會側重在其他語言 指非作者喜愛的語言 的弱點上 有時候,會舉例來證明其他語言的冗長,得出結論說自己的語言 更少 更簡捷。在我看來,雖然是針對其他語言的 弱點 但作者寫這樣的文章也無可厚非,畢竟這...