官术网_书友最值得收藏!

1.2.3 數據庫實例

達夢數據庫實例一般由一個正在運行的DM后臺進程(包含多個線程)及一個大型的共享內存組成。簡單來說,實例就是操作達夢數據庫的一種手段,是用來訪問數據庫的內存結構及后臺進程的集合。

達夢數據庫存儲在服務器的磁盤上,而達夢數據庫實例存儲在服務器的內存中。通過運行達夢數據庫實例,可以操作達夢數據庫中的內容。在任何時候,一個實例只能與一個數據庫進行關聯(裝載、打開或掛起數據庫)。在大多數情況下,一個數據庫也只有一個實例對其進行操作。但是,在達夢數據庫提供的高性能集群中,多個達夢數據庫實例可以同時裝載并打開一個數據庫(位于一組由多臺服務器共享的物理磁盤上),此時,可以同時從多臺計算機上訪問這個數據庫。

1.DM后臺進程

DM服務器使用“對稱服務器構架”的單進程、多線程結構。這種“對稱服務器構架”在有效地利用系統資源的同時,提供了較高的可伸縮性能,這里的線程即操作系統的線程。服務器在運行時由各種內存數據結構和一系列線程組成,線程分為多種類型,不同類型的線程完成不同的任務。線程通過一定的同步機制對數據結構進行并發訪問和處理,以完成用戶提交的各種任務。達夢數據庫服務器是共享的服務器,允許多個用戶連接到同一個服務器上,服務器進程稱為共享服務器進程。DM后臺進程中主要包括監聽線程、工作線程、輸入輸出(I/O)線程、調度線程、日志線程等。

1)監聽線程

監聽線程的主要任務是在服務器端口上進行循環監聽,一旦有來自客戶的連接請求,監聽線程被喚醒并生成一個會話申請任務,加入工作線程的任務隊列,等待工作線程進行處理。監聽線程在系統啟動完成后才啟動,在系統關閉時首先被關閉。為了保證在處理大量客戶連接時系統具有較短的響應時間,監聽線程比普通線程優先級更高。

2)工作線程

工作線程是DM服務器的核心線程,它從任務隊列中取出任務,并根據任務的類型進行相應的處理,負責所有實際數據的相關操作。DM8的初始工作線程個數由配置文件指定,隨著會話連接的增加,工作線程也會同步增加,以保持每個會話都有專門的工作線程處理請求。為了保證用戶的所有請求及時響應,一個會話上的任務全部由同一個工作線程完成,這樣減少了線程切換的代價,提高了系統效率。當會話連接超過預設的閾值時,工作線程數量不再增加,轉而由會話輪詢線程接收所有用戶請求,并加入任務隊列,等工作線程空閑時,從任務隊列中依次摘取請求任務處理。

3)輸入輸出(I/O)線程

在數據庫活動中,I/O 操作歷來都是最耗時的操作之一。當事務需要的數據頁不在緩沖區中時,如果在工作線程中直接對那些數據頁進行讀寫,會使系統性能變得非常糟糕,而把I/O操作從工作線程中分離出來是非常明智的做法。I/O線程的職責就是處理這些I/O操作。在通常情況下,DM Server需要進行I/O操作的時機主要有以下3種。

(1)需要處理的數據頁不在緩沖區中,此時需要將相關數據頁讀入緩沖區。

(2)當緩沖區滿或系統關閉時,需要將部分臟數據頁寫入磁盤。

(3)當檢查點到來時,需要將所有臟數據頁寫入磁盤。

I/O 線程在啟動后,通常處于睡眠狀態,當系統需要進行 I/O 操作時,只需要發出一個I/O請求,I/O線程就會被喚醒以處理該請求,并在完成該I/O操作后繼續進入睡眠狀態。

