openGauss/MOGDB與PG等待事件
資料庫版本:PG12.1 openGauss/MOGDB 2.1.0
最近看到了許多關於PG等待事件的文章,對等待事件這部分也有了很大的興趣。
等待事件是一個累計的統計資訊,表明一個server process要繼續完成作業,必須等待一個時間的結束;因為系統資源有限,那麼完成某些工作,所需資源就要輪流使用,那麼在這個過程當中,就會產生等待資源的情況。資料庫會用不同型別的定義,來描述這個事情,稱之為等待事件。
openGauss/MOGDB資料庫是基於PG研發的,原本PG是C語言,到了openGauss/MOGDB這邊將其開發語言變成了C++。PG是從9.6版本加入了等待事件特性,可以通過查詢pg_stat_activity中的wait_event_type和wait_event瞭解到每個sql程式在當前更詳細的執行狀態 。openGauss/MOGDB在PG的基礎上有許多優化及改動,把一些等待事件重新定義,等待事件在保留了部分原等待事件的基礎上也增加了一部分。
在分析問題的時候,等待事件對於我們還是較為重要的,我們可以根據等待事件,初步定位問題,並結合相關測試進行驗證,看到了熟悉的等待事件,我們甚至能大概猜出問題所在。相對於ORACLE來說,PG以及openGauss/MOGDB的等待事件種類和數量較少。在等待事件這方面可能還有極大優化的空間,如果能把等待事件的細粒程度增加,應該會幫助我們更好的瞭解資料庫狀態,解決資料庫問題。
一般來說產生等待事件的幾種情況:
1.請求的資源忙,需要資源釋放
2.會話處於空閒狀態,等待任務
3.會話被阻塞,需要等待阻塞解除
以下內容對比可能根據PG版本有變化,如果有誤,歡迎幫我指正交流。
一、ORACLE與PG與openGauss/MOGDB等待事件種類
在ORACLE 11G裡,共有13類等待事件,包含了1367個等待事件,如下所示:
SYS@orcl11g> select distinct wait_class from v$event_name order by 1; WAIT_CLASS -------------------------------------- Administrative --管理類 Application --應用類 Cluster --叢集類 Commit --提交類 Concurrency --併發 Configuration --配置 Idle --空閒 Network --網路 Other --其他 Queueing --佇列 Scheduler --任務排程 System I/O --系統I/O User I/O --使用者I/O 13 rows selected. SYS@orcl11g>select count(name) from v$event_name; COUNT(NAME) ------------------- 1367
而PG資料庫裡,有著9類等待事件
/* ---------- * Wait Classes * ---------- */ #define PG_WAIT_LWLOCK 0x01000000U /* 等待LWLock */ #define PG_WAIT_LOCK 0x03000000U /* 等待Lock */ #define PG_WAIT_BUFFER_PIN 0x04000000U /* 等待訪問資料緩衝區 */ #define PG_WAIT_ACTIVITY 0x05000000U /* 伺服器程式處於空閒狀態 */ #define PG_WAIT_CLIENT 0x06000000U /* 等待應用客戶端程式在套接字中進行操作 */ #define PG_WAIT_EXTENSION 0x07000000U /* 等待擴充套件模組中的操作 */ #define PG_WAIT_IPC 0x08000000U /* 等待程式間通訊 */ #define PG_WAIT_TIMEOUT 0x09000000U /* 等待達到超時時間 */ #define PG_WAIT_IO 0x0A000000U /* 等待IO操作完成 */
openGauss/MOGDB裡,有著5類等待事件
/* ---------- * Wait Event Classes * ---------- */ #define WAIT_EVENT_END 0x00000000U /* 等待事件結束*/ #define PG_WAIT_LWLOCK 0x01000000U /* 等待LWLock */ #define PG_WAIT_LOCK 0x03000000U /* 等待Lock */ #define PG_WAIT_IO 0x0A000000U /* 等待IO操作完成 */ #define PG_WAIT_SQL 0x0B000000U /* 等待SQL的型別 */
二、PG和openGauss/MOGDB等待事件對比
1.WAIT_EVENT_END
在型別定義裡,WAIT_EVENT_END更像是一種宣告等待事件結束的狀態,可以看到程式碼使用部分,在呼叫pgstat_report_waitevent 函式報告某個等待事件之後,進行相關處理,最後再呼叫一次pgstat_report_waitevent 函式報告WAIT_EVENT_END,類似於宣告操作結束,等待結束。
pgstat_report_waitevent 函式部分程式碼如下,這個函式會從伺服器程式需要等待的地方呼叫,會報告等待事件資訊,等待資訊被儲存作為4位元組。
2.PG_WAIT_LOCK
Lock類的等待事件表示backend後臺程式等待重量級的鎖,通常是指 relation、tuple、page、transactionid 等子型別鎖 。
在PG裡共有10種,
/* * LOCKTAG is the key information needed to look up a LOCK item in the * lock hashtable. A LOCKTAG value uniquely identifies a lockable object. * * The LockTagType enum defines the different kinds of objects we can lock. * We can handle up to 256 different LockTagTypes. */ typedef enum LockTagType { LOCKTAG_RELATION, /* whole relation */ LOCKTAG_RELATION_EXTEND, /* the right to extend a relation */ LOCKTAG_PAGE, /* one page of a relation */ LOCKTAG_TUPLE, /* one physical tuple */ LOCKTAG_TRANSACTION, /* transaction (for waiting for xact done) */ LOCKTAG_VIRTUALTRANSACTION, /* virtual transaction (ditto) */ LOCKTAG_SPECULATIVE_TOKEN, /* speculative insertion Xid and token */ LOCKTAG_OBJECT, /* non-relation database object */ LOCKTAG_USERLOCK, /* reserved for old contrib/userlock code */ LOCKTAG_ADVISORY /* advisory user locks */ } LockTagType;
而openGauss/MOGDB的LOCK類等待事件增加了LOCKTAG_PARTITION、LOCKTAG_PARTITION_SEQUENCE、LOCKTAG_CSTORE_FREESPACE、LOCKTAG_RELFILENODE、LOCKTAG_SUBTRANSACTION,分別是分割槽、分割槽序列、cstore的空閒空間、relfilenode以及子事務的等待。
/* * LOCKTAG is the key information needed to look up a LOCK item in the * lock hashtable. A LOCKTAG value uniquely identifies a lockable object. * * The LockTagType enum defines the different kinds of objects we can lock. * We can handle up to 256 different LockTagTypes. */ typedef enum LockTagType { LOCKTAG_RELATION, /* whole relation */ /* ID info for a relation is DB OID + REL OID; DB OID = 0 if shared */ LOCKTAG_RELATION_EXTEND, /* the right to extend a relation */ /* same ID info as RELATION */ LOCKTAG_PARTITION, /*partition*/ LOCKTAG_PARTITION_SEQUENCE, /*partition sequence*/ LOCKTAG_PAGE, /* one page of a relation */ /* ID info for a page is RELATION info + BlockNumber */ LOCKTAG_TUPLE, /* one physical tuple */ /* ID info for a tuple is PAGE info + OffsetNumber */ LOCKTAG_TRANSACTION, /* transaction (for waiting for xact done) */ /* ID info for a transaction is its TransactionId */ LOCKTAG_VIRTUALTRANSACTION, /* virtual transaction (ditto) */ /* ID info for a virtual transaction is its VirtualTransactionId */ LOCKTAG_OBJECT, /* non-relation database object */ /* ID info for an object is DB OID + CLASS OID + OBJECT OID + SUBID */ LOCKTAG_CSTORE_FREESPACE, /* cstore free space */ /* * Note: object ID has same representation as in pg_depend and * pg_description, but notice that we are constraining SUBID to 16 bits. * Also, we use DB OID = 0 for shared objects such as tablespaces. */ LOCKTAG_USERLOCK, /* reserved for old contrib/userlock code */ LOCKTAG_ADVISORY, /* advisory user locks */ /* same ID info as spcoid, dboid, reloid */ LOCKTAG_RELFILENODE, /* relfilenode */ LOCKTAG_SUBTRANSACTION, /* subtransaction (for waiting for subxact done) */ /* ID info for a transaction is its TransactionId + SubTransactionId */ LOCK_EVENT_NUM } LockTagType;
3.PG_WAIT_IO
如下的IO類部分為openGauss/MOGDB和PG12.1對比所不具有的,可以看到PG12.1比openGauss/MOGDB多了邏輯複製查詢重寫,Reorder Buffer的讀寫等待、時間線歷史檔案的同步、WAL同步、WAL BOOTSTRAP的同步、寫等待等等。
WAIT_EVENT_DSM_FILL_ZERO_WRITE, WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ, WAIT_EVENT_LOGICAL_REWRITE_CHECKPOINT_SYNC, WAIT_EVENT_LOGICAL_REWRITE_MAPPING_SYNC, WAIT_EVENT_LOGICAL_REWRITE_MAPPING_WRITE, WAIT_EVENT_LOGICAL_REWRITE_SYNC, WAIT_EVENT_LOGICAL_REWRITE_TRUNCATE, WAIT_EVENT_LOGICAL_REWRITE_WRITE, WAIT_EVENT_REORDER_BUFFER_READ, WAIT_EVENT_REORDER_BUFFER_WRITE, WAIT_EVENT_REORDER_LOGICAL_MAPPING_READ, WAIT_EVENT_TIMELINE_HISTORY_FILE_SYNC, WAIT_EVENT_TIMELINE_HISTORY_FILE_WRITE, WAIT_EVENT_TIMELINE_HISTORY_READ, WAIT_EVENT_TIMELINE_HISTORY_SYNC, WAIT_EVENT_TIMELINE_HISTORY_WRITE, WAIT_EVENT_WALSENDER_TIMELINE_HISTORY_READ, WAIT_EVENT_WAL_BOOTSTRAP_SYNC, WAIT_EVENT_WAL_BOOTSTRAP_WRITE, WAIT_EVENT_WAL_SYNC,
而如下部分為PG12.1不具有而openGauss/MOGDB獨有的,多了undo檔案相關,doublerwite檔案讀寫等等、
WAIT_EVENT_BUF_HASH_SEARCH, WAIT_EVENT_BUF_STRATEGY_GET, WAIT_EVENT_UNDO_FILE_EXTEND, WAIT_EVENT_UNDO_FILE_PREFETCH, WAIT_EVENT_UNDO_FILE_READ, WAIT_EVENT_UNDO_FILE_WRITE, WAIT_EVENT_UNDO_FILE_FLUSH, WAIT_EVENT_UNDO_FILE_SYNC, WAIT_EVENT_WAL_BUFFER_ACCESS, WAIT_EVENT_WAL_BUFFER_FULL, WAIT_EVENT_DW_READ, WAIT_EVENT_DW_WRITE, WAIT_EVENT_DW_SINGLE_POS, WAIT_EVENT_DW_SINGLE_WRITE, WAIT_EVENT_PREDO_PROCESS_PENDING, WAIT_EVENT_PREDO_APPLY, WAIT_EVENT_DISABLE_CONNECT_FILE_READ, WAIT_EVENT_DISABLE_CONNECT_FILE_SYNC, WAIT_EVENT_DISABLE_CONNECT_FILE_WRITE, WAIT_EVENT_MPFL_INIT, WAIT_EVENT_MPFL_READ, WAIT_EVENT_MPFL_WRITE, WAIT_EVENT_OBS_LIST, WAIT_EVENT_OBS_READ, WAIT_EVENT_OBS_WRITE, WAIT_EVENT_LOGCTRL_SLEEP, WAIT_EVENT_COMPRESS_ADDRESS_FILE_FLUSH, WAIT_EVENT_COMPRESS_ADDRESS_FILE_SYNC,
4.PG_WAIT_LWLOCK
LWLock的等待事件主要包含兩種:LWLockNamed 和LWLockTranche ,前者表示backend後臺程式等待某種特定的輕量級鎖 ,後者表示表示backend後臺程式等待一組相關輕量級鎖。
這一部分的等待事件較多,就不一一列舉了,但是可以看到,openGauss/MOGDB和PG12.1的LWLockNamed 類等待事件只有少部分一致,這個可能與openGauss/MOGDB基於PG9點幾版本研發有關,等待事件重新定義了。而LWLockTranche 這部分還是有一部分是一致的,但明顯openGauss/MOGDB補充的等待事件數量也更加多。
5.PG_WAIT_SQL
這一類的等待事件是openGauss/MOGDB分的一類關於SQL的,可以看到等待的SQL型別。
/* ---------- * Wait Events - SQL * * Using this to indicate the type of SQL DML event. * ---------- */ typedef enum WaitEventSQL { WAIT_EVENT_SQL_SELECT = PG_WAIT_SQL, WAIT_EVENT_SQL_UPDATE, WAIT_EVENT_SQL_INSERT, WAIT_EVENT_SQL_DELETE, WAIT_EVENT_SQL_MERGEINTO, WAIT_EVENT_SQL_DDL, WAIT_EVENT_SQL_DML, WAIT_EVENT_SQL_DCL, WAIT_EVENT_SQL_TCL } WaitEventSQL;
如下是相應的pgstat_report_wait_count 函式使用的關於這個等待事件的部分,可以看到它主要是使用pg atomic函式根據wait_event_info為使用者新增sql計數。
/* Using pg atomic function to add count for corresponsible WaitEventSQL */ if (classId == PG_WAIT_SQL) { WaitEventSQL w = (WaitEventSQL)wait_event_info; switch (w) { case WAIT_EVENT_SQL_SELECT: { UPDATE_SQL_COUNT(WaitCountStatusCell->WaitCountArray[dataid].wc_cnt.wc_sql_select, WaitCountStatusCell->WaitCountArray[dataid].wc_cnt.selectElapse); } break; case WAIT_EVENT_SQL_UPDATE: { UPDATE_SQL_COUNT(WaitCountStatusCell->WaitCountArray[dataid].wc_cnt.wc_sql_update, WaitCountStatusCell->WaitCountArray[dataid].wc_cnt.updateElapse); } break; case WAIT_EVENT_SQL_INSERT: { UPDATE_SQL_COUNT(WaitCountStatusCell->WaitCountArray[dataid].wc_cnt.wc_sql_insert, WaitCountStatusCell->WaitCountArray[dataid].wc_cnt.insertElapse); } break; case WAIT_EVENT_SQL_DELETE: { UPDATE_SQL_COUNT(WaitCountStatusCell->WaitCountArray[dataid].wc_cnt.wc_sql_delete, WaitCountStatusCell->WaitCountArray[dataid].wc_cnt.deleteElapse); } break; case WAIT_EVENT_SQL_MERGEINTO: pg_atomic_fetch_add_u64(&(WaitCountStatusCell->WaitCountArray[dataid].wc_cnt.wc_sql_mergeinto), 1); break; case WAIT_EVENT_SQL_DDL: pg_atomic_fetch_add_u64(&(WaitCountStatusCell->WaitCountArray[dataid].wc_cnt.wc_sql_ddl), 1); break; case WAIT_EVENT_SQL_DML: pg_atomic_fetch_add_u64(&(WaitCountStatusCell->WaitCountArray[dataid].wc_cnt.wc_sql_dml), 1); break; case WAIT_EVENT_SQL_DCL: pg_atomic_fetch_add_u64(&(WaitCountStatusCell->WaitCountArray[dataid].wc_cnt.wc_sql_dcl), 1); break; case WAIT_EVENT_SQL_TCL: pg_atomic_fetch_add_u64(&(WaitCountStatusCell->WaitCountArray[dataid].wc_cnt.wc_sql_tcl), 1); break; default: break; } } LWLockRelease(WaitCountHashLock); }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990629/viewspace-2855145/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MogDB openGauss故障排查流程
- MogDB-opengauss中的聚集與分組操作
- openGauss/MogDB的TPCH測試
- MogDB openGauss常用查詢彙總
- MOGDB/openGauss與PostgreSQL關於GBK字符集問題SQL
- MOGDB/openGauss與PostgreSQL關於GDK字符集問題SQL
- MogDB/openGauss中merge的語法解析
- MogDB-openGauss default privileges 使用方法
- openGauss/MOGDB Copy支援容錯機制
- MogDB/openGauss如何實現事務的rollback
- MogDB/openGauss如何實現自增主鍵
- MOGDB/openGauss索引推薦及虛擬索引索引
- openGauss/MogDB的uncommitted xmin問題解決MIT
- 同步篇——事件等待與喚醒事件
- Solidity事件,等待事件Solid事件
- MogDB/openGauss學習筆記-獲取物件DDL筆記物件
- openGauss/MogDB列存表的delta表測試
- 【TUNE_ORACLE】等待事件之等待事件類別Oracle事件
- openGauss/MogDB-3.0.0 dcf測試(非om安裝)
- MOGDB/openGauss的dbe_perf.Statement與pgstat.stat檔案關係驗證
- MogDB openGauss資料庫擴縮容的幾種方式資料庫
- MogDB/openGauss的三種函式穩定性關鍵字函式
- MogDB/openGauss 生態工具-MTK對glibc版本的解決
- Selenium等待事件Waits事件AI
- openGauss/MogDB列存表vacuum DELTAMERGE過程申請的鎖
- 根據openGauss/MogDB的lwtid檢視執行緒堆疊執行緒
- read by other session等待事件Session事件
- log file sync等待事件事件
- ORACLE 常見等待事件Oracle事件
- latch等待事件彙總事件
- Latch free等待事件(轉)事件
- gc cr request等待事件GC事件
- 【等待事件】library cache pin事件
- 【等待事件】log file sync事件
- MogDB/openGauss誤刪未歸檔的xlog日誌如何解決
- 遷移ORACLE資料到MogDB/openGauss時的字符集問題Oracle
- MOGDB/openGauss資料庫gs_dump備份指令碼及清理資料庫指令碼
- MOGDB/openGauss的txid_snapshot 資料型別和相關函式資料型別函式