北京網(wǎng)站優(yōu)化公司如何輿情分析報(bào)告模板
一、request 請(qǐng)求超時(shí)設(shè)置
timeout 超時(shí)時(shí)間是可以手動(dòng)設(shè)置的,新建一個(gè) http 請(qǐng)求,在“高級(jí)”設(shè)置中找到“超時(shí)”設(shè)置,設(shè)置連接、響應(yīng)時(shí)間為2000ms。
1. 請(qǐng)求連接超時(shí),連不上服務(wù)器。
現(xiàn)象:
Jmeter表現(xiàn)形式為:前面幾個(gè)請(qǐng)求是成功的,但是后面請(qǐng)求有的會(huì)報(bào)錯(cuò),有的請(qǐng)求成功
報(bào)錯(cuò)1:
Response code: Non HTTP response code: java.net.SocketTimeoutException
Response message: Non HTTP response message: connect timed out
原因:
一般是因?yàn)榫€(xiàn)程太多,connection time out error 服務(wù)器請(qǐng)求太多了,處理不過(guò)來(lái)。
查看 Load time 的時(shí)間要大于 request 設(shè)置的 connect time out 時(shí)間,因此拋出該異常。多是因?yàn)榉?wù)端有較多請(qǐng)求正在處理且處理時(shí)間較長(zhǎng),致使 jmeter 不能連接上服務(wù)器而產(chǎn)生的。
解決方法:設(shè)置 jmeter http 請(qǐng)求超時(shí)conn,重啟server
報(bào)錯(cuò)2:
Connection timed out: connect工具
java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.connect0(
原因:
多是由于端口號(hào)耗盡,通常一臺(tái)服務(wù)器的端口號(hào)最可能是65535個(gè),建議使用該命令分別查看下壓測(cè)機(jī)與服務(wù)器的端口使用狀況,netstat -nat|grep -i 8080|wc -l,若是這個(gè)個(gè)數(shù)在6w左右,那可能就是端口號(hào)用盡,同時(shí)查看下大多數(shù)的端口狀態(tài),應(yīng)該都是 time_wait 狀態(tài)。
解決方法:若是壓測(cè)機(jī),端口號(hào)用盡,那就增長(zhǎng)壓測(cè)機(jī),使用 jmeter 分布式壓測(cè)(jmeter默認(rèn)開(kāi)啟keep_alive的)
若是數(shù)服務(wù)器,端口號(hào)用盡,最大的多是服務(wù)器端開(kāi)了短連接,把短連接配置變成長(zhǎng)鏈接便可
如果服務(wù)器端是短連接,當(dāng) jmeter 每發(fā)起一個(gè)請(qǐng)求就會(huì)創(chuàng)建一次 tcp 三次握手,傳輸完數(shù)據(jù)后,鏈接其實(shí)沒(méi)有關(guān),鏈接狀態(tài)是 time_wait,下個(gè)請(qǐng)求來(lái)了會(huì)重新開(kāi)啟一個(gè)新的端口,創(chuàng)建tcp三次握手,傳輸數(shù)據(jù)....
這樣隨著請(qǐng)求的愈來(lái)愈多,端口就會(huì)變得愈來(lái)愈少,因此端口很快耗盡,并且大多數(shù)端口都處于 time_wait 狀態(tài),若是服務(wù)器端也支持長(zhǎng)鏈接,那么下次請(qǐng)求來(lái)了,就會(huì)在上次請(qǐng)求的通道上繼續(xù)傳輸,端口使用率大大的下降,就有效的避免了端口耗盡問(wèn)題。常規(guī)操作,每個(gè)請(qǐng)求可以給個(gè)超時(shí)時(shí)間,避免 http 超時(shí)錯(cuò)誤。
2. 連接成功,但是讀取超時(shí)。
等不到服務(wù)器返回的數(shù)據(jù),一般是這次請(qǐng)求查詢(xún)的量很大,比如查了5度的頂點(diǎn)。(timeout 小于 server 的最大等待時(shí)間)read time out error
jmeter等不到服務(wù)器返回的數(shù)據(jù)就斷開(kāi)了請(qǐng)求。
Response code: Non HTTP response code: java.net.SocketTimeoutException
Response message: Non HTTP response message: Read timed out
發(fā)生該錯(cuò)誤時(shí),jmeter 已經(jīng)鏈接上服務(wù)器,查看 load time 沒(méi)有超過(guò)設(shè)定的 request timeout 時(shí)間,錯(cuò)誤可能的原因是,服務(wù)器那邊未處理該線(xiàn)程的請(qǐng)求,或者為保證服務(wù)能力,斷掉了鏈接。
為了驗(yàn)證該猜測(cè),持續(xù)大于半小時(shí)向服務(wù)器發(fā)送該并發(fā)數(shù)量的請(qǐng)求,一段時(shí)間后,request 收到 503 的 response,證實(shí)猜測(cè)。
3. 連接成功,server查詢(xún)數(shù)據(jù)時(shí)超時(shí)
是因?yàn)?中請(qǐng)求的導(dǎo)致的 server 超時(shí)機(jī)制,如果查詢(xún)時(shí)間超過(guò) 30s 自動(dòng)報(bào)錯(cuò)。(timeout大于server的等待時(shí)間),在2的基礎(chǔ)上,已經(jīng)設(shè)置很大的響應(yīng)時(shí)間了,但是還是 timeout,這個(gè)應(yīng)該就是 server 等不到數(shù)據(jù)庫(kù)返回的數(shù)據(jù)超時(shí)了。
二、壓力機(jī)自身存在的問(wèn)題
1.在網(wǎng)絡(luò)編程中,特別是在短時(shí)間內(nèi)新建的網(wǎng)絡(luò)連接太多,經(jīng)常出現(xiàn)
java.net.BindException: Address already in use: JVM_Bind的異常
Java.NET.BindException: Address already in use: connect
原因:
短期內(nèi)新建 socket 操作太多,而 socket.close() 操作并不能當(dāng)即釋放綁定的端口,而是把端口設(shè)置為 time_wait 狀態(tài),過(guò)段時(shí)間(默認(rèn)240s)才釋放,用netstat -na能夠看到,最后系統(tǒng)資源耗盡(windows上是耗盡了pool of ephemeral ports ,這段區(qū)間在1024-5000之間)
解決方法:
在運(yùn)行 jmeter agent 的機(jī)器上,添加注冊(cè)表?xiàng)l目
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
MaxUserPort 65334
TcpTimedWaitDelay 30
jmeter工具運(yùn)行設(shè)置:
1. cmd中,用 regedit 命令打開(kāi)注冊(cè)表
2. 在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
3. 右鍵Parameters
4. 新建DWORD值,(十進(jìn)制)設(shè)置為30秒。名稱(chēng):TcpTimedWaitDelay,值:30。新建DWORD值,(十進(jìn)制)最大連接數(shù)65534。名稱(chēng):MaxUserPort,值:65534
5. 基數(shù)選擇十進(jìn)制;以增大可分配的 tcp 連接端口數(shù)、減小處于 TIME_WAIT 狀態(tài)的連接的生存時(shí)間
6. 修改配置完畢之后記得重啟機(jī)器才會(huì)生效
jmeter 發(fā)送請(qǐng)求后返回java.net.SocketException: Connection reset
這表明是測(cè)試服務(wù)器有問(wèn)題,可以去頁(yè)面驗(yàn)證下。有可能是要配置客戶(hù)端的設(shè)置,如上面的工具運(yùn)行設(shè)置。
java.net.SocketException: Socket closed
step1:
在 http 請(qǐng)求里面找到高級(jí) implementation 選擇 httpclient 4,connect設(shè)置為15000-300000毫秒。
step2:
在 jmeter 安裝目錄的 bin 目錄下,找到 jmeter.properties 并打開(kāi)。打開(kāi)425行的注釋,值設(shè)置為1:
httpclient4.retrycount = 1
httpclient4.idletimeout=<time in 1000 ms>
java.lang.OutOfMemoryError: Java heap space
原因:
觀察運(yùn)行 jmeter 機(jī)器的內(nèi)存,占用較高,超過(guò)了 jmeter 設(shè)置的內(nèi)存上限。
解決方案:
修改 jmeter 配置文件,調(diào)整內(nèi)存可用的范圍服務(wù)器
修改/bin/jmeter.bat文件:找到這2行
set HEAP=-Xms256m -Xmx256m
set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m
改成:
set HEAP=-Xms1024m –Xmx2048m(最大值不能超過(guò)系統(tǒng)內(nèi)存的1/2)
set NEW=-XX:NewSize=128m -XX:MaxNewSize=512m網(wǎng)絡(luò)
{ "_t" : "StringResultObject", "status" : 1030, "message" : "服務(wù)器發(fā)生錯(cuò)誤", "data" : null, "isSuccess" : false }
如遇到上面請(qǐng)求返回的reponse, 就要首先去服務(wù)器端的日志,通過(guò)日志來(lái)定位問(wèn)題
Failed to initialise remote engine java.rmi.ConnectException: Connection refused to host:
原因:
分布式測(cè)試時(shí),server 和 agent 之間的鏈接有問(wèn)題。單個(gè)機(jī)器排查后,發(fā)現(xiàn)是某個(gè) agent 機(jī)器安裝了多個(gè)網(wǎng)卡,rmi 遠(yuǎn)程的時(shí)候找的是虛擬機(jī)的網(wǎng)卡,致使鏈接失敗。
解決方案:
禁掉不使用的虛擬機(jī)網(wǎng)卡,測(cè)試以后再恢復(fù)
java.lang.OutOfMemoryError: Java heap space
原因:
jmeter 是一個(gè)純 java 開(kāi)發(fā)的工具,內(nèi)存由 java 虛擬機(jī) JVM 管理,當(dāng)內(nèi)存回收不及時(shí),堆內(nèi)存不足時(shí),就會(huì)報(bào)內(nèi)存溢出錯(cuò)誤。
概念補(bǔ)充:
內(nèi)存泄露:應(yīng)用使用資源之后沒(méi)有及時(shí)釋放,導(dǎo)致應(yīng)用內(nèi)存中持有了不需要的資源。
內(nèi)存溢出:應(yīng)用的內(nèi)存已經(jīng)不能滿(mǎn)足正常使用了,堆棧已經(jīng)達(dá)到系統(tǒng)設(shè)置的最大值,進(jìn)而導(dǎo)致崩潰。
通常都是由于內(nèi)存泄露導(dǎo)致堆棧內(nèi)存不斷增大,從而引發(fā)內(nèi)存溢出。對(duì) jmeter 而言也是如此,jmeter 測(cè)試過(guò)程中,如果內(nèi)存溢出的話(huà),一般會(huì)出現(xiàn)上面的提示:java.lang.OutOfMemoryError: Java heap space意思就是堆內(nèi)存溢出,不夠用了
解決方法:
知道了報(bào)錯(cuò)出現(xiàn)的原因是因?yàn)槎褍?nèi)存大小不足引起的,自然而然就會(huì)想到內(nèi)存溢出的解決方法:調(diào)整堆內(nèi)存大小。
步驟(以Windows系統(tǒng)為例,Linux系統(tǒng)類(lèi)似):
1. 打開(kāi)jmeter.bat文件,按關(guān)鍵字“HEAP”搜索,把原來(lái)的配置改為如下:修改前:
if not defined HEAP (
rem See the unix startup file for the rationale of the following parameters,
rem including some tuning recommendations
set HEAP=-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m
)
)
修改后:
if not defined HEAP (
rem See the unix startup file for the rationale of the following parameters,
rem including some tuning recommendations
set HEAP=-Xms512m -Xmx4000m
set NEW=-XX:NewSize=256m -XX:MaxNewSize=512m
)
set HEAP=-Xms512m -Xmx4000m:調(diào)整堆內(nèi)存的大小
set NEW=-XX:NewSize=256m -XX:MaxNewSize=512m:調(diào)整堆內(nèi)存中新生帶的大小
PS:
這個(gè)值不是越大越好,要根據(jù)壓測(cè)使用的機(jī)器而定,一般而言,堆內(nèi)存的最大值不要超過(guò)物理內(nèi)存的一半,否則容易導(dǎo)致 jmeter 運(yùn)行變慢、卡頓甚至內(nèi)存溢出(因?yàn)閖ava本身的垃圾回收機(jī)制是動(dòng)態(tài)分配內(nèi)存,調(diào)整的時(shí)候其本身會(huì)占用很多內(nèi)存),NEW分配的內(nèi)存,不宜太大。
1. 修改完成后保存,重啟JMeter,即可生效。
三、小結(jié)
1. 這種修改堆大小的方法只適用一部分情況,并不是萬(wàn)能的,當(dāng)需要模擬的線(xiàn)程數(shù)較大時(shí),就需要根據(jù)具體情況采用分布式壓測(cè)的方式了。
2. 命令行運(yùn)行 jmeter 時(shí),一定要禁用“查看結(jié)果樹(shù)”、“聚合報(bào)告”等監(jiān)聽(tīng)器,因?yàn)檎娴恼娴恼娴暮芟膬?nèi)存。
3. 磁盤(pán)監(jiān)控工具有iostat & htop。
4. 網(wǎng)絡(luò)監(jiān)控工具有iftop。
5. 查看網(wǎng)絡(luò)連接情況可以使用netstat -n | find /I "established" /c。
最后感謝每一個(gè)認(rèn)真閱讀我文章的人,禮尚往來(lái)總是要有的,雖然不是什么很值錢(qián)的東西,如果你用得到的話(huà)可以直接拿走: