WEB應用訪問緩慢的問題定位
歡迎關注博主公眾號「java大師」, 專注於分享Java領域乾貨文章, 關注回覆「資源」, 免費領取全網最熱的Java架構師學習PDF, 轉載請註明出處 http://www.javaman.cn/jszw/web-slow
1、如果頁面能正常訪問,但是每個頁面的開啟速度都很慢,處理方式如下:
1)首先檢視應用伺服器和資料庫伺服器的cpu和記憶體使用情況是不是很高
windows伺服器通過工作管理員檢視
linux伺服器通過top命令檢視記憶體和cpu使用率:主要看1、2、3這三個指標有沒有異常,記憶體和cpu有沒有超過95%
詳細引數參見下了文件
Linux檢視CPU和記憶體使用情況:https://www.cnblogs.com/mengchunchen/p/9669704.html
2)如果兩個伺服器的記憶體都不高,通過下面語句找到oracle等待時長最多的sql帶入plsql進行驗證
SELECT ASH.USER_ID,
U.USERNAME,
S.SQL_TEXT,
SUM(ASH.WAIT_TIME + ASH.TIME_WAITED) TTL_WAIT_TIME
FROM V$ACTIVE_SESSION_HISTORY ASH, V$SQLAREA S, DBA_USERS U
WHERE ASH.SAMPLE_TIME BETWEEN SYSDATE - 15 / (24 * 60) AND SYSDATE
AND ASH.SQL_ID = S.SQL_ID
AND ASH.USER_ID = U.USER_ID
GROUP BY ASH.USER_ID, S.SQL_TEXT, U.USERNAME
ORDER BY TTL_WAIT_TIME
將sql放入plsql視窗,按【F5】進入執行計劃頁面
cost為耗費時長,執行順序是按照縮排從右往左,從上到下執行,上圖執行順序為table access full--> table access full-->hash join-->all rows。如果一個列表查詢的sql執行的cost耗費越大,結合oracle等待時長的sql,可以斷定該sql存在問題!!!
將定位的sql提交給研發進行進一步的分析!!
目前發現資料庫表中的部分索引建立以後失效的情況,經分析定位為:
隨著表的增長,where條件出來的資料太多,大於15%,使得索引失效
,目前無法提前發現,只能通過上面的語句定位到執行緩慢的語句。
附錄----執行計劃詳解:https://www.cnblogs.com/Dreamer-1/p/6076440.html
3)如果沒有找到等待過長的sql語句,需要進一步排查應用伺服器到oracle資料庫主機的連線是否順暢,有沒有存在延遲!!
3.1)oracle的alert的日誌檔案超過4G,會導致連線報錯
可以通過下列語句找到alert.log的目錄
select value from v$diag_info where name ='Diag Trace';
找到該日誌,然後備份刪除
3.2)如果日誌檔案沒有超過4G或者3.1步驟處理完仍然沒有解決資料庫連線超時或者慢的問題
需要執行:tnsping IP:埠/例項名稱
C:\Users\fangr>tnsping localhost:1521/orcl
TNS Ping Utility for 64-bit Windows: Version 11.2.0.1.0 - Production on 03-7月 -2021 17:08:45
Copyright (c) 1997, 2010, Oracle. All rights reserved.
已使用的引數檔案:
D:\app1\fangr\product\11.2.0\dbhome_1\network\admin\sqlnet.ora
已使用 EZCONNECT 介面卡來解析別名
嘗試連線 (DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=orcl))(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))
OK (0 毫秒)
執行結果如下圖:如果超過1000毫秒
,則連線可能存在問題!!需要協調ping一下是否丟包,或者協調客戶定位下網路問題
擴充套件:AWR分析報告進行資料庫的分析
覺得資料庫慢的時候也可以通過AWR分析報告,對oracle進行效能分析找到一些oracle可能存在的潛在問題
對資料庫緩慢時間段範圍內生成awr報告!!
AWR報告生成方法:https://www.cnblogs.com/liyasong/p/oracle_report1.html
該報告重點關注如下內容:
1)正常情況下DBCPU應該排在首位,%DB time每個耗時不能超過70%,如果超過就要針對處理!
2)根據SQL ordered by Elapsed Time,找到耗時比較長的sql,針對sql進行分析
3)檢視SGA和PGA的記憶體使用是否過高,正常情況下不得超過主機記憶體的80%
2、如果頁面能正常訪問,新增記錄或者更新網頁卡住不動:
網頁訪問和列表載入正常,此刻很有可能存在oracle鎖表的情況
,通過下面的sql執行,找到被鎖的表
select sess.sid,
sess.serial#,
lo.oracle_username,
lo.os_user_name,
ao.object_name,
lo.locked_mode
from v$locked_object lo, dba_objects ao, v$session sess
where ao.object_id = lo.object_id
and lo.session_id = sess.sid;
找到被鎖的表
通過下面sql定位到鎖表的sql語句
SELECT A.USERNAME,
A.MACHINE,
A.PROGRAM,
A.SID,
A.SERIAL#,
A.STATUS,
C.PIECE,
C.SQL_TEXT
FROM V$SESSION A, V$SQLTEXT C
WHERE A.SID IN (SELECT DISTINCT T2.SID
FROM V$LOCKED_OBJECT T1, V$SESSION T2
WHERE T1.SESSION_ID = T2.SID)
AND A.SQL_ADDRESS = C.ADDRESS(+)
ORDER BY C.PIECE;
將找到的sql提交給研發,判斷該sql語句是人為鎖定的還是程式未提交導致的!
如果需要,可以通過下面的sql進行解鎖
alter system kill session '68,51'; --分別為SID和SERIAL#號
3、如果排除oracle和sql的問題,那麼進一步排查應用伺服器的問題
1)調整程式連線的最大執行緒數和排隊請求數
tomcat:將maxThreads="800" acceptCount="1000"調整為800和500代表允許最大執行緒數為800,可以同時處理800個請求,如果超 過800個執行緒,接受排隊500個請求!
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="800" acceptCount="500"/>
weblogic:
進入WebLogic控制檯——左邊視窗的mydomain——servers——點選myserver——Configuration——General——點選Advanced Options的Show連結——最下面的Configure Execute Queues 連結——weblogic.kernel.Default連結——Thread Count引數。的卻是隱藏的比較深。修改Thread Count的值,然後重啟WebLogic就可以生效了。
2)根據伺服器的記憶體大小,調整tomcat的記憶體,最大不超過應用伺服器記憶體的60%
tomcat:
在“echo"UsingCATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m"
weblogic:
直接修改user_projects\domains\base_domain\bin下的startWebLogic.cmd檔案
在它下面新增一下程式碼
set JAVA_OPTIONS=-Xms256m –Xmx256m;
3)根據tomcat的catalina.log的具體報錯反饋給開發進行查詢,需要根據的實際報錯
4)伺服器重啟大法