qps是什麼意思 深入淺出QPS RT和最佳執行緒數

2021-10-11 19:53:12 字數 2946 閱讀 7957

什麼是qps:

qps是每秒鐘處理完請求的次數。這裡的請求不是指乙個查詢或者資料庫查詢,是包括乙個業務邏輯的整個流程,也就是說每秒鐘響應的請求次數。

響應時間即rt,處理一次請求所需要的平均處理時間。對於rt,客戶端和服務端是大不相同的,因為請求從客戶端到服務端,需要經過廣域網,所以客戶端rt往往遠大於服務端rt,同時客戶端的rt往往決定著使用者的真實體驗,服務端rt往往是評估我們系統好壞的乙個關鍵因素。

最佳執行緒數的困擾:

在開發過程中,我們一定面臨過很多的執行緒數量的配置問題,這種問題往往讓人摸不到頭腦,往往都是拍腦袋給出乙個執行緒池的數量,但這可能恰恰是不靠譜的,過小的話會導致請求rt極具增加,過大也一樣rt也會公升高。所以對於最佳執行緒數的評估往往比較麻煩。

qps和rt的關係:

單執行緒場景:

假設我們的服務端只有乙個執行緒,那麼所有的請求都是序列執行,我們可以很簡單的算出系統的qps,也就是:qps = 1000ms/rt。假設乙個rt過程中cpu計算的時間為49ms,cpu wait time 為200ms,那麼qps就為1000/49+200 = 4.01。

多執行緒場景

我們接下來把服務端的執行緒數提公升到2,那麼整個系統的qps則為:2 *(1000/49+200)=8.02。可見qps隨著執行緒的增加而線性增長,那qps上不去就加執行緒唄,聽起來很有道理,公式也說得通,但是往往現實並非如此,後面會聊這個問題。

最佳執行緒數?

從上面單執行緒場景來看,cpu wait time為200ms,你可以理解為cpu這段時間什麼都沒做,是空閒的,顯然我們沒把cpu利用起來,這時候我們需要啟多個執行緒去響應請求,把這部分利用起來,那麼啟動多少個執行緒呢?我們可以估算一下 空閒時間200ms,我們要把這部分時間轉換為cpu time,那麼就是200+49/49 = 5.08個,不考慮上下文切換的話,約等於5個執行緒。同時還要考慮cpu的核心數和利用率問題,那麼我們得到了最佳執行緒數計算的公式:rt/cpu time * coresize * cupratio。

最大qps?

得到了最大的執行緒數和qps的計算方式:

qps = thread num * 單執行緒qps = (cpu time + cpu wait time)/cpu time * coresize * cupratio * (1000ms/(cpu time + cpu wait time)) = 1000ms/(cpu time) * coresize * cpuratio

所以決定乙個系統最大的qps的因素是cpu time、coresize和cpu利用率。看似增加cpu核數(或者說執行緒數)可以成倍的增加系統qps,但實際上增加執行緒數的同時也增加了很大的系統負荷,更多的上下文切換,qps和最大的qps是有偏差的。

cpu time & cpu wait time & cpu 利用率

cpu time就是一次請求中,實際用到計算資源。cpu time的消耗是全流程的,涉及到請求到應用伺服器,再從應用伺服器返回的全過程。實際上這取決於你的計算的複雜度。

cpu wait time是一次請求過程中對於io的操作,cpu這段時間可以理解為空閒的,那麼此時要盡量利用這些空閒時間,也就是增加執行緒數。

cpu 利用率是業務系統利用到cpu的比率,因為往往乙個系統上會有一些其他的執行緒,這些執行緒會和cpu競爭計算資源,那麼此時留給業務的計算資源比例就會下降,典型的像,gc執行緒的gc過程、鎖的競爭過程都是消耗cpu的過程。甚至一些io的瓶頸,也會導致cpu利用率下降(cpu都在wait io,利用率當然不高)。

增加cpu核數對qps的提公升

