當在與網站相同的伺服器上執行 apache bench 時,如下所示:
ab -n 1000 -c 10 localhost:8080/
與從不同位置存取伺服器的使用者相比,我很可能無法獲得準確的結果。
我試圖了解這將如何或為什麼會影響現實世界的性能,因為與同一州/國家的用戶相比,中國的用戶會遇到不同的延遲問題。
假設我的 Web 伺服器的最大執行緒限制為 100。
有人可以詳細解釋最終用戶延遲如何影響伺服器效能。
我在這裡假設每個請求將在 10 毫秒內同等計算。
我不明白的是外部因素如何影響整體伺服器效能,特別是網路連線(位置,甚至是行動裝置等)和 http/tcp 握手等。
答案1
一般來說,最終用戶延遲不會影響伺服器效能。主要區別在於,隨著最終用戶延遲較高,您的伺服器一次會有更多連接,因為每個連接需要更長的時間才能完成。但伺服器仍然為每個連接執行大約相同數量的工作。只要您沒有達到伺服器限制(主要是記憶體限制),就沒關係。
在處理完整個請求之前,伺服器不會開始為連線執行任何繁重的工作。因此,如果建立連接和獲取請求需要更長的時間,則表示伺服器在進行真正的處理之前會等待更長的時間,而基本上不會執行任何操作。
通常,伺服器會一次性處理請求並將回應排隊。客戶端和網路延遲可能意味著清空該佇列需要更長的時間。但是伺服器中處理此問題的部分已經過大量最佳化,並且特定頁面或物件的邏輯已經運行完成產生回應。同樣,這通常不會對伺服器效能產生重大影響。
然而,客戶體驗可能會更糟。如果服務有很多情況,客戶端必須從伺服器獲取信息,然後連接回來以獲取更多信息,則尤其如此。例如,如果一個網頁告訴客戶端加載一堆幀,然後這些幀告訴客戶端加載一堆圖像,那麼在加載之前將會有許多「來回」操作(每次都會增加網路延遲)。但伺服器執行相同數量的工作。
答案2
實際上這不會是一個問題,除非你有一個即時運行的、多處理器(例如,1K Cpu)、大量記憶體的超級電腦...
在多進程系統中,所有進程都有一個時間窗口,稱為Quantum Size
。具有多進程功能的作業系統(大約從 80 年代到 90 年代一直到今天)會在運行的進程之間來回切換,從而為每個進程提供量子大小。在我們的現代作業系統中,這個時間視窗約為 20 毫秒,而且切換速度非常快,切換開銷非常低。假設我們有一個 cpu,兩個進程在 1 秒(等於 1000 毫秒)之間切換,我們可以運行它們 900-950-980(也許)毫秒(差異在於進程切換)。不管怎樣,正如我所說,這種切換完成得非常快,想像一下有 50 個進程正在運行,我們看到所有進程都在同時運行。實際上它們不是,這是多處理、進程調度的基礎...
當進程中有多個執行緒時,作業系統會先調度進程並給它一個量子,然後調度該進程中的執行緒。在這個時間段中,執行緒也在進行調度。當整個量程結束時,作業系統會調度另一個進程(或根據調度演算法進行相同的進程),而該新進程中的執行緒也將被調度。
線程有兩個層級的執行環境。一是用戶級,二是核心級。我上面提到的就是使用者等級。該量子大小中的進程調度、執行緒調度。但是,當您深入到核心層級時,調度程序可以調度來自不同進程的不同執行緒。量子直接應用於核心層級的線程......
講完所有這些之後,讓我們開始了解結束連線延遲如何影響伺服器效能:
如果你想要最大的效能,你的執行緒必須處於核心級別,我知道 apache 執行緒不處於核心模式。 Apache本身處於用戶模式,它是一個用戶端應用程序,它的執行緒運行在用戶級模式下。所以你不會以任何方式從該伺服器獲得 %100 的效能...假設線程在核心模式下運行並且你有兩個 cpu。第一個 cpu 一個線程,第二個 cpu 一個線程。現在兩個執行緒確實同時運行。從作業系統的角度來看,Web 工作線程實際上是一個I/O Bounded
線程,當它請求某些檔案時,它將被阻塞,直到檔案準備好為止。調度程序將調度另一個工作執行緒運行。當「那個」檔案準備好時,阻塞的執行緒將移至就緒佇列並再次被調度。那麼好吧...如果你有 100 個工作線程會發生什麼?這個問題又帶來了另一個問題:工作執行緒是什麼時候創建的?
對於 Web 伺服器應用程式來說,工作執行緒在 時創建low-level IP connection is made
。因此,您實際的兩個線程已經在運行,一個由硬體建立的新連接(它們有自己的PU,併中斷主系統進行數據信息傳輸),彈出一個新的工作線程,它被發送到就緒隊列進行調度...
回到主題,外部因素如何影響系統性能。這都是關於系統限制的。無論系統是否有足夠的處理單元來處理執行緒數,都會影響效能。基本數學,兩個處理器僅同時處理兩個執行緒...網路連接錯誤寬度透過「它可以接受多少個連接」來影響效能。假設連線資料為 10 字節,頻寬為每秒 100 字節,則每秒可以有 10 個連線...
擴展這些取決於你。你必須記住一件事:你的總CPU資源已經在處理那些已經在就緒佇列中的線程......所以當一個新線程彈出時,它不會讓當前線程的情況變得更糟。
伺服器應用程式時,效能可能是一個問題。首先開始。很快就會達到上限。這是汽車的加速。它會先加速,一段時間後達到最高速度。您可以保持最高速度,直到耗盡汽油或將腳從油門踏板移開。