閱讀554 返回首頁    go 阿裏雲 go 技術社區[雲棲]


DB2的進程/線程解析

今天看到一個名詞,數據庫實例用戶和實例隔離用戶,那麼什麼是實例隔離用戶呢,於是搜索以下,就涉及到了進程。

援引DB2中國上麵的回答:

??要理解DB2的fenced user, 需要先理解db2的fenced process.
??DB2在V95之後從**多進程模式**改為**多線程模式**,也就是說絕大部分數據庫核心程序都運行在**db2sysc**這個進程中。這種單進程多線程的架構改善了性能,但是同時增加了運行“不安全代碼”帶來的風險。因為大家都運行在一個進程裏,任何一段不安全的代碼出現問題會導致整個DB2引擎崩潰。
??因此DB2增加了額外的進程專門來執行這些風險比較高的代碼,ps -ef可以看到db2fmp這個進程。那些風險比較高的代碼會被運行在db2fmp進程裏,db2sysc會和這個進程通信。這樣當這些不安全的代碼出現問題是隻會導致db2fmp崩潰,而db2核心進程不受影響。
??fenced user就是db2fmp進程運行時的用戶,因為某些用戶可能不希望這些代碼在具有相對較高權限的用戶下運行,所以會指定一個不同於實例用戶的fenced user。
??這些不安全的代碼主要是第三方的代碼,比如說用戶自己用c實現的store procedure和UDF. 或一些第三方的庫文件,比如說federation server的wrapper去訪問Oracle數據庫時需要用到的Oracle的OCI庫。
??在fenced進程中運行不安全的代碼通過隔離增加了db2核心進程的安全性,但同時也增加了因為進程間通信帶來的額外性能開銷。在某些情況下DB2允許用戶自己決定是把“不安全的代碼”運行在fenced process還是db2核心進程裏,比如說在create wrapper的時候有一個Fenced的選項,用戶可以指定yes或no。(2011-09-21) 

??在本地虛擬機上用 ps -ef | grep db2查看進程,結果如下圖所示:
db2_

??在圖中我們可以看到db2的以下進程:

  • db2fmcd
  • db2dasrrm
  • db2fmd
  • db2wdog
  • db2sysc
  • db2ckpwd
  • db2vend
  • db2acd
  • db2fmp
  • db2bp

DB2通用進程全接觸
DB2線程/進程模型

2..線程模型:

  每一個db2sysc派生出來的線程/進程(db2agent,db2loggr,db2pclnr等)都可以稱為EDU(Engine Dispatched Unit),引擎處理單元。
當db2sysc進程被db2wlog創建後,它自己不再創建新的進程,所有的EDU都以線程方式創建。
查看db2sysc運行的線程:db2pd -edus (interval=3)

_
_

2.1實例級edus

??實例啟動時第一個產生的進程是db2sysc,然後db2sysc會派生一係列的線程來工作。

- db2sysc:係統管理器線程,負責啟動/關閉/管理實例的運行。線程由主進程派生,和主進程名字相同。
- db2alarm:複雜處理db2sysc進程裏麵所有警告事件。
- db2thcln:stack棧清理線程,等待任何edu退出,然後清理堆內存。
- db2licc:許可證管理線程
- db2ipccm:IPC通信管理器。每個數據庫分區有一個。複雜本地連接。
- db2tcpcm:TCP通信管理器,TCP/IP連接請求的通信監聽器。
- db2resync:同步管理線程,支持使用2階段提交的應用。
- db2aiothr:異步I/O收集器線程,它收集已經完成的異步I/O請求,一旦收集,完成的I/O請求將會被提交器提取,以備之後處理。
- db2cart:決定哪個日誌文件可以被歸檔並且調用userexit線程來做真正的歸檔。每個實例都有一個。僅當數據庫啟用userexit時才運行。
- db2chkau:DB2審計使用,記錄日誌到審計日誌中。審計啟用時才有此線程。
- db2fmtlg:當數據庫配置了logretain on和userexit off時,在日誌路徑裏預分配日誌文件。主進程在正常運行時從一個日誌文件切換到另一個日誌文件時,無需等待。
- db2glock:全局死鎖檢測器。協調每個數據庫分區db2dlock收集的信息來檢查死鎖情況。多分區環境中,運行在編目分區中。

