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