QPS
題目
有一個消息隊列集群,集群里每臺Broker的響應時間RT都不一樣,但是每臺Broker的極限服務QPS都是一樣的,超過這個QPS會出現過載雪崩。而消息的生產者客戶端,每次發送都會選擇其中的一臺broker來發送,一般來說發送邏輯是運行在一個線程池里面。假設cpu資源充足,通過實現一個負載均衡算法,使得生產者能夠達到最大吞吐量,最優的平均響應時間,但是又不能把任何一臺服務器壓垮。已知每個broker的rt、極限qps,消息生產者的線程數量,請求總數,如果采用吞吐量最優的算法,求處理完所有請求需要的耗時,單位毫秒。
概念說明:
QPS:query per second, 每秒請求量
RT:response time,請求的響應時間(單位為ms)
Broker:消息隊列的服務器
背景知識
有一個重要的公式:
QPS(事務數/s)=并發數響應時間(s)
每臺服務器都有一個最大的QPS,服務器的響應時間的倒數是1臺客戶訪問時,每秒服務器可以處理的事務數。當有多個客戶進行訪問的話,服務器就會開多個線程(進程),在每個線程(進程)中,響應時間不會有太大變化(在客戶數不多的情況下),那么QPS就可以隨著并發數的增加而增加了。但凡事都有個度,當并發數增加到一定時,響應時間就會明顯增加了。線程(進程)變多了,服務器花費在調度上的時間比例就增加了。
在真實情況下,響應時間可以根據業務情況進行估算。比如對于人們瀏覽一個網站,響應時間100ms和500ms是沒有區別的。根據QPS的公式,在服務器最大QPS不變的情況下,增大響應時間可以增大并發數,就是一臺服務器可以服務更多的客戶,從而減少服務器成本。
回到題目
題目中已經給出了main()函數,我們需要完成doneTime()函數。對于題目中給出的例子,共有10個線程,5個服務器。我原本以為只有一個客戶端,最多只能有10個線程,后來發現并不是這樣的。我們可以5個客戶端50個線程一起去訪問5個服務器。那么對于每個服務器,響應時間和并發數都已知,那么QPS就可以計算出來,若QPS太大,就取QPS的上限。將5個QPS相加,就是這個集群的QPS。請求總數除以集群的QPS就是花費的時間。
按照自己的理解,畫出題目中的例子表達圖,有利于理解情景。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int maxQps= Integer.valueOf(in.nextLine());
final String[] rtList = in.nextLine().split(",");
final int requestNum = Integer.valueOf(in.nextLine());
final int threadNum = Integer.valueOf(in.nextLine());
System.out.println(doneTime(maxQps, rtList, requestNum, threadNum));
}
/**
* 如果使用最優的最大吞吐量負載均衡算法,按照最優模型多久能夠處理完所有請求,單位毫秒。
* @return
*/
static long doneTime(int maxQps,String[] rtList,int requestNum,int threadNum) {
//TODO
int qpsSum = 0;
for (String rtString : rtList) {
int singleMaxQps = threadNum * 1000 / Integer.valueOf(rtString);
if (singleMaxQps > maxQps) {
qpsSum += maxQps;
}else {
qpsSum += singleMaxQps;
}
}
return requestNum / qpsSum * 1000;
}
}
【Reference】
http://www.cnblogs.com/zhulin-jun/p/6597074.html
https://dearhwj.gitbooks.io/itbook/content/test/performance_test_qps_tps.html
總結
- 上一篇: js获取当前时间(昨天、今天、明天)
- 下一篇: 荣耀亲选推出 ongo 智能摄像头京东小