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)服務器重啟大法