I/O線程的個數是可配置的,可以通過設置dm.ini文件中的IO_THR_GROUPS參數來設置,在默認情況下,I/O線程的個數是兩個。同時,I/O線程處理I/O請求的策略根據操作系統平臺的不同會有很大差別,在一般情況下,I/O線程使用異步的I/O操作將數據頁寫入磁盤,此時,系統將所有的I/O請求直接遞交給操作系統,操作系統在完成這些請求后才通知I/O線程,這種異步I/O的方式使得I/O線程需要直接處理的任務很簡單,即完成I/O操作后的一些收尾處理并發出 I/O 操作完成通知;如果操作系統不支持異步 I/O 操作,此時I/O線程需要完成實際的I/O操作。

4)調度線程

調度線程用于接管系統中所有需要定時調度的任務。調度線程每秒輪詢一次,負責的任務如下。

(1)檢查系統級的時間觸發器,若滿足觸發條件則生成任務加到工作線程的任務隊列中由工作線程執行。

(2)清理SQL緩存、計劃緩存中失效的緩存項,或者超出緩存限制后淘汰不常用的緩存項。

(3)檢查數據重演捕獲持續時間是否到期,若到期則自動停止捕獲。

(4)執行動態緩沖區檢查,根據需要動態擴展或動態收縮系統緩沖池。

(5)自動執行檢查點。為了保證日志的及時刷盤,縮短系統發生故障時需要的恢復時間,根據INI參數設置的自動檢查點執行間隔定期執行檢查點操作。

(6)會話超時檢測。若用戶連接設置了連接超時,則定期檢測連接是否超時,如果超時則自動斷開連接。

(7)在必要時執行數據更新頁刷盤。

(8)喚醒等待的工作線程。

5)日志刷新(FLUSH)線程

任何數據庫的修改,都會產生重做(REDO)日志,為了保證數據故障恢復的一致性,REDO日志的刷盤必須在數據更新頁刷盤之前進行。事務在運行時,會把生成的REDO日志保留在日志緩沖區中,當事務提交或執行檢查點時,會通知日志 FLUSH 線程進行日志刷盤。由于日志具備順序寫入的特點,比數據頁分散I/O寫入效率更高,因此,日志FLUSH線程和I/O線程分開,能獲得更快的響應速度,保證整體的性能。DM8的日志FLUSH線程進行了優化,在刷盤之前,對不同緩沖區內的日志進行合并,減少了I/O次數,進一步提高了系統性能。如果系統配置了實時歸檔,則在日志 FLUSH 線程刷盤前,會直接將日志通過網絡發送到實時備機。如果系統配置了本地歸檔或遠程同步歸檔,則生成歸檔任務,通過日志歸檔線程完成。

6)日志歸檔線程

日志歸檔線程包含同步歸檔線程和異步歸檔線程,前者負責本地歸檔和遠程同步歸檔任務,后者負責遠程異步歸檔任務。如果系統配置了非實時歸檔,則由日志 FLUSH線程產生的任務會分別加入日志歸檔線程,日志歸檔線程負責從任務隊列中取出任務,按照歸檔類型進行相應歸檔處理。將日志FLUSH線程和日志歸檔線程分開的目的是減少不必要的效率損失,除遠程實時歸檔外,本地歸檔、遠程同步歸檔、遠程異步歸檔都可以脫離日志FLUSH線程進行,如果放在日志FLUSH線程中一起進行,則會嚴重影響系統性能。

7)日志重做線程

為了提高故障恢復效率,達夢數據庫在故障恢復時采用了并行機制重做日志,日志重做線程就用于日志的并行恢復。通過INI參數LOG_REDO_THREAD_NUM可配置日志重做線程數,默認是2個線程。

8)日志應用(APPLY)線程

在配置了數據守護的系統中,創建了一個日志 APPLY 線程。當服務器作為備機時,每次接收到主機的物理 REDO 日志都生成一個日志 APPLY 任務加入任務隊列中,日志APPLY線程從任務隊列中取出一個任務在備機上重做日志,并生成自己的日志,以保持和主機數據的同步或一致,作為主機的一個鏡像。備機數據對用戶只讀,可承擔報表、查詢等任務,以均衡主機的負載。

9)定時器線程