2.2 數據庫級edus

  • db2dlock,本地死鎖檢測器。每個數據庫分區有一個。掃描locklist和查找死鎖條件。當檢測到死鎖,隨機回滾其事務
  • db2glock,僅在多分區數據庫中的編目分區運行,用來協調每個分區db2dlock收集到的信息
  • db2evm,事件監視器線程。捕獲定義的事件,然後寫入時間監視器定義的輸出文件中。
  • db2hadrp/db2hadrs,HADR主/備服務器線程,控製同步和監控心跳。
  • db2lfr,日誌文件讀線程,每個數據庫有單獨的線程。用於處理各個日誌文件的日誌文件閱讀器
  • db2loggr,用於處理日誌文件以處理事務處理和恢複
  • db2loggw,用於將日誌記錄寫入日誌文件,將日誌從日誌緩衝區寫入磁盤上的日誌文件中。
  • db2logmgr,用於日誌管理器。管理可恢複數據庫的日誌文件。控製事件管理器線程和備份/恢複線程。
  • db2logts,用於跟蹤表空間修改時哪些日誌文件中有日誌記錄。此信息記錄在數據庫目錄中的 DB2TSCHG.HIS 文件中。通過啟用過濾前滾無用的日誌,來加速表空間前滾恢複。
  • db2lused,用於更新對象用途
  • db2pfchr,用於緩衝池預取程序,在應用讀之前,從磁盤讀取數據和索引信息到緩衝區。NUM_IOSERVERS決定其數量
  • db2pclnr,用於緩衝池頁清除程序,將髒頁從緩衝區異步寫入磁盤中。由NUM_IOCLEANERS決定其數量。
  • db2redom,用於重做主進程。在恢複期間,它處理重做日誌記錄並將日誌記錄指定給db2redow來進行處理。
  • db2redow,用於重做工作程序。在恢複期間,它按照重做主進程的請求來處理重做日誌記錄。
  • db2shred,用於處理日誌頁中的各個日誌記錄
  • db2stmm,用於自調整內存管理功能,一直連接到數據庫,如果數據庫處於exclusive模式則inactive
  • db2taskd,用於分發後台數據庫任務。這些任務由名為 db2taskp 的線程執行。
  • db2wlmd,用於自動收集工作負載管理統計信息,數據庫啟動時此線程啟動。

2.3 應用級別edus

??應用級別edus也稱為工作代理。當監聽器線程接受到客戶端連接時,它會從空閑代理池中委派一個空閑的代理db2agent。如果沒有空閑的代理,則會創建新的db2agent。這個db2agent變成此應用的協調代理,會代表應用執行所有的數據庫操作。有4中類型工作代理:

2.3.1協調代理coordinator agent----db2agent

??協調代理會代替應用協調工作並用IPC或TCP/IP和其他代理通信。每個客戶端應用連接請求都有一個協調代理。除非啟用connection concentrator。在多分區環境中,協調代理位於應用連接的分區上。

2.3.2活動的子代理active subagent----db2agntp

在多分區環境中或者分區內並行環境中(啟用dbm參數INTRA_PARALLEL),協調代理會將數據庫請求分配到活動的子代理db2agntp。這些子代理完成工作並將結果集返回給協調代理,最後返回給應用。

2.3.3相關子代理associated subagent-----db2agnta

當子代理完成工作時,它就變成空閑的相關子代理。如果空閑的代理數量少於num_poolagents,那麼它的名字從db2agntp變為db2agnta,並返回到應用的代理池中,但是它仍然與應用相關。如果需要,可能會被協調代理或活動子代理調用,再次為此應用服務。同時它也可能被其他應用所使用。(當沒有空閑的代理或不能創建更多的代理時)

2.3.4無關聯代理unassociated agent----db2agent(idle)

沒有與之相關的應用的空閑代理。可以被任何客戶端練級使用或被協調代理/活動的子代理調用。
其數量由dbm參數NUM_POOLAGENTS決定。db2代理池被所有數據庫共享。

2.3.5應用級edus

db2agent ,每個應用都有一個協調代理,除非啟用connection concentrator
db2agnsc ,並行恢複代理,在前滾恢複和重啟恢複中,並行處理日誌中事務。可以節省恢複時間
db2agnti , 獨立的協調代理,不許要客戶端的實際連接,完成DB2內部工作
db2agntp ,代替協調代理當前正在處理任務的子代理,可以提供內部分區並行處理能力。
db2agnta,曾經被協調代理使用過但仍然與之關聯的空閑子代理。
db2agntdp ,數據庫合用代理
db2agntgp ,合用網關代理程序

2.4請求代理

最後更新:2017-05-09 16:31:25

  上一篇:go Spring Boot Dubbo applications.properties 配置清單
  下一篇:go HTC張智威:AI、大數據、雲計算將實現醫療行業顛覆性創新