目錄
一、下載安裝及使用
二、性能測(cè)試常用指數(shù)簡(jiǎn)介
1、TPS,每秒事務(wù)數(shù)
2、系統(tǒng)吞吐量 QPS(TPS)
3、TRT,事務(wù)響應(yīng)時(shí)間
4、PerfMon Metrics Collector
三、JMeter的重要參數(shù)簡(jiǎn)介
1、JMeter客戶端實(shí)現(xiàn)方式簡(jiǎn)介
2、Keep-Alive模式
3、自動(dòng)重定向與跟隨重定向
四、JMeter工具常用界面設(shè)置
1、線程組
2、添加HTTP請(qǐng)求?編輯
3、聚合報(bào)告簡(jiǎn)介
五、JMeter壓力測(cè)試時(shí)遇到的常見(jiàn)問(wèn)題
1、Response Times Over Time中的峰值和聚合報(bào)告中的最大值為何不一致?
2、Response Times Over Time圖中有多少個(gè)點(diǎn),和請(qǐng)求數(shù)有什么關(guān)系?
3、壓測(cè)接口時(shí),并發(fā)一段時(shí)間后,會(huì)報(bào)java.net.BindException: Address already in use: connect
4、internal server error是什么意思?
5、Internal server error 500 問(wèn)題解決思路
(1)明確錯(cuò)誤含義
(2)檢查HAProxy
(3)檢查Jetty
(4)檢查應(yīng)用
(5)使用tcpdump抓包
6、JMeter問(wèn)題總結(jié)
六、Linux查看程序運(yùn)行情況
1、Top
2、查看CPU使用率
3、查看內(nèi)存占用情況
4、Linux如何統(tǒng)計(jì)進(jìn)程的CPU利用率
5、CPU使用率與CPU空閑時(shí)間的關(guān)系?
一、下載安裝及使用
下載地址:jmeter-plugins.org
安裝:下載后文件為plugins-manager.jar格式,將其放入jmeter安裝目錄下的lib/ext目錄,然后重啟jmeter,即可。
啟動(dòng)jemter,點(diǎn)擊選項(xiàng),最下面的一欄,如下圖所示:
打開(kāi)后界面如下:
Installed Plugins(已安裝的插件):即插件jar包中已經(jīng)包含的插件,可以通過(guò)選中勾選框,來(lái)使用這些插件;
Available Plugins(可下載的插件):即該插件擴(kuò)展的一些插件,可以通過(guò)選中勾選框,來(lái)下載你所需要的插件;
Upgrades(可更新的插件):即可以更新到最新版本的一些插件,一般顯示為加粗斜體,可以通過(guò)點(diǎn)擊截圖右下角的Apply Changes and Restart Jmeter按鈕來(lái)下載更新;
PS:一般不建議進(jìn)行更新操作,因?yàn)樽钚碌牟寮加幸恍┘嫒輪?wèn)題,而且很可能導(dǎo)致jmeter無(wú)法使用(經(jīng)常報(bào)加載類(lèi)異常)?。?!
建議使用jmeter最新的3.2版本來(lái)嘗試更新這些插件。
二、性能測(cè)試常用指數(shù)簡(jiǎn)介
1、TPS,每秒事務(wù)數(shù)
Transactions per Second
即TPS:每秒事務(wù)數(shù),性能測(cè)試中,最重要的2個(gè)指標(biāo)之一。該插件的作用是在測(cè)試腳本執(zhí)行過(guò)程中,監(jiān)控查看服務(wù)器的TPS表現(xiàn)————比如整體趨勢(shì)、實(shí)時(shí)平均值走向、穩(wěn)定性等。
jmeter本身的安裝包中,監(jiān)視器雖然提供了比如聚合報(bào)告這種元件,也能提供一些實(shí)時(shí)的數(shù)據(jù),但相比于要求更高的性能測(cè)試需求,就稍顯乏力。
某次壓力測(cè)試TPS變化展示圖:
2、系統(tǒng)吞吐量 QPS(TPS)
系統(tǒng)吞吐量 = 每秒處理的事務(wù)數(shù)
QPS(TPS)= 并發(fā)數(shù)/平均響應(yīng)時(shí)間
一個(gè)系統(tǒng)吞吐量通常由QPS(TPS)、并發(fā)數(shù)兩個(gè)因素決定,每套系統(tǒng)這兩個(gè)值都有一個(gè)相對(duì)極限值,在應(yīng)用場(chǎng)景訪問(wèn)壓力下,只要某一項(xiàng)達(dá)到系統(tǒng)最高值,系統(tǒng)的吞吐量就上不去了,如果壓力繼續(xù)增大,系統(tǒng)的吞吐量反而會(huì)下降,原因是系統(tǒng)超負(fù)荷工作,上下文切換、內(nèi)存等等其它消耗導(dǎo)致系統(tǒng)性能下降。
3、TRT,事務(wù)響應(yīng)時(shí)間
Response Times Over Time
即TRT:事務(wù)響應(yīng)時(shí)間,性能測(cè)試中,最重要的兩個(gè)指標(biāo)的另外一個(gè)。該插件的主要作用是在測(cè)試腳本執(zhí)行過(guò)程中,監(jiān)控查看響應(yīng)時(shí)間的實(shí)時(shí)平均值、整體響應(yīng)時(shí)間走向等。
使用方法如上,下載安裝配置好插件之后,重啟jmeter,添加該監(jiān)視器,即可實(shí)時(shí)看到實(shí)時(shí)的TRT數(shù)值及整體表現(xiàn)。
某次壓力測(cè)試TRT變化展示圖:
4、PerfMon Metrics Collector
即服務(wù)器性能監(jiān)控?cái)?shù)據(jù)采集器。在性能測(cè)試過(guò)程中,除了監(jiān)控TPS和TRT,還需要監(jiān)控服務(wù)器的資源使用情況,比如CPU、memory、I/O等。該插件可以在性能測(cè)試中實(shí)時(shí)監(jiān)控服務(wù)器的各項(xiàng)資源使用。
下載地址:http://jmeter-plugins.org/downloads/all/或鏈接:http://pan.baidu.com/s/1skZS0Zb 密碼:isu5
下載界面如下:
其中JMeterPlugins-Standard和JMeterPlugins-Extras是客戶端的插件,ServerAgent是服務(wù)端的插件。
下載成功后,復(fù)制JmeterPlugins-Extras.jar和JmeterPlugins-Standard.jar兩個(gè)文件,放到j(luò)meter安裝文件中的lib/ext中,重啟jmeter,即可看到該監(jiān)視器插件。
將ServerAgent-2.2.1.jar上傳到被測(cè)服務(wù)器,解壓,進(jìn)入目錄,Windows環(huán)境,雙擊ServerAgent.bat啟動(dòng);linux環(huán)境執(zhí)ServerAgent.sh啟動(dòng),默認(rèn)使用4444端口。
如出現(xiàn)如下圖所示情況,即表明服務(wù)端配置成功:
(1)服務(wù)端啟動(dòng)校驗(yàn)
CMD進(jìn)入命令框,觀察是否有接收到消息,如果有,即表明ServerAgent成功啟動(dòng)。
(2)客戶端監(jiān)聽(tīng)測(cè)試
給測(cè)試腳本中添加jp@gc - PerfMon Metrics Collector監(jiān)聽(tīng)器,然后添加需要監(jiān)控的服務(wù)器資源選項(xiàng),啟動(dòng)腳本,即可在該監(jiān)聽(tīng)器界面看到資源使用的曲線變化。如下圖所示:
在腳本啟動(dòng)后,即可從界面看到服務(wù)器資源使用的曲線變化,Chart表示主界面顯示,Rows表示小界面以及不同資源曲線所代表的顏色,Settings表示設(shè)置,可選擇自己需要的配置。
PS:注意測(cè)試腳本需要持續(xù)運(yùn)行一段時(shí)間,才可以看到具體的曲線變化,否則ServerAgent端會(huì)斷開(kāi)連接!
三、JMeter的重要參數(shù)簡(jiǎn)介
1、JMeter客戶端實(shí)現(xiàn)方式簡(jiǎn)介
1、Java:選擇壓測(cè)時(shí),鏈接是復(fù)用的(代碼中的http調(diào)用都加了連接池)
2、httpclient4:壓測(cè)時(shí),每請(qǐng)求一次都創(chuàng)建一個(gè)新的鏈接,(jmeter5.0以前默認(rèn)關(guān)閉了連接復(fù)用,5.0上是打開(kāi)的:即每請(qǐng)求一次都會(huì)創(chuàng)建一個(gè)新的鏈接)。
從JMeter 5.0開(kāi)始,當(dāng)使用默認(rèn)的HC4實(shí)現(xiàn)時(shí),JMeter將在每個(gè)線程組迭代時(shí)重置HTTP狀態(tài)(SSL狀態(tài)+連接)。如果您不想要此行為,請(qǐng)?jiān)O(shè)置httpclient.reset_state_on_thread_group_iteration = false
?所以httpclient4 在連接復(fù)用設(shè)置打開(kāi)的情況下,壓測(cè)結(jié)果與java的是不一樣的,因?yàn)閖ava復(fù)用鏈接,httpclient4每次連接都會(huì)重新建立tcp連接,如果httpclient4吞吐量過(guò)低,需要考慮網(wǎng)絡(luò)帶寬的限制
java實(shí)現(xiàn)適合壓榨性測(cè)試,httpclient4適合真實(shí)場(chǎng)景的模擬,
連接池的作用于原理:
正常訪問(wèn)數(shù)據(jù)庫(kù)的過(guò)程中,每次訪問(wèn)都需要?jiǎng)?chuàng)建新的連接,這會(huì)消耗大量的資源;連接池的就是為數(shù)據(jù)庫(kù)連接建立一個(gè)“緩沖區(qū)”,預(yù)先在緩沖池中放入一定數(shù)量的連接對(duì)象,當(dāng)需要建立數(shù)據(jù)庫(kù)連接時(shí),只需從“緩沖池”中取出一個(gè),使用完畢之后再放回去;且連接池允許多個(gè)客戶端使用緩存起來(lái)的連接對(duì)象,這些對(duì)象可以連接數(shù)據(jù)庫(kù),它們是共享的、可被重復(fù)使用的;使用連接池可以節(jié)省大量資源,提高程序運(yùn)行速度。
連接池的基本原理是:
先初始化一定的數(shù)據(jù)庫(kù)連接對(duì)象,并且把這些連接保存在連接池中。這些數(shù)據(jù)庫(kù)連接的數(shù)量是由最小數(shù)據(jù)庫(kù)連接數(shù)來(lái)設(shè)定的。連接池的最大數(shù)據(jù)庫(kù)連接數(shù)量限定了這個(gè)連接池能占有的最大連接數(shù),當(dāng)應(yīng)用程序向連接池請(qǐng)求的連接數(shù)超過(guò)最大連接數(shù)量時(shí),這些請(qǐng)求將被加入到等待隊(duì)列中。當(dāng)程序需要訪問(wèn)數(shù)據(jù)庫(kù)的時(shí)候,如果連接池中有空閑的連接,可直接得到一個(gè)連接;如果連接池對(duì)象中沒(méi)有空閑的連接,且連接數(shù)沒(méi)有達(dá)到最大,會(huì)創(chuàng)建一個(gè)新的連接從連接池中取出一個(gè)連接,數(shù)據(jù)庫(kù)操作結(jié)束后,再把這個(gè)用完的連接重新放回連接池。
2、Keep-Alive模式
我們知道Http協(xié)議采用“請(qǐng)求-應(yīng)答”模式,當(dāng)使用普通模式,即非Keep-Alive模式時(shí),每個(gè)請(qǐng)求/應(yīng)答,客戶端和服務(wù)器都要新建一個(gè)連接,完成之后立即斷開(kāi)連接;當(dāng)使用Keep-Alive模式時(shí),Keep-Alive功能使客戶端到服務(wù)器端的連接持續(xù)有效,當(dāng)出現(xiàn)對(duì)服務(wù)器的后繼請(qǐng)求時(shí),Keep-Alive功能避免了建立或者重新建立連接。
http1.0中默認(rèn)是關(guān)閉的,需要在http頭加入”Connection: Keep-Alive”,才能啟用Keep-Alive;
http 1.1中默認(rèn)啟用Keep-Alive,如果加入”Connection: close “才關(guān)閉。目前大部分瀏覽器都是用http1.1協(xié)議,也就是說(shuō)默認(rèn)都會(huì)發(fā)起Keep-Alive的連接請(qǐng)求了,所以是否能完成一個(gè)完整的Keep- Alive連接就看服務(wù)器設(shè)置情況。
開(kāi)啟Keep-Alive的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):Keep-Alive模式更加高效,因?yàn)楸苊饬诉B接建立和釋放的開(kāi)銷(xiāo)。
缺點(diǎn):長(zhǎng)時(shí)間的Tcp連接容易導(dǎo)致系統(tǒng)資源無(wú)效占用,浪費(fèi)系統(tǒng)資源。
3、自動(dòng)重定向與跟隨重定向
Redirect Automatically(自動(dòng)重定向):只針對(duì)Get和Head請(qǐng)求,勾選此項(xiàng)則“跟隨重定向”失效;自動(dòng)重定向可以自動(dòng)轉(zhuǎn)向到最終目標(biāo)頁(yè)面,但是Jmeter是不記錄重定向的過(guò)程內(nèi)容,比如在察看結(jié)果樹(shù)中是無(wú)法找到重定向過(guò)程內(nèi)容的(A重定向到B,此時(shí)只記錄B的內(nèi)容不去記錄A的內(nèi)容)
Follow Redirects(跟隨重定向):Http Request取樣器的默認(rèn)選項(xiàng),當(dāng)響應(yīng)code是3xx時(shí)(301永久性轉(zhuǎn)移,302暫時(shí)性轉(zhuǎn)移),自動(dòng)跳轉(zhuǎn)到目標(biāo)地址。與自動(dòng)重定向不同,Jmeter會(huì)記錄重定向過(guò)程中的所有請(qǐng)求響應(yīng),在查看結(jié)果樹(shù)時(shí)可以看到服務(wù)器返回的內(nèi)容,所以此時(shí)可以對(duì)響應(yīng)的內(nèi)容做關(guān)聯(lián)。
四、JMeter工具常用界面設(shè)置
1、線程組
1、線程數(shù):表示啟動(dòng)的線程數(shù),也就是并發(fā)的數(shù)量。
2、Ramp-Up Period:表示1秒內(nèi)啟動(dòng)1個(gè)線程,默認(rèn)為0,表示程序啟動(dòng)后,立即開(kāi)啟1個(gè)線程,設(shè)置太大或太小都不是很好,設(shè)置的最佳值,Ramp-Up Period = 線程數(shù)/吞吐量。
3、循環(huán)次數(shù):表示每個(gè)線程要發(fā)送多少次請(qǐng)求。
4、調(diào)度器:顧名思義,持續(xù)時(shí)間如果設(shè)置為60,表示持續(xù)1分鐘,通常循環(huán)次數(shù)和調(diào)度器設(shè)置一個(gè)即可。
2、添加HTTP請(qǐng)求
一個(gè)HTTP請(qǐng)求有著許多的配置參數(shù),下面將詳細(xì)介紹:
1、名稱:本屬性用于標(biāo)識(shí)一個(gè)取樣器,建議使用一個(gè)有意義的名稱。
2、注釋:對(duì)于測(cè)試沒(méi)有任何作用,僅用戶記錄用戶可讀的注釋信息。
3、服務(wù)器名稱或IP :HTTP請(qǐng)求發(fā)送的目標(biāo)服務(wù)器名稱或IP地址。
4、端口號(hào):目標(biāo)服務(wù)器的端口號(hào),默認(rèn)值為80 。
5、協(xié)議:向目標(biāo)服務(wù)器發(fā)送HTTP請(qǐng)求時(shí)的協(xié)議,可以是http或者是https ,默認(rèn)值為http 。
6、方法:發(fā)送HTTP請(qǐng)求的方法,可用方法包括GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等。
7、Content encoding :內(nèi)容的編碼方式,默認(rèn)值為iso8859
8、路徑:目標(biāo)URL路徑(不包括服務(wù)器地址和端口)
9、自動(dòng)重定向:如果選中該選項(xiàng),當(dāng)發(fā)送HTTP請(qǐng)求后得到的響應(yīng)是302/301時(shí),JMeter 自動(dòng)重定向到新的頁(yè)面。
10、Use keep Alive : 當(dāng)該選項(xiàng)被選中時(shí),jmeter 和目標(biāo)服務(wù)器之間使用 Keep-Alive方式進(jìn)行HTTP通信,默認(rèn)選中。
11、Use multipart/from-data for HTTP POST :當(dāng)發(fā)送HTTP POST 請(qǐng)求時(shí),使用Use multipart/from-data方法發(fā)送,默認(rèn)不選中。
12、同請(qǐng)求一起發(fā)送參數(shù) : 在請(qǐng)求中發(fā)送URL參數(shù),對(duì)于帶參數(shù)的URL ,jmeter提供了一個(gè)簡(jiǎn)單的對(duì)參數(shù)化的方法。用戶可以將URL中所有參數(shù)設(shè)置在本表中,表中的每一行是一個(gè)參數(shù)值對(duì)(對(duì)應(yīng)RUL中的 名稱1=值1)。
13、同請(qǐng)求一起發(fā)送文件:在請(qǐng)求中發(fā)送文件,通常,HTTP文件上傳行為可以通過(guò)這種方式模擬。/14、從HTML文件獲取所有有內(nèi)含的資源:當(dāng)該選項(xiàng)被選中時(shí),jmeter在發(fā)出HTTP請(qǐng)求并獲得響應(yīng)的HTML文件內(nèi)容后,還對(duì)該HTML進(jìn)行Parse 并獲取HTML中包含的所有資源(圖片、flash等),默認(rèn)不選中,如果用戶只希望獲取頁(yè)面中的特定資源,可以在下方的Embedded URLs must match 文本框中填入需要下載的特定資源表達(dá)式,這樣,只有能匹配指定正則表達(dá)式的URL指向資源會(huì)被下載。
15、用作監(jiān)視器:此取樣器被當(dāng)成監(jiān)視器,在Monitor Results Listener 中可以直接看到基于該取樣器的圖形化統(tǒng)計(jì)信息。默認(rèn)為不選中。
16、Save response as MD5 hash:選中該項(xiàng),在執(zhí)行時(shí)僅記錄服務(wù)端響應(yīng)數(shù)據(jù)的MD5值,而不記錄完整的響應(yīng)數(shù)據(jù)。在需要進(jìn)行數(shù)據(jù)量非常大的測(cè)試時(shí),建議選中該項(xiàng)以減少取樣器記錄響應(yīng)數(shù)據(jù)的開(kāi)銷(xiāo)。
3、聚合報(bào)告簡(jiǎn)介
我認(rèn)為聚合報(bào)告應(yīng)該是JMeter壓力測(cè)試軟件中最重要的報(bào)告。
1. #Samples:樣本數(shù),如果你看過(guò)上一篇,這個(gè)就是前面我們那個(gè)公式算出來(lái)的結(jié)果
(Loop Count(Loop Controler)*Number of Threads*Loop Count(group))
2. Average:平均響應(yīng)時(shí)間。
3. Median:中位數(shù),50%用戶響應(yīng)時(shí)間。
4. Line:90%用戶響應(yīng)時(shí)間。
5. Min:最小響應(yīng)時(shí)間。
6. Max:最大響應(yīng)時(shí)間。
7. Error%:本次測(cè)試中出現(xiàn)錯(cuò)誤的請(qǐng)求的數(shù)量/請(qǐng)求的總數(shù)
8. Throughput:吞吐量,表示每秒完成的請(qǐng)求數(shù)。
9. KB/Sec:每秒從服務(wù)器端接收到的數(shù)據(jù)量(只是接收)。
五、JMeter壓力測(cè)試時(shí)遇到的常見(jiàn)問(wèn)題
1、Response Times Over Time中的峰值和聚合報(bào)告中的最大值為何不一致?
因?yàn)镽esponse Times Over Time中的點(diǎn)是一個(gè)時(shí)間的概念,表示的是一段時(shí)間內(nèi)的請(qǐng)求的平均響應(yīng)時(shí)間,而聚合報(bào)告中的最大值表示的是一個(gè)請(qǐng)求的最大響應(yīng)時(shí)間,因此Response Times Over Time的峰值和聚合報(bào)告中的最大值不一致。
2、Response Times Over Time圖中有多少個(gè)點(diǎn),和請(qǐng)求數(shù)有什么關(guān)系?
Response Times Over Time中的點(diǎn)是一個(gè)時(shí)間的概念,在setting中可以設(shè)置,每隔500ms記錄一個(gè)點(diǎn),這個(gè)點(diǎn)就表示這段時(shí)間內(nèi)的請(qǐng)求的平均響應(yīng)時(shí)間。
3、壓測(cè)接口時(shí),并發(fā)一段時(shí)間后,會(huì)報(bào)java.net.BindException: Address already in use: connect
原因:
Jmeter里的http sample勾選了keep alive,導(dǎo)致會(huì)話一直保持,而windows本身的端口有限,導(dǎo)致端口被占用完后,無(wú)法分配新的端口,因此會(huì)產(chǎn)生java.net.BindException: Address already in use: connect 報(bào)錯(cuò)。
解決方案:
HTTP SAMPLE 不勾選keep alive
4、internal server error是什么意思?
internal server error錯(cuò)誤通常發(fā)生在用戶訪問(wèn)網(wǎng)頁(yè)的時(shí)候發(fā)生,該錯(cuò)誤的意思是因特網(wǎng)服務(wù)錯(cuò)誤。能夠引起internal server error報(bào)錯(cuò)的原因有多個(gè),如果你是網(wǎng)站主的話,可以對(duì)下列情形進(jìn)行一一排查。
(1)服務(wù)器資源超載
如果網(wǎng)站文件沒(méi)有做過(guò)修改,最有可能的是同服務(wù)器的資源超載:即同一時(shí)間內(nèi)處理器有太多的進(jìn)程需要處理的時(shí)候,會(huì)出現(xiàn)500錯(cuò)誤。借助SSH,可以在命令行中輸入以下命令查看:ps faux ps faux |grep username 如果你查到某個(gè)進(jìn)程消耗過(guò)多資源,可以用kill命令強(qiáng)制關(guān)閉這個(gè)進(jìn)程,只需輸入該進(jìn)程的進(jìn)程號(hào)(Pid):kill -9 pid。
(2)文件權(quán)限設(shè)置錯(cuò)誤
500錯(cuò)誤還有可能是對(duì)文件設(shè)置了不正確的權(quán)限:后臺(tái)目錄和文件的權(quán)限默認(rèn)應(yīng)該是755,而圖片,文字等html文件應(yīng)該是644,所以如果在剛剛上傳文件后出現(xiàn)500錯(cuò)誤,應(yīng)該主要檢查文件權(quán)限設(shè)置??梢允褂肍TP軟件選中所有文件,然后批量修改文件權(quán)限。
(3)htaccess文件寫(xiě)入錯(cuò)誤的代碼
在使用某些wordpress SEO插件的時(shí)候,插件會(huì)改寫(xiě).htacess文件,如果語(yǔ)法錯(cuò)誤的話就有可能造成500錯(cuò)誤!
5、Internal server error 500 問(wèn)題解決思路
(1)明確錯(cuò)誤含義
500 Internal Server Error
通用錯(cuò)誤消息,服務(wù)器遇到了一個(gè)未曾預(yù)料的狀況,導(dǎo)致了它無(wú)法完成對(duì)請(qǐng)求的處理。沒(méi)有給出具體錯(cuò)誤信息。
根據(jù)這個(gè)描述,基本可以排除客戶端以及網(wǎng)絡(luò)因素,需要重點(diǎn)關(guān)注服務(wù)端的狀態(tài)。
我們系統(tǒng)服務(wù)端的架構(gòu)如下圖:
接下來(lái)就要根據(jù)這個(gè)架構(gòu)由前往后一層一層排查。
(2)檢查HAProxy
重點(diǎn)排查HAProxy當(dāng)前是否可用,負(fù)荷是否超標(biāo),包括下面的一些指標(biāo)。
排查項(xiàng) | 結(jié)果 |
---|---|
CPU是否正常 | 正常 |
內(nèi)存是否正常 | 正常 |
線程數(shù)是否超過(guò)配置上限 | 正常 |
連接數(shù)是否超過(guò)配置上限 | 正常 |
排查之后發(fā)現(xiàn)一切正常,與版本更新前的數(shù)據(jù)作比較,也沒(méi)有出現(xiàn)大幅度波動(dòng)。
而在查看請(qǐng)求日志時(shí),發(fā)現(xiàn)大量500錯(cuò)誤信息,說(shuō)明HAProxy出異常的可能性較小,錯(cuò)誤更可能來(lái)自HAProxy之后的環(huán)節(jié)。
(3)檢查Jetty
重點(diǎn)排查jetty的配置信息。
排查項(xiàng) | 結(jié)果 |
---|---|
配置是否有變動(dòng) | 正常 |
應(yīng)用占用的線程數(shù)是否超過(guò)上限 | 正常 |
應(yīng)用占用的線程數(shù)是否超過(guò)上限 | 正常 |
雖然jetty配置信息檢查正常,但是在access.log中存在大量500錯(cuò)誤,定位到這里,有兩種可能的原因:
應(yīng)用代碼邏輯問(wèn)題。部分異常信息沒(méi)有被攔截住,直接拋給Jetty,導(dǎo)致500錯(cuò)誤。
Jetty邏輯問(wèn)題。請(qǐng)求沒(méi)有到達(dá)應(yīng)用,而是由于Jetty自身的某些邏輯導(dǎo)致請(qǐng)求被直接返回了。
(4)檢查應(yīng)用
為了驗(yàn)證是否第一個(gè)原因,我們繼續(xù)走查了應(yīng)用代碼,發(fā)現(xiàn)所有的異常都被正確處理了,不存在繼續(xù)往上拋的情況。另外,也檢查了圖片保存的代碼,確認(rèn)文件連接都正確釋放了。
因此,由于應(yīng)用邏輯問(wèn)題導(dǎo)致錯(cuò)誤的可能性很小,那么第二個(gè)原因的嫌疑最大,就是Jetty邏輯問(wèn)題。
如果直接排查Jetty的源碼,太費(fèi)時(shí)費(fèi)力,這個(gè)時(shí)候最好的辦法是實(shí)時(shí)抓包,看看Jetty和應(yīng)用服務(wù)之間到底發(fā)生了什么。
(5)使用tcpdump抓包
使用tcpdump命令抓取從jetty到應(yīng)用服務(wù)之間所有的數(shù)據(jù)包,將結(jié)果輸出到臨時(shí)文件中。
?
tcpdump -i eth0:0 -s0 host 1X.XXX.XXX.XX -w /tmp/out1.cap
使用wireshark打開(kāi)out1.cap文件,查找出現(xiàn)500錯(cuò)誤的數(shù)據(jù)包,然后很意外的看到了下面的邏輯。
通過(guò)這段代碼我們發(fā)現(xiàn),jetty對(duì)于請(qǐng)求數(shù)據(jù)的大小做了限制,超過(guò)200000 byte的時(shí)候就會(huì)報(bào)錯(cuò),返回錯(cuò)誤碼500。
App這次更新后,上傳了很多大于200000 byte的圖片,于是便出現(xiàn)了大量的500錯(cuò)誤。
找到問(wèn)題根源,修正起來(lái)就很簡(jiǎn)單了,在WEB-INF目錄下添加jetty-web.xml 文件解決,文件內(nèi)容如下:
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//MortBay Consulting//DTD Configure//EN"
"http://jetty.mortbay.org/configure.dtd">
<Configure id="WebAppContext"class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="maxFormContentSize"type="int"> 0 </Set>
</Configure>
6、JMeter問(wèn)題總結(jié)
出現(xiàn)Internal server error 500錯(cuò)誤,往往意味著服務(wù)端出現(xiàn)一些未知異常,但是在排查的時(shí)候我們不能僅僅只是關(guān)注應(yīng)用服務(wù),而是要關(guān)注從服務(wù)端接收請(qǐng)求開(kāi)始,一直到應(yīng)用服務(wù)的整條鏈路。
以本文中的情景為例,就是從HAProxy 到 Jetty 再到 應(yīng)用服務(wù),中間的任何一個(gè)環(huán)節(jié)都有可能導(dǎo)致500錯(cuò)誤。
另外,其實(shí)在一開(kāi)始我們就可以采用抓包的方式去排查,因?yàn)樵诎鼣?shù)據(jù)中包含了完整請(qǐng)求/響應(yīng)消息,比查看CPU、線程、配置信息要更加快捷,直接。
六、Linux查看程序運(yùn)行情況
1、Top
top命令是Linux下常用的性能分析工具,能夠?qū)崟r(shí)顯示系統(tǒng)中各個(gè)進(jìn)程的資源占用狀況,類(lèi)似于Windows的任務(wù)管理器。
top顯示系統(tǒng)當(dāng)前的進(jìn)程和其他狀況,是一個(gè)動(dòng)態(tài)顯示過(guò)程,即可以通過(guò)用戶按鍵來(lái)不斷刷新當(dāng)前狀態(tài).如果在前臺(tái)執(zhí)行該命令,它將獨(dú)占前臺(tái),直到用戶 終止該程序?yàn)橹? 比較準(zhǔn)確的說(shuō),top命令提供了實(shí)時(shí)的對(duì)系統(tǒng)處理器的狀態(tài)監(jiān)視.它將顯示系統(tǒng)中CPU最“敏感”的任務(wù)列表.該命令可以按CPU使用.內(nèi)存使用和執(zhí)行時(shí)間 對(duì)任務(wù)進(jìn)行排序;而且該命令的很多特性都可以通過(guò)交互式命令或者在個(gè)人定制文件中進(jìn)行設(shè)定。
在linux系統(tǒng)中,top命令可謂是分析系統(tǒng)性能最方便的工具,而且top還是個(gè)交互式工具;通過(guò)top命令可以清楚地了解到正在執(zhí)行的進(jìn)程信息包括進(jìn)程ID,內(nèi)存占用率,CPU占用率等。其實(shí)就跟window的任務(wù)管理器類(lèi)似。
2、查看CPU使用率
sar -u 1 5
表示每1秒采集一次,共采集5次。
這個(gè)命令可根據(jù)實(shí)際線程組中的設(shè)置,進(jìn)行CPU使用率方面的查看。
[root@sss ~]# sar -u 1 5
Linux 3.10.0-957.10.1.el7.x86_64 (izuf633l0ge76tv5mzalpmz) 04/16/2019 _x86_64_ (1 CPU)
04:56:03 PM CPU %user %nice %system %iowait %steal %idle
04:56:04 PM all 0.00 0.00 0.00 0.00 0.00 100.00
04:56:05 PM all 0.00 0.00 0.00 0.00 0.00 100.00
04:56:06 PM all 0.99 0.00 0.99 0.00 0.00 98.02
04:56:07 PM all 0.00 0.00 0.00 0.00 0.00 100.00
04:56:08 PM all 0.00 0.00 0.00 0.00 0.00 100.00
Average: all 0.20 0.00 0.20 0.00 0.00 99.60
3、查看內(nèi)存占用情況
free -m
1352/1838即為內(nèi)存占用。
4、Linux如何統(tǒng)計(jì)進(jìn)程的CPU利用率
Linux的/proc文件系統(tǒng),可以看到自啟動(dòng)時(shí)候開(kāi)始,所有CPU消耗的時(shí)間片;對(duì)于個(gè)進(jìn)程,也可以看到進(jìn)程消耗的時(shí)間片。這是一個(gè)累計(jì)值,可以"非阻塞"的輸出。獲得一定時(shí)間間隔的兩次統(tǒng)計(jì)就可以計(jì)算出這段時(shí)間內(nèi)的進(jìn)程CPU利用率。
所以,是否存在一種簡(jiǎn)單的,非阻塞的方式獲得進(jìn)程的CPU利用率? 答案是:“沒(méi)有”。這里給出一個(gè)很恰當(dāng)?shù)谋扔鳎?這就像有人給你一張照片,要你回答照片中車(chē)子的速度一樣"。
1、/proc/stat 統(tǒng)計(jì)總CPU消耗
計(jì)算CPU總消耗可以使用如下shell命令:
cat /proc/stat|grep "cpu "|awk '{for(i=2;i<=NF;i++)j+=$i;print "cpu_total_slice " j;}'
cpu_total_slice 19208187744
2、進(jìn)程消耗的CPU時(shí)間片
在proc文件系統(tǒng)中,可以通過(guò)/proc/[pid]/stat獲得進(jìn)程消耗的時(shí)間片,輸出的第14、15、16、17列分別對(duì)應(yīng)進(jìn)程用戶態(tài)CPU消耗、內(nèi)核態(tài)的消耗、用戶態(tài)等待子進(jìn)程的消耗、內(nèi)核態(tài)等待子進(jìn)程的消耗(man proc)。所以進(jìn)程的CPU消耗可以使用如下命令:
cat /proc/9583/stat|awk '{print "cpu_process_total_slice " $14+$15+$16+$17}'
cpu_process_total_slice 1068099
3、"非阻塞"的計(jì)算進(jìn)程CPU利用率
從這里也看到,是沒(méi)有某個(gè)時(shí)刻CPU利用率的說(shuō)法的,也就沒(méi)法獲得某個(gè)時(shí)刻的CPU利用率。這就像物理中的"速度"的概念,沒(méi)有某一時(shí)刻速度的概念,速度一定是一個(gè)時(shí)間段之內(nèi)的。那么要"非阻塞"計(jì)算某個(gè)進(jìn)程CPU利用率,則需要取兩次事件間隔進(jìn)行計(jì)算,這兩次事件間隔的操作可以是非阻塞的。計(jì)算辦法如下:
- 時(shí)刻A,計(jì)算操作系統(tǒng)總CPU時(shí)間片消耗total_cpu_slice_A;計(jì)算進(jìn)程總CPU時(shí)間片消耗;total_process_slice_A ;
- 時(shí)刻B,計(jì)算操作系統(tǒng)總CPU時(shí)間片消耗total_cpu_slice_B;計(jì)算進(jìn)程總CPU時(shí)間片消耗;total_process_slice_B。
B時(shí)刻就可以"非阻塞"的計(jì)算這段時(shí)間進(jìn)程的CPU利用率了:
100%*(total_process_slice_B-total_process_slice_A)/(total_cpu_slice_B-total_cpu_slice_A)
5、CPU使用率與CPU空閑時(shí)間的關(guān)系?
多任務(wù)操作對(duì)CPU都是分時(shí)間片使用的,比如A進(jìn)程占用10ms,B進(jìn)程占用30ms,然后空閑60ms,再又是A進(jìn)程占用10ms,B進(jìn)程占用30ms,空閑60ms;如果一段時(shí)間內(nèi)都是如此,那么這段時(shí)間內(nèi)的CPU占用率就是40%。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-473937.html
CPU對(duì)線程的響應(yīng)并不是連續(xù)的,通常會(huì)在一段時(shí)間后自動(dòng)中斷線程。未響應(yīng)的線程增加,就會(huì)不斷加大CPU的占用。
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-473937.html
到了這里,關(guān)于JMeter界面詳介及如何進(jìn)行壓測(cè)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!