在數據庫的各種活動中,用戶常常需要數據庫在某個時間點開始進行某種操作,如備份,或者在某個時間段內反復進行某種操作等。定時器線程就是為這種需求設計的。在通常情況下,DM服務器需要進行定時操作的事件主要有以下幾種。

(1)邏輯日志異步歸檔。

(2)異步歸檔日志發送(只在PRIMARY模式下,且在OPEN狀態下發送)。

(3)作業調度。

定時器線程啟動之后,每秒檢測一次定時器鏈表,查看當前的定時器是否滿足觸發條件,如果滿足,則把執行權交給設置好的任務,如邏輯日志異步歸檔等。在默認情況下,DM服務器啟動的時候,定時器線程是不啟動的。用戶可以將dm.ini中的TIMER_INI參數設置為1來設置定時器線程在系統啟動時啟動。

10)邏輯日志歸檔線程

邏輯日志歸檔用于 DM8 的數據復制,目的是加快異地訪問的響應速度。邏輯日志歸檔線程包含本地邏輯日志歸檔線程和遠程邏輯日志歸檔線程。在系統配置了數據復制后,系統才會創建這兩個線程。

(1)本地邏輯日志歸檔線程:本地邏輯日志歸檔線程從本地歸檔任務隊列中取出一個歸檔任務,生成到邏輯日志,并將邏輯日志寫入邏輯日志文件中。如果當前邏輯日志的遠程歸檔類型是同步異地歸檔,并且當前的刷盤機制是強制刷盤,那么就生成一個異地歸檔任務加入臨時任務隊列中。

(2)遠程邏輯日志歸檔線程:遠程邏輯日志歸檔線程從遠程歸檔任務隊列中取出一個歸檔任務,并根據任務的類型進行相應的處理。任務的類型包括同步發送任務和異步發送任務。

11)數據守護相關線程

在配置了數據守護的觀察器上,會創建觀察器的實時檢測線程、同步檢測線程,實現主機和備機之間的故障檢測、故障切換及故障恢復。在配置了數據守護進程的數據守護方案中,數據庫實例還會創建 UDP 消息的廣播和接收線程,負責數據庫實例和守護進程之間的通信,實現數據守護功能。

12)MAL系統相關線程

MAL(Mail)系統是達夢數據庫內部的高速通信系統,基于 TCP/IP 協議實現。DM服務器的很多重要功能都是通過 MAL 系統實現通信的,如數據守護、數據復制、大規模并行處理(MPP)、遠程日志歸檔等。MAL系統內部包含一系列線程,有MAL監聽線程、MAL發送工作線程、MAL接收工作線程等。

13)其他線程

達夢數據庫系統中不止包括以上線程,在一些特定的功能中會有不同的線程,如回滾段清理線程、審計寫文件線程、重演捕獲寫文件線程等,這里不再一一列出。

2.內存結構

數據庫管理系統是一種對內存申請和釋放操作頻率很高的軟件,如果每次對內存的使用都通過操作系統函數來申請和釋放,則系統效率會比較低,因此加入自己的內存管理系統是達夢數據庫系統管理必需的。通常,內存管理系統會帶來以下好處:

(1)申請、釋放內存效率更高;

(2)能夠有效地了解內存的使用情況;

(3)易于發現內存泄露和內存寫越界的問題。

達夢數據庫管理系統的內存結構主要包括內存池、緩沖區、排序緩沖區、哈希緩沖區等。根據系統中子模塊的不同功能,達夢數據庫管理系統對內存進行了上述劃分,并采用了不同的管理模式。

1)內存池

DM服務器的內存池指的是共享內存池,根據內存使用情況的不同,共享內存池的使用有兩種工作方式:HEAP和VPOOL。共享內存池用于解決DM服務器對于小片內存的申請與釋放問題。系統在運行過程中,經常會申請與釋放小片內存,而向操作系統申請和釋放內存時需要發出系統調用,此時可能會引起線程切換,降低系統運行效率。采用共享內存池可一次向操作系統申請一片較大內存,即內存池。當系統在運行過程中需要申請內存時,在共享內存池內進行申請;當用完該內存后,再釋放,即歸還給共享內存池。當系統采用較好的策略管理共享內存池時,小片內存的申請與釋放不會對系統造成太大影響。這種方式還有一個優點,可以比較容易地檢測系統是否存在內存泄露。達夢數據庫系統管理員可以通過 DM 服務器的配置文件(dm.ini)來對共享內存池的大小進行設置,共享內存池的參數為MEMORY_POOL,該配置默認為40MB。而HEAP和VPOOL使用的是共享內存池中的內存,所以在一般情況下,HEAP和VPOOL兩種工作方式申請的內存大小不會超過MEMORY_POOL的值。

