訪問頁面轉圈圈,怎麼分析

測試中碰到響應時間慢、TPS上不去、訪問頁面轉圈圈,該怎麼分析?把從發請求到返回請求整個架構圖畫出來,分析整個鏈路中哪些地方可能導致這些問題。

通常碰到這些問題,都是由以下11種情況導致,下面我們挨個分析,查找問題。

1)客戶端

原因:客戶端請求發佈出去,有可能導致頁面轉圈圈

排查:請求一下其他地址,若訪問其他地址沒問題,請求能發出去,則可排除客戶端問題。

 

2)網絡

原因:服務器網絡很慢或者TCP/IP連接滿了有可能導致訪問結果很慢,頁面在轉圈圈

排查:

①netstat i查看服務器網絡丟包情況

②ping服務器,查看是否有丟包

 

3)CPU load

原因:cpu高、負載高,資源競爭,搶時間片,線程等待cpu去調度

排查:top看cpu,負載有沒問題

 

4)內存泄漏、gc

原因:

排查:oom時發請求無法在eden去new對象,請求無法處理,gc時對象new完,請求暫停處理,頁面轉圈圈

ps -ef |grep java

Jstat -gcutil pid,查看老年代是否滿,看是否在不停full gc,如下圖老年代沒滿,說明沒有oom;FGC數量也沒有增加,說明不是gc導致頁面轉圈圈

 

5)wait for io等待磁盤io

原因:等待磁盤io,cpu空閒不幹活,導致頁面轉圈圈

排查:iostat -x,查看是否有io隊列

* rrqm/s:每秒進行 merge 的讀操作次數,即 delta(rmerge)/s 。 Ø

* wrqm/s:每秒進行 merge 的寫操作次數,即 delta(wmerge)/s 。 Ø

* r/s:每秒完成的讀 I/O 設備次數,即 delta(rio)/s 。 Ø

* w/s: 每秒完成的寫 I/O 設備次數,即 delta(wio)/s 。 Ø

* rsec/s:每秒讀扇區數,即 delta(rsect)/s。 Ø

* wsec/s:每秒寫扇區數,即 delta(wsect)/s  Ø

* rkB/s:每秒讀K字節數,是 rsect/s 的一半,因爲每扇區大小爲512字節。 Ø

* wkB/s:每秒寫K字節數,是 wsect/s 的一半 Ø

* avgrq-sz:平均每次設備I/O操作的數據大小 (扇區),即delta(rsect+wsect)/delta(rio+wio)

* avgqu-sz:平均I/O隊列長度,即 delta(aveq)/s/1000 (因爲aveq的單位爲毫秒)。                  

* Await:請求隊列中等待時間+svctm(服務時間) 單位是毫秒,按照每次IO平均。 ,即  delta(ruse+wuse)/delta(rio+wio) 。 一般地系統IO響應時間應該低於5ms,如果大於10ms就比較大了。 這個時間包括了隊列時間和服務時間,也就是說,一 般情況下,await大於svctm,它們的差值越小,則說明隊列時間越短,反之差值越大,隊列時間越長,說明系統出了問題。 Ø

* Svctm:平均每次設備I/O操作的服務時間 (毫秒),即 delta(use)/delta(rio+wio) 。

* %util:一秒中有百分之多少的時間用於 I/O 操作,或者說一秒中有多少時間 I/O 隊列是非空的,  即 delta(use)/s/1000 (因爲use的單位爲毫秒) 。

 

6)web容器排隊、連接池

tomcat監聽怎麼配置

 

7)數據庫連接池排隊 連接池不釋放

排查:查看數據庫連接池是否滿了

①查看項目配置文件中配置的最大連接數,一般配置文件在../webapps/dangdang_dk/WEB-INFO/class下,maxActive=20,代表最大連接數爲20

②執行語句show PROCESSLIST,查看數據庫連接數,若當前連接數=20則數據庫連接池滿

附加:

①數據庫連接池有2個,一個是mysql數據庫對外提供的連接數(所有的數據庫加起來對外提供的連接數),在my.cnf中配置,一個是當前項目的數據庫連接數

②如果是root帳號,你能看到所有用戶的當前連接。如果是其它普通帳號,只能看到自己佔用的連接。 show processlist;只列出前100條,如果想全列出請使用show full processlist; 

 

8)慢查詢

排查:前提,已開啓數據庫慢查詢,show variables like 'slow_query%';查看祝健康慢查詢日誌中是否有慢查詢語句

附加:開啓慢查詢的兩種方法

①將slow_query_log 全局變量設置爲“ON”狀態

  set global slow_query_log='ON';

  設置慢查詢日誌存放的位置

  set global slow_query_log_file='/opt/slow.log';

  查詢超過1秒就記錄

  set global long_query_time=1;

②修改配置文件my.cnf,在[mysqld]下的下方加入

  slow_query_log = ON

slow_query_log_file = /usr/local/mysql/data/slow.log

long_query_time = 1

 

9)數據庫死鎖

原因:語句執行不了    

排查:

①show engine innodb status查看status

②SELECT * FROM information_schema.INNODB_TRX; (定位哪個線程導致死鎖)

 

10)線程死鎖

①ps -ef |grep java,查找pid

②jstack pid > aaa,將線程棧文件重定向到aaa中

③過濾http線程,查看裏面的blocked(monitor)狀態線程,或者大量的waitting線程,如下圖則是DbUtil.java文件中getConnection出現問題,導致線程死鎖

 

11)業務邏輯

更多內容歡迎關注微信公衆號查看

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章