教你如何精準(zhǔn)統(tǒng)計(jì)出你的接口"QPS"
QPS是什么
我們先回憶一下,QPS的概念如下所示:
QPS(Query Per Second):每秒請(qǐng)求數(shù),就是說(shuō)服務(wù)器在一秒的時(shí)間內(nèi)處理了多少個(gè)請(qǐng)求。
那我們?cè)趺垂莱雒棵腌娔芴幚矶嗌僬?qǐng)求呢?
OK,用日志來(lái)估計(jì)!那日志怎么記錄呢,細(xì)分下來(lái),有兩種方式。
方式一:自己在接口里記錄
這種方式指的是在你的接口里,日志記錄了能體現(xiàn)該接口特性的,并具有唯一性的字符串!
例如,下面這一段代碼
@RestController @RequestMapping("/home") public class IndexController { //省略 @RequestMapping("/index") String index() { logger.info("渣渣煙"); return "index"; } }
假設(shè)現(xiàn)在我要統(tǒng)計(jì)index這個(gè)接口的QPS!
OK,什么叫能體現(xiàn)該接口特性的字符串呢!就像上面的"渣渣煙"這個(gè)字符串,只在index這個(gè)接口里出現(xiàn)過(guò),沒(méi)在其他其他接口里出現(xiàn)過(guò)!因此,只要統(tǒng)計(jì)出"渣渣煙"這個(gè)字符串在日志里的出現(xiàn)次數(shù),就能知道該接口的請(qǐng)求次數(shù)!
什么叫具有唯一性的字符串呢!所謂唯一性,指的是"渣渣煙"這個(gè)字符串,在這個(gè)接口的一次調(diào)用流程中,只出現(xiàn)一次!如果出現(xiàn)兩次,就會(huì)導(dǎo)致到時(shí)候統(tǒng)計(jì)出來(lái)的次數(shù)會(huì)多一倍,所以盡量選擇具有唯一性的字段!
方式二:利用tomcat的access log
如果你的日志里沒(méi)有我上面提到的字段。OK,那就用tomcat自帶的access log功能吧!
因?yàn)槲移綍r(shí)內(nèi)置的tomcat比較多,指定下面兩個(gè)屬性即可
server.tomcat.accesslog.directory 設(shè)定log的目錄,默認(rèn): logs server.tomcat.accesslog.enabled 是否開(kāi)啟access log,默認(rèn): false
此時(shí),你訪問(wèn)一次/home/index地址,會(huì)有下面這樣日志
127.0.0.1 - - [19/Aug/2019:23:55:27 +0800] “POST /home/index HTTP/1.1” 200 138
那么,你就可以根據(jù)日志中,該記錄的出現(xiàn)次數(shù),統(tǒng)計(jì)index接口的QPS。
實(shí)戰(zhàn)
假設(shè),你這會(huì)日志已經(jīng)拿到手了,名字為xxx.log。
假設(shè)日志內(nèi)容如下
//省略,都長(zhǎng)差不多,貼其中一條就行 0:0:0:0:0:0:0:1 - - [27/Dec/2018:20:41:57 +0800] "GET /mvc2/upload.do HTTP/1.1" 404 949 http-bio-8080-exec-5 43 //省略
這個(gè)時(shí)候,你執(zhí)行一串命令長(zhǎng)下面這樣的,進(jìn)行統(tǒng)計(jì)就行!
cat xx.log |grep 'GET /mvc2'|cut -d ' ' -f4|uniq -c|sort -n -r
出來(lái)等結(jié)果就是
20 [27/Dec/2018:20:40:44
11 [27/Dec/2018:20:47:58
10 [27/Dec/2018:20:47:42
1 [27/Dec/2018:20:41:57
然后你就知道,原來(lái)在20:40:44 分。。這個(gè)接口的QPS最高,達(dá)到了驚人的20QPS!
現(xiàn)在,來(lái)講一下命令什么意思!
cat xxx.log
: 讀文件內(nèi)容
grep ‘GET /mvc2'
: 將文件內(nèi)容按照GET /mvc2 進(jìn)行過(guò)濾
cut -d ' ' -f4
: 過(guò)濾出來(lái)的內(nèi)容按照空格進(jìn)行分割,取第四列內(nèi)容
uniq -c
: 每列旁邊顯示該行重復(fù)出現(xiàn)的次數(shù)
sort -n -r
: 依照數(shù)值的大小排序
那么,如果是其他日志格式,無(wú)外乎 ”cut語(yǔ)句“的處理不同而已,道理類(lèi)似!此法可以估算出單機(jī)的某接口的 “QPS” 是多少!
估算
我們現(xiàn)在估計(jì)出了單機(jī)的QPS。接下來(lái),估算集群的QPS。
這就要根據(jù)負(fù)載均衡的策略來(lái)估計(jì)!
比如,你部署了32臺(tái)機(jī)器,負(fù)載均衡的策略恰巧為輪詢(xún),那集群的QPS就是單機(jī)的QPS乘32就好了。
所以,根據(jù)具體的策略,來(lái)估計(jì)整個(gè)集群的QPS多大!一般有2000qps已經(jīng)是很高的了。
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
教你利用SpringBoot寫(xiě)一個(gè)屬于自己的Starter
如果我們將可獨(dú)立于業(yè)務(wù)代碼之外的功配置模塊封裝成一個(gè)個(gè)starter,復(fù)用的時(shí)候只需要將其在pom中引用依賴(lài)即可,SpringBoot為我們完成自動(dòng)裝配,簡(jiǎn)直不要太爽,這篇文章主要給大家介紹了關(guān)于如何利用SpringBoot寫(xiě)一個(gè)屬于自己的Starter,需要的朋友可以參考下2022-03-03java?常規(guī)輪詢(xún)長(zhǎng)輪詢(xún)Long?polling實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了java?常規(guī)輪詢(xún)長(zhǎng)輪詢(xún)Long?polling實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12詳解Java Web項(xiàng)目啟動(dòng)執(zhí)行順序
這篇文章主要介紹了詳解Java Web項(xiàng)目啟動(dòng)執(zhí)行順序,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Java反射機(jī)制詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Java反射機(jī)制的相關(guān)資料,主要包括反射的概念、作用2017-06-06java外部類(lèi)與內(nèi)部類(lèi)的關(guān)系詳解
本文詳細(xì)講解了java外部類(lèi)與內(nèi)部類(lèi)的關(guān)系,用代碼演示了外部類(lèi)調(diào)用內(nèi)部類(lèi)的方法。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12基于Java實(shí)現(xiàn)XML文件的解析與更新
配置文件可以有很多種格式,包括?INI、JSON、YAML?和?XML。每一種編程語(yǔ)言解析這些格式的方式都不同。本文將通過(guò)Java語(yǔ)言實(shí)現(xiàn)XML文件的解析與更新,需要的可以參考一下2022-03-03Spring+Quartz實(shí)現(xiàn)動(dòng)態(tài)任務(wù)調(diào)度詳解
這篇文章主要介紹了Spring+Quartz實(shí)現(xiàn)動(dòng)態(tài)任務(wù)調(diào)度詳解,最近經(jīng)?;趕pring?boot寫(xiě)定時(shí)任務(wù),并且是使用注解的方式進(jìn)行實(shí)現(xiàn),分成的方便將自己的類(lèi)注入spring容器,需要的朋友可以參考下2024-01-01圖解Java經(jīng)典算法歸并排序的原理與實(shí)現(xiàn)
歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide?and?Conquer)的一個(gè)非常典型的應(yīng)用。本文將通過(guò)動(dòng)圖詳解歸并排序的原理及實(shí)現(xiàn),需要的可以參考一下2022-09-09