(1)HEAP:HEAP 的工作方式采用了堆的思想,即每次在申請內存時,都是從堆頂上申請的,如果內存不夠,則繼續向共享內存池申請內存頁,然后加入HEAP中,繼續供系統申請使用,這樣HEAP的長度可以無限增長下去;在釋放HEAP時,可以釋放堆頂上的內存頁,也可以釋放整個HEAP。使用內存堆來管理小片內存的申請有一個特點,每次在申請小片內存后,不能單獨對這片內存進行釋放,也就是不用關心這片內存何時釋放,而是在堆釋放時統一釋放,這樣就能有效防止內存泄露的發生。

(2)VPOOL:VPOOL工作方式主要采用了“伙伴系統”的思想進行管理。申請的VPOOL內存分為私有VPOOL和公有VPOOL兩種。私有VPOOL只提供給某個單獨功能模塊使用,公有VPOOL則提供給那些需要共享同一資源而申請的模塊,所以需要對公有VPOOL進行保護,而私有VPOOL則不需要保護。

VPOOL和HEAP的區別在于,VPOOL申請的每片內存都可以單獨進行釋放。

2)緩沖區

(1)數據緩沖區。

數據緩沖區是DM服務器在將數據頁寫入磁盤之前,以及從磁盤上讀取數據頁之后,數據頁存儲的地方。數據緩沖區是DM服務器至關重要的內存區域之一,將其設定得太小,會導致緩沖頁命中率低,磁盤 I/O 操作頻繁;將其設定得太大,又會導致操作系統內存本身不夠用。系統在啟動時,首先根據配置的數據緩沖區大小向操作系統申請一片連續內存,并將其按數據頁大小進行格式化,置入自由鏈中。數據緩沖區存在 3 條鏈來管理被緩沖的數據頁:一條是自由鏈,用于存放目前尚未使用的內存數據頁;一條是LRU鏈,用于存放已被使用的內存數據頁(包括未修改的和已修改的);還有一條是臟鏈,用于存放已被修改的內存數據頁。LRU鏈對系統當前使用的數據頁按最近是否被使用的順序進行排序。這樣,當數據緩沖區中的自由鏈被用完時,從LRU鏈中淘汰部分最近未使用的數據頁,能夠最大限度地保證被淘汰的數據頁最近不會被用到,以減少I/O操作。在系統運行過程中,通常存在一部分“非常熱”(反復被訪問)的數據頁,將它們一直留在緩沖區中,對系統性能會有好處。數據緩沖區開辟了一個特定的區域用于存放這部分數據頁,以保證這部分數據頁不參與一般的淘汰機制,可以一直留在數據緩沖區中。

① 類別:DM服務器中有4種類型的數據緩沖區,分別是NORMAL緩沖區、KEEP緩沖區、FAST緩沖區和RECYCLE緩沖區。其中,用戶在創建表空間或修改表空間時,可以指定表空間屬于NORMAL緩沖區,還是屬于KEEP緩沖區。RECYCLE緩沖區供TEMP表空間使用,FAST 緩沖區根據用戶指定的 FAST_POOL_PAGES 和 FAST_ROLL_PAGES大小由系統自動進行管理,用戶不能指定使用RECYCLE緩沖區和FAST緩沖區中的表或表空間。NORMAL 緩沖區主要提供給系統處理的一些數據頁,在沒有特定的指定緩沖區的情況下,默認緩沖區為 NORMAL 緩沖區;KEEP 緩沖區的特性是很少或幾乎不怎么對緩沖區中的數據頁進行淘汰,主要針對用戶的應用是否需要經常處在內存當中,如果是,則可以指定緩沖區為KEEP緩沖區。DM服務器提供了可以更改這些緩沖區大小的參數,用戶可以根據自己的應用需求情況,指定dm.ini文件中BUFFER(80MB)、KEEP(8MB)、RECYCLE(64MB)、FAST_POOL_PAGES(0)和 FAST_ROLL_PAGES(0)的值(括號中為默認值),這些值分別對應NORMAL緩沖區的大小、KEEP緩沖區的大小、RECYCLE緩沖區的大小、FAST緩沖區的頁面數和FAST緩沖區的回滾頁面數。

