Waiting for server respnse耗時(shí)過(guò)長(zhǎng)原因排查及解決
背景
開(kāi)發(fā)了一個(gè)導(dǎo)入接口,測(cè)試過(guò)程中發(fā)現(xiàn)導(dǎo)入壓縮包24M時(shí),耗時(shí)50多秒。覺(jué)得這個(gè)時(shí)間太長(zhǎng)了,可能存在問(wèn)題,于是開(kāi)始了漫長(zhǎng)的排查之旅。
查看接口時(shí)間
通過(guò)Chrome DevTools 查看接口請(qǐng)求信息,發(fā)現(xiàn)接口時(shí)間主要消耗在發(fā)送數(shù)據(jù)(Request sent)和等待服務(wù)器響應(yīng)(Waiting for server respnse)兩部分。
Request sent:平均在31s
Waiting for server respnse:平均18s

Request sent時(shí)間屬于正常偏慢,因?yàn)榘l(fā)送數(shù)據(jù)受網(wǎng)絡(luò)上行帶寬限制,暫時(shí)也沒(méi)辦法做太大的優(yōu)化。
Waiting for server respnse時(shí)間有很大的問(wèn)題,因?yàn)榻涌谥兄蛔隽撕?jiǎn)單的操作,復(fù)雜的數(shù)據(jù)處理都是異步執(zhí)行的,所以問(wèn)題應(yīng)該在服務(wù)端。
排查接口問(wèn)題
懷疑是接口請(qǐng)求問(wèn)題后,就使用arthas trace 查看接口詳細(xì)耗時(shí)。
docker exec -it xxx java -jar /arthas/arthas-boot.jar
[INFO] arthas-boot version: 3.5.1
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 10 org.springframework.boot.loader.JarLauncher
[INFO] arthas home: /opt/arthas
[INFO] Try to attach process 10
[INFO] Attach process 10 success.
[INFO] arthas-client connect 127.0.0.1 3658
,---. ,------. ,--------.,--. ,--. ,---. ,---.
/ O \ | .--. ''--. .--'| '--' | / O \ ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || |\ \ | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
wiki https://arthas.aliyun.com/doc
tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html
version 3.5.1
main_class
pid 10
time 2022-11-23 19:07:06
[arthas@10]$ trace xxx.XXXController test -n 5 --skipJDKMethod false
Press Q or Ctrl+C to abort.
Affect(class count: 2 , method count: 2) cost in 601 ms, listenerId: 1
`---ts=2022-11-24 13:44:28;thread_name=http-nio-9001-exec-17;id=bd;is_daemon=true;priority=5;TCCL=org.xxx.xxxClassLoader@300aa927
`---[211.492528ms] xxx.XXXController$$EnhancerBySpringCGLIB$$103cd3e4:test()
`---[166.654272ms] org.xxx.MethodInterceptor:intercept() #57
`---[102.043649ms] com.xxx.XXXController:test()
+---[101.125313ms] com.xxx.XXXService:importUser() #359
`---[0.754306ms] com.xxx.XXXBuilder:success() #57根據(jù)arthas trace日志顯示,接口耗時(shí)在200ms左右,這才是符合預(yù)期的時(shí)間。沒(méi)有找到具體問(wèn)題,只能代碼走查一遍。接口邏輯其實(shí)很清晰,先校驗(yàn)文件格式大小,然后創(chuàng)建異步任務(wù)(插入一條數(shù)據(jù)),最后執(zhí)行異步任務(wù)。因?yàn)橛挟惒饺蝿?wù),所以整個(gè)接口耗時(shí)應(yīng)該最多幾百毫秒,初步判斷arthas trace的結(jié)果正確合理。
排查網(wǎng)關(guān)問(wèn)題
既然接口實(shí)現(xiàn)沒(méi)有問(wèn)題,那就往上游排查,查看網(wǎng)關(guān)是否存在問(wèn)題。查看網(wǎng)關(guān)接口請(qǐng)求和返回時(shí)間和剛才arthas trace時(shí)間相差無(wú)幾,排除了網(wǎng)關(guān)的問(wèn)題。
排查SLB問(wèn)題
網(wǎng)關(guān)沒(méi)問(wèn)題只能在往上排查問(wèn)題,測(cè)試了另一個(gè)環(huán)境B發(fā)現(xiàn)是相對(duì)正常的,Waiting for server respnse 時(shí)間在600ms左右。

對(duì)比討論了下兩個(gè)環(huán)境的差異,發(fā)現(xiàn)有問(wèn)題的環(huán)境A相比正常的環(huán)境B多了一層SLB負(fù)載均衡,懷疑可能是這個(gè)問(wèn)題。網(wǎng)上查了相關(guān)資料,也沒(méi)有顯示SLB有出現(xiàn)過(guò)這種情況。
于是讓運(yùn)維先關(guān)閉SLB負(fù)載均衡驗(yàn)證一下情況,修改SLB配置后需要一小會(huì)才能生效,結(jié)果顯示關(guān)掉SLB接口請(qǐng)求時(shí)間還是有問(wèn)題, 因此也不是SLB的問(wèn)題,于是只是剩下Nginx了。
排查Nginx問(wèn)題
排查了一下午沒(méi)有結(jié)果,然后就先去吃飯休息,踢踢桌面足球放松一下。
放松回來(lái)后,開(kāi)始排查了Nginx配置,嘗試重啟ng,修改buffer大小都無(wú)濟(jì)于事。掃到ng配置的時(shí)候發(fā)現(xiàn)ng做了一次負(fù)載均衡,而且服務(wù)器地址配置的是公網(wǎng)ip,猜測(cè)可能是這個(gè)問(wèn)題,死馬當(dāng)成活馬醫(yī),隨便試試看。修改為內(nèi)網(wǎng)地址,然后重啟ng后驗(yàn)證發(fā)現(xiàn)正常了。就這樣正常了?;舜蟀胩鞎r(shí)間,總算解決了。后來(lái)復(fù)盤討論猜測(cè),應(yīng)該是ng接收到文件后,通過(guò)負(fù)載均衡走公網(wǎng)ip轉(zhuǎn)了一圈回來(lái)導(dǎo)致Waiting for server respnse 耗時(shí)過(guò)長(zhǎng)。
一不小心就有坑。
總結(jié)
到此這篇關(guān)于Waiting for server respnse耗時(shí)過(guò)長(zhǎng)原因排查及解決的文章就介紹到這了,更多相關(guān)Waiting for server respnse耗時(shí)過(guò)長(zhǎng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx設(shè)置HTTPS監(jiān)聽(tīng)的具體步驟
這篇文章主要介紹了Nginx設(shè)置HTTPS監(jiān)聽(tīng)的具體步驟,在 Nginx 上設(shè)置 HTTPS 證書,并將所有 HTTP 請(qǐng)求重定向到 HTTPS,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-12-12
淺析nginx 客戶端返回499的錯(cuò)誤碼的問(wèn)題
我們服務(wù)器客戶端一直有返回錯(cuò)誤碼499的日志,以前覺(jué)得比例不高,就沒(méi)有仔細(xì)查過(guò),最近有領(lǐng)導(dǎo)問(wèn)這個(gè)問(wèn)題,為什么耗時(shí)只有0.0幾秒,為啥還499了?最近幾天就把這個(gè)問(wèn)題跟蹤定位了一下,這里做個(gè)記錄,對(duì)nginx返回499錯(cuò)誤碼相關(guān)知識(shí)感興趣的朋友一起看看吧2022-10-10
Nginx?配置?WebSocket?代理的操作過(guò)程
這篇文章主要介紹了Nginx?配置?WebSocket?代理的操作過(guò)程,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-04-04
nginx+ingress 413問(wèn)題排查過(guò)程
處理413錯(cuò)誤需調(diào)整Nginx的client_max_body_size及Ingress配置,合理設(shè)置body-size,若無(wú)效,檢查后端限制,注意過(guò)大可能影響安全2025-08-08
Nginx實(shí)現(xiàn)接口復(fù)制的項(xiàng)目實(shí)踐
本文主要介紹了Nginx實(shí)現(xiàn)接口復(fù)制的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-04-04
nginx代理部署Vue刷新頁(yè)面404的問(wèn)題解決
在上線vue開(kāi)發(fā)的前端網(wǎng)頁(yè)部署在服務(wù)器上后,刷新頁(yè)面顯示404,本文就來(lái)介紹一下nginx代理部署Vue刷新頁(yè)面404的問(wèn)題解決,感興趣的可以了解一下2023-12-12
阿里云國(guó)際版使用Nginx作為HTTPS轉(zhuǎn)發(fā)代理服務(wù)器的處理方法
本文介紹了使用NGINX作為HTTPS流量轉(zhuǎn)發(fā)代理的兩種方法。它總結(jié)了NGINX使用HTTP?CONNECT隧道和NGINX流充當(dāng)HTTPS轉(zhuǎn)發(fā)代理的解決方案的原則,環(huán)境構(gòu)建要求,應(yīng)用場(chǎng)景和關(guān)鍵問(wèn)題2022-05-05
使用referer指令配置Nginx服務(wù)器來(lái)防止圖片盜鏈
這篇文章主要介紹了使用referer指令配置Nginx服務(wù)器來(lái)防止圖片盜鏈的方法,文中也簡(jiǎn)單介紹了referer指令的一些語(yǔ)法和常用參數(shù),需要的朋友可以參考下2015-12-12

