WEB應用訪問緩慢的問題定位

發表於2021-07-08

WEB應用訪問緩慢的問題定位

歡迎關注博主公眾號「java大師」, 專注於分享Java領域乾貨文章, 關注回覆「資源」, 免費領取全網最熱的Java架構師學習PDF, 轉載請註明出處 http://www.javaman.cn/jszw/web-slow

1、如果頁面能正常訪問,但是每個頁面的開啟速度都很慢,處理方式如下:

1)首先檢視應用伺服器和資料庫伺服器的cpu和記憶體使用情況是不是很高

windows伺服器通過工作管理員檢視

windows截圖-1.png

linux伺服器通過top命令檢視記憶體和cpu使用率:主要看1、2、3這三個指標有沒有異常,記憶體和cpu有沒有超過95%

linux截圖-2.png

詳細引數參見下了文件

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

plsql驗證

將sql放入plsql視窗,按【F5】進入執行計劃頁面

oracle執行計劃分析-4.png

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';

oracle日誌檔案-5.png

​ 找到該日誌,然後備份刪除

oracle日誌檔案路徑-6.png

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一下是否丟包,或者協調客戶定位下網路問題

oracle-tnsping-6.png

擴充套件:AWR分析報告進行資料庫的分析

覺得資料庫慢的時候也可以通過AWR分析報告,對oracle進行效能分析找到一些oracle可能存在的潛在問題

對資料庫緩慢時間段範圍內生成awr報告!!

AWR報告生成方法:https://www.cnblogs.com/liyasong/p/oracle_report1.html

AWR報告詳細解讀:https://blog.csdn.net/u011334954/article/details/103953103?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-0&spm=1001.2101.3001.4242

該報告重點關注如下內容:

1)正常情況下DBCPU應該排在首位,%DB time每個耗時不能超過70%,如果超過就要針對處理!

awr報告分析7-1.png

2)根據SQL ordered by Elapsed Time,找到耗時比較長的sql,針對sql進行分析

awr報告分析7-2.png

3)檢視SGA和PGA的記憶體使用是否過高,正常情況下不得超過主機記憶體的80%

awr-分析報告3

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;

找到被鎖的表

oracle鎖表7-4.png

通過下面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語句是人為鎖定的還是程式未提交導致的!

image-20210703163738092

如果需要,可以通過下面的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)伺服器重啟大法

相關文章