② 讀多頁:在需要進行大量I/O操作的應用中,達夢數據庫之前版本的策略是每次只讀取 1 個數據頁。如果知道用戶需要讀取表的大量數據,當讀取到第一頁時,可以猜測用戶可能需要讀取這一頁的下一頁,在這種情況下,一次性讀取多個數據頁就可以減少I/O操作次數,從而提高數據的查詢、修改效率。DM服務器提供了可以讀取多個數據頁的參數,用戶可以指定這些參數來調整數據庫運行效率的最佳狀態。在DM服務器的配置文件dm.ini中,可以指定參數MULTI_PAGE_GET_NUM的大?。J值為16頁),以控制每次讀取的數據頁數。如果用戶沒有設置較適合的參數MULTI_PAGE_GET_NUM的大小,有時可能會給用戶帶來更差的運行效果。如果 MULTI_PAGE_GET_NUM 的值太大,每次讀取的數據頁可能大多不是以后所用到的數據頁,這樣不僅會增加 I/O 的操作次數,而且每次都會做一些無用的 I/O 操作,所以系統管理員需要衡量好自己的應用需求,給出最佳方案。

(2)日志緩沖區。

日志緩沖區是用于存放重做日志的內存緩沖區。為了避免由于直接的磁盤I/O操作而使系統性能受到影響,系統在運行過程中產生的日志并不會立即被寫入磁盤,而是和數據頁一樣,先被存放到日志緩沖區中。那么,為何不在數據緩沖區中存放重做日志,而要單獨設立日志緩沖區呢?其主要原因如下。

① 重做日志的格式同數據頁完全不一樣,無法進行統一管理。

② 重做日志具備連續寫的特點。

③ 在邏輯上,寫重做日志比數據頁I/O操作優先級更高。

DM服務器提供了參數LOG_BUF_SIZE,以對日志緩沖區大小進行控制,日志緩沖區所占用的內存是從共享內存池中申請的,單位為頁,并且大小必須為2N頁,否則采用系統默認大小256頁。

(3)字典緩沖區。

字典緩沖區主要存儲一些數據字典信息,如模式信息、表信息、列信息、觸發器信息等。每次對數據庫的操作都會涉及數據字典信息,訪問數據字典信息的效率直接影響到相應的操作效率。例如,進行查詢操作,就需要相應的表信息、列信息等,這些數據字典信息如果都在緩沖區中,則直接從緩沖區中獲取即可,否則,需要I/O操作才能讀取這些信息。DM8采用將部分數據字典信息加載到緩沖區中,并基于LRU算法進行數據字典信息的控制。緩沖區如果設置得太大,會浪費寶貴的內存空間;如果設置得太小,可能會頻繁地進行數據頁淘汰,該緩沖區配置的參數為DICT_BUF_SIZE,默認的配置大小為5MB。DM8采用緩沖部分數據字典對象的方式,這會影響系統效率嗎?數據字典信息訪問存在熱點現象,并不是所有的數據字典信息都會被頻繁訪問,所以按需加載數據字典信息并不會影響系統實際的運行效率。但是,如果在實際應用中涉及對分區數量較多的水平分區表的訪問,如上千個分區,就需要適當調大DICT_BUF_SIZE參數的值。

(4)SQL緩沖區。

