測試中碰到響應時間慢、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)業務邏輯
更多內容歡迎關注微信公衆號查看