今天定位乙個電商**登入慢的問題。據qa反映測試環境,最近出現登入緩慢。qa反映說b2b使用者登入站點很慢,b2c使用者登入就很快。
定位第一步:用jstack 抓執行緒
用b2b使用者登入站點,同事伺服器上用jstack連續抓取3次thread dump,分析三個thread dump檔案,發現是在等待資料庫返回資料。
第一線程堆疊出現如下資訊:
我們搜尋nid 「0x7b86」 從第二個堆疊檔案,結果如下:
到這裡可以斷定這個問題與資料庫有關了,我們再搜尋下第三個執行緒堆疊,確認下,結果如下圖:
從上面三個堆疊,可以看出登入慢的問題出在資料,為了證明資料庫的清白我們可以獲取oracle資料庫的awr日誌看下問題,詳細問題可以網上看下怎麼獲取awr日誌。
我這裡獲取的awr日誌,是從登入開始到結束這段時間的。也就是在登入前打個點,登入成功後打個點,獲取這兩個點之間的統計情況並生產awr日誌。
從awr部分如下圖所示:
從上圖可以使到問題,為什麼我就簡單的乙個登入功能怎麼有些sql執行了幾千次,最大是11814次。這個問題好奇怪。檢視具體執行的sql,發現都是從organization這個表中獲取資料,為什麼乙個登入會查詢這個表上千次了。於是向dba求助,dba開啟了oracle資料庫的fga,具體命令如下:
開:call dbms_fga.add_policy(object_schema=>'your schema name', object_name=>'table name', policy_name=>'fei_organization', statement_types=>'select, update, insert, delete');
關:call dbms_fga.drop_policy( object_schema=>'your schema name', object_name=>'table name', policy_name=>'fei_organization');
查審計結果:
select
os_user,
userhost,
timestamp,
object_name,
sql_text,
sql_bind,
statement_type
from dba_fga_audit_trail;
查詢出的審計結果如下:
紅色區域迴圈執行,導致資料查詢organization很多次。結合業務路徑,發現b2b user 表上有兩個欄位organizations 和parentorganization,登入的時候首先去查詢所屬的父organization,父找到後,再去查詢organizations中的,由於organizations中的子又指向了父organization。由此導致迴圈查詢organization這個表。
由此得出查詢有雙向關聯的兩個表的時候,只能是單向,否則會出現迴圈。
Web系統單點登入實現
隨著使用者不斷擴大的需求,更多的系統被建造起來。為了獲得更好的使用者體驗,需要實現使用者單點登入。所謂單點登入,就是使用者在乙個系統上登入後,其他系統就不需要重複登入。單點的登入的好處很明顯,提高了使用者體驗度。如何實現單點登入,在這裡我提供兩種解決方案 1.一級網域名稱相同,通過共享cookie來...
mysql定位慢查詢
mysql資料庫啟動了多少時間 show status like uptime show stauts like com select show stauts like com insert 類推 update delete 顯示資料庫的查詢,更新,新增,刪除的次數 show session glo...
解決Linux SSH登入慢
出現ssh登入慢一般有兩個原因 dns反向解析的問題和ssh的gssapi認證 1 ssh的gssapi認證問題 5的通用網路安全系統介面。該介面是對各種不同的客戶端伺服器安全機制的封裝,以消除安全介面的不同,降低程式設計難度。但該介面在目標機器無網域名稱解析時會有問題 預設情況下,gssapiau...