從上面的公式我們可以看出,假設cpu time和cpu 利用率不變,增加cpu的核數能使qps呈線性增長。但是很遺憾,現實中不是這樣的....首先先看一下阿姆達爾定律:

阿姆達爾定律是乙個很有意思的定律,簡單的我們可以理解為,程式中可並行**的比例決定你增加處理器(總核心數)所能帶來的速度提公升的上限 。換句話說就是序列化對於你系統吞吐量的影響。舉個栗子:

1.坐車問題:

假設你想從望京去順義,那麼你智慧型坐著一輛車過去,雖然現在有十輛車,你也不能提公升十倍的效率,這裡f就是1,因為所有的動作都需要序列,speedup就等於1,效率沒提公升,雖然你有九輛車。

2.寫**問題:

假設你現在開發乙個系統,你可以把所有的任務均分下去,假設10個人幫你開發,那麼f就為0,n為10,那麼speedup等於10,也就是說你提公升了10倍的速率。

這裡的n就是我們的核數。在f為0的時候可以成倍增加計算效率,但是很遺憾f不為0,同時隨著你的請求數的增加,f的值也在增加,當這個序列率達到一定程度的時候,你的系統是沒有任何效果的提公升的。當f不變的時候,n增加,那麼speedup增加。但是當n->∞,那麼整個公式就變成了1/f,也就是說當核數不斷增大的時候,speedup是有上限的。

同樣,對於1000ms/(cpu time) * coresize * cpuratio我們不斷的增加coresize或者說執行緒數的時候。我們的請求變多了,隨之而來的就是大量的上下文切換、大量的gc、大量的鎖徵用,這些序列化的因素會大大增加f值,也會大大的增加cpu time。假設我們的序列部分不變的話,增大核數,cpu不能得到充分的利用,利用率也會降低。所以,對於阿姆達爾定律而言,序列化的比率才是決定著是否能成倍增長效率的關鍵。也就是說最佳執行緒數也好,最大qps也好,增加核心數量不一定能是系統指標有成倍的增長。更關鍵的是能改變自己的架構,減小序列的比率,讓cpu更充分的利用,達到資源的最大利用率。

再看一下最佳執行緒數和最大qps

通過上面一些例子,我們發現當執行緒數增加的時候,執行緒的上下文切換會增加,gc time會增加。這也就導致cpu time 增加,qps減小,rt也會隨著增大。這顯然不是我們希望的,我們希望的是在核數一定的情況下找到某個點,使系統的qps最大,rt相對較小。所以我們需要不斷的壓測,調整執行緒池,找到這個qps的峰值,並且使cpu的利用率達到100%,這樣才是系統的最大qps和最佳執行緒數。

深入淺出談儲存之NAS是什麼

贊 0 分享標籤 nas 企業nas 儲存系統 it168 技術 it男們經常受到兩個訊息的折磨 好訊息是,有姑娘主動打來 了 壞訊息是,她們只是想讓你幫忙裝個電腦而已。這是多麼令人沮喪的事情,因為你最多花10分鐘在香閨連好線,姑娘們就要打發你回家了 關於如何盡量在香閨裡拖延時間,我們另文討論 很多...

深入淺出談儲存之NAS是什麼

nas是network attached storage的簡稱。中文一般稱為 網路附加儲存 或者 網路連線儲存 我們可以顧名思義的把nas理解成通過網路提供儲存的裝置。比如你在裝了linux的電腦上共享乙個目錄,讓其他linux客戶能夠通過nfs協議訪問該目錄,那這台電腦就是一定意義上的nas。如果...

深入淺出空間索引 為什麼需要空間索引

一 問題 先思考個常見的問題 如何根據自己所在位置查詢來查詢附近50公尺的poi point of interest,比如商家 景點等 呢 圖1a 每個poi都有經緯度資訊,我用圖1b的sql語句在mysql中建立了poi spatial的表,其中lat和lng兩個欄位來代表緯度和經度。為後續分析方...