SQL緩沖區提供在執行SQL語句過程中所需要的內存,包括執行計劃、SQL語句和結果集存放。在很多應用中都存在反復執行相同SQL 語句的情況,此時可以使用緩沖區保存這些SQL語句和它們的執行計劃,這就是計劃重用。這樣做帶來的好處是加快了SQL語句的執行效率,但同時給內存增加了壓力。DM服務器的配置文件dm.ini中提供了參數來支持是否需要計劃重用,參數為USE_PLN_POOL,當該參數指定為1時,啟動計劃重用;否則,禁止計劃重用。達夢數據庫還提供了參數 CACHE_POOL_SIZE(單位為 MB)來改變SQL緩沖區的大小,系統管理員可以設置該參數值以滿足應用需求,默認值為10MB。

3)排序緩沖區

排序緩沖區提供數據排序所需要的內存空間。用戶在執行SQL語句時,通常需要進行排序,所使用的內存就是排序緩沖區提供的。在每次排序過程中,系統都先申請內存,在排序結束后再釋放內存。DM 服務器提供了參數來指定排序緩沖區的大小,參數SORT_BUF_SIZE在DM服務器的配置文件dm.ini中,系統管理員可以設置其大小以滿足需求。由于該參數值是由系統內部的排序算法和排序數據結構決定的,因此建議使用默認值2MB。

4)哈希緩沖區

DM8提供了為哈希連接而設定的緩沖區,不過該緩沖區是虛擬緩沖區。之所以說是虛擬緩沖區,是因為系統沒有真正創建特定的屬于哈希緩沖區的內存,而是在進行哈希連接時,對排序的數據量進行了計算。如果計算得出的數據量超過了哈希緩沖區的大小,則使用 DM8 創新外存哈希方式;如果計算得出的數據量沒有超過哈希緩沖區的大小,實際上使用的還是VPOOL內存池進行的哈希操作。DM服務器在配置文件dm.ini中提供了參數HJ_BUF_SIZE來進行控制,由于該參數值的大小可能會限制哈希連接的效率,所以建議保持默認值,或者設置為更大的值。

除提供 HJ_BUF_SIZE 參數外,DM 服務器還提供了創建哈希表個數的初始化參數,其中,HAGR_HASH_SIZE 表示在處理聚集函數時創建哈希表的個數,建議保持默認值100000個。

5)SSD緩沖區

固態硬盤(SSD)采用閃存作為存儲介質,因沒有機械磁頭的尋道時間,其讀寫效率比機械磁盤更有優勢。內存、SSD、機械磁盤均符合存儲分級的條件。為提高系統執行效率,DM服務器將SSD文件作為內存緩存與普通磁盤緩存之間的緩沖層,稱為SSD緩沖。DM服務器在dm.ini中提供參數SSD_BUF_SIZE和SSD_FILE_PATH來配置SSD緩沖區,SSD_BUF_SIZE用于指定SSD緩沖區的大小,單位是MB,DM服務器根據該參數創建相應大小的文件作為緩沖區使用;SSD_FILE_PATH指定SSD文件所在的文件夾路徑,管理員需要保證設置的路徑位于固態磁盤上。

默認SSD緩沖區是關閉的,即SSD_BUF_SIZE為0。若要配置SSD緩沖區,則將其設置為大于 0 的數,并指定 SSD_FILE_PATH 即可。根據存儲分級的概念,建議將SSD_BUF_SIZE的值配置為BUFFER_SIZE值的2倍左右。

主站蜘蛛池模板: 沂南县| 彭山县| 铅山县| 博罗县| 绥中县| 淮北市| 扶绥县| 临武县| 湘乡市| 衡阳县| 商水县| 荥经县| 浪卡子县| 太谷县| 逊克县| 江阴市| 当涂县| 河西区| 望都县| 永宁县| 土默特左旗| 万荣县| 岫岩| 金塔县| 古丈县| 通辽市| 安顺市| 荆州市| 左权县| 汝城县| 武安市| 高要市| 景谷| 揭东县| 武川县| 衢州市| 台安县| 永登县| 鄂州市| 磐石市| 固镇县|