- 論壇徽章:
- 0
|
圖 10 - pmap 命令對(duì)于 db2sysc 進(jìn)程的示例輸出(/usr/proc/bin/pmap -x 15444)
![]()
從 圖 10 中可以觀察到下面一些情況:
從 0x00010000 到 0x023F8000 這一部分被預(yù)留給 db2sysc 可執(zhí)行程序(~36MB)。
橙色的那部分(堆),即從 0x023F8000 到 0x10000000,被用于代理私有內(nèi)存(~220MB)。
實(shí)例共享內(nèi)存,即綠色那部分,始于默認(rèn)地址 0x10000000。這意味著沒有設(shè)置 DB2DBMSADDR。
所有 3 個(gè)綠色的段被用于共享內(nèi)存,包括實(shí)例共享內(nèi)存和數(shù)據(jù)庫共享內(nèi)存。pmap 輸出并沒有說出哪一個(gè)段是實(shí)例共享內(nèi)存,哪一個(gè)段是數(shù)據(jù)庫共享內(nèi)存。我們只知道,數(shù)據(jù)庫共享內(nèi)存在 0xFE002000 結(jié)束,因?yàn)閺倪@個(gè)地址開始的是一個(gè)用于匿名內(nèi)存的段。因此,實(shí)例共享內(nèi)存和數(shù)據(jù)庫共享內(nèi)存總共的大小是 0xFE002000 - 0x10000000 = 3,992,985,600 字節(jié) = ~3.7 GB。
從 0xFFBC0000 到 0xFFFFFFFF 是用于堆棧的內(nèi)存段(~4MB)。
注意:在 32 位 Solaris 中,我們通常將 DB2 數(shù)據(jù)庫共享內(nèi)存限制在大約 3.5 GB。
如果設(shè)置了 DB2DBMSADDR 注冊(cè)表變量,那么實(shí)例共享內(nèi)存將從該變量指定的地址開始。下面的例子展示了這一點(diǎn)是如何實(shí)現(xiàn)的。
例子 設(shè)置 DB2DBMSADDR 注冊(cè)表變量:
db2set DB2DBMSADDR = 0x12000000
db2stop
db2start (需要重新啟動(dòng)實(shí)例,以使更改生效)。
獲得 db2sys 進(jìn)程的進(jìn)程 ID
ps -ef | grep sylviaq ('sylviaq' 是實(shí)例名)。
-ef | grep sylviaq
sylviaq 13166 1 0 13:09:12 pts/2 0:00 /export/home/sylviaq/sqllib/bin/db2bp 13049C11221 5
sylviaq 13263 13256 0 13:11:02 ? 0:00 db2sysc
sylviaq 13265 13256 0 13:11:03 ? 0:00 db2sysc
sylviaq 13257 13254 0 13:10:59 pts/3 0:00 -ksh
sylviaq 13256 13253 0 13:10:59 ? 0:00 db2sysc
sylviaq 13262 13256 0 13:11:00 ? 0:00 db2sysc
sylviaq 13360 13049 0 13:11:41 pts/2 0:00 grep sylviaq
sylviaq 13264 13256 0 13:11:02 ? 0:00 db2sysc
sylviaq 13266 13261 0 13:11:03 ? 0:00 db2sysc
以 root 的身份 cd 到 /usr/proc/pmap,并對(duì)任何 db2sysc 進(jìn)程運(yùn)行 pmap:
./pmap -x 13263
pmap 輸出:
13263: db2sysc
Address Kbytes Resident Shared Private Permissions Mapped File
00010000 35808 4064 1608 2456 read/exec db2sysc
02316000 896 168 48 120 read/write/exec db2sysc
023F6000 744 264 8 256 read/write/exec [ heap ]
12000000 243472 243472 - 243472 read/write/exec/shared [shmid=0xbc3]
21000000 22512 22512 - 22512 read/write/exec/shared [shmid=0xbc4]
FCC00000 8328 8328 - 8328 read/write/exec/shared [shmid=0xa96]
FE002000 8 - - - read/write/exec [ anon ]
注意,實(shí)例共享內(nèi)存現(xiàn)在從 0x12000000 開始,而不是從默認(rèn)地址 0x10000000 開始。代理私有內(nèi)存的大。ㄓ 'heap' 標(biāo)出)從 220MB ( 圖 10)增加到了 252 MB。(0x12000000 - 0x023F6000 = 0xFC0A000 = 264282112 (十進(jìn)制) = ~252MB)
您可能注意到, 圖 9中給出的 4GB 地址空間沒有包括任何內(nèi)核內(nèi)存。這就對(duì)了,在 Solaris 中,內(nèi)核有其自己的地址空間,該地址空間與進(jìn)程的地址空間是分開的。這樣就將更多的空間留給了其他內(nèi)存集,例如數(shù)據(jù)庫共享內(nèi)存。
雖然與 AIX 相比,在 Solaris 中我們有更大的地址空間用于數(shù)據(jù)庫共享內(nèi)存(在 AIX 上是 2GB),但是在 Solaris 上所有共享內(nèi)存都是固定在物理 RAM 中。如果 RAM 比較小,那么對(duì)于可以并發(fā)運(yùn)行的數(shù)據(jù)庫數(shù)目就有很大的影響。請(qǐng)參閱 “Sun Solaris 中與分配數(shù)據(jù)庫共享內(nèi)存有關(guān)的常見問題”一節(jié)中的例 2。
需要從這種結(jié)構(gòu)中了解到的最重要的事情是:
與 AIX 不同,Solaris 的內(nèi)存段其大小不是固定的。我們可以通過設(shè)置 DB2DBMSADDR DB2 注冊(cè)表變量,將實(shí)例共享內(nèi)存移到更高的地址,從而增加代理私有內(nèi)存。
數(shù)據(jù)庫共享內(nèi)存的限制大約是 3.5GB。
功能內(nèi)存與 RAM 固定,因而不能交換出去。
32 位 Sun Solaris 中與分配數(shù)據(jù)庫共享內(nèi)存有關(guān)的常見問題
沒有充分配置內(nèi)核參數(shù)以及初始化數(shù)據(jù)庫共享內(nèi)存失敗可能導(dǎo)致如下失敗:
在數(shù)據(jù)庫啟動(dòng)時(shí)(激活數(shù)據(jù)庫或第一次連接到數(shù)據(jù)庫) - SQL1478W, SQL1084C, hang condition
在運(yùn)行時(shí) - SQL2043N, 掛起條件
在 Solaris 系統(tǒng)中,DB2 提供了一個(gè)叫做 db2osconf的工具。該工具根據(jù)系統(tǒng)的大小對(duì)內(nèi)核參數(shù)的值給出建議。對(duì)于一個(gè)給定的系統(tǒng),建議的值要足夠高,以便能夠容納最合理的工作負(fù)載。
最常見的未能正確設(shè)置的內(nèi)核參數(shù)是 shmmax。該參數(shù)按字節(jié)指定系統(tǒng)中可以分配的共享內(nèi)存段的最大大小。如果把 DB2 配置成創(chuàng)建大于這個(gè)值的數(shù)據(jù)庫共享內(nèi)存,那么請(qǐng)求就會(huì)失敗。其他要知道的內(nèi)核參數(shù)是 shmseg和 shmmni。
Solaris 中另一個(gè)與分配數(shù)據(jù)庫共享內(nèi)存有關(guān)的常見問題是由于這樣的一個(gè)事實(shí)導(dǎo)致的,即共享內(nèi)存段的所有頁都是固定在物理 RAM 中的。如果在 RAM 中沒有足夠的空閑頁可用,或者沒有足夠的可以被 OS 為滿足數(shù)據(jù)庫段而調(diào)出的其他頁,那么啟動(dòng)數(shù)據(jù)庫的請(qǐng)求就會(huì)遭到失敗。
下面的例子展示了會(huì)導(dǎo)致問題的不恰當(dāng)配置。
例 1 考慮如下配置: (所有頁的大小都為 4K)
服務(wù)器:
服務(wù)器上的物理 RAM 16GB
shmsys:shminfo_shmmax = 2097152 (2GB)
數(shù)據(jù)庫:
IBMDEFAULTBP 400,000 頁
UTILHEAP 17,500 頁
DBHEAP 30,000 頁
LOCKLIST 1000 頁
PCKCACHE 5000 頁
CATALOGCACHE 2500 頁
限制: DB2 發(fā)出的任何創(chuàng)建大于 shmmax 值(這里是 2GB)的數(shù)據(jù)庫共享內(nèi)存集的請(qǐng)求都將失敗,并返回一個(gè) out of memory type 錯(cuò)誤。
計(jì)算:
數(shù)據(jù)庫共享內(nèi)存 = (456,000 頁 x 4KB/頁) x 1.1 = ~2.0GB
問題: 可能仍然可以激活數(shù)據(jù)庫或者連接到數(shù)據(jù)庫。但是,嘗試運(yùn)行一個(gè)應(yīng)用程序時(shí)可能返回如下錯(cuò)誤消息:
SQL1224N A database agent could not be started to service request, or was terminated as a result of a database system shutdown or a force command. SQLSTATE=55032
這是 DB2 經(jīng)常返回的一個(gè)錯(cuò)誤。不過,如果不是在 AIX 服務(wù)器上,而是在 UNIX 服務(wù)器上,那么這就很可能與內(nèi)存資源問題有關(guān)。特別地,可能是內(nèi)核參數(shù)沒有進(jìn)行適當(dāng)?shù)恼{(diào)優(yōu)。
為解決這個(gè)問題,可以適當(dāng)?shù)嘏渲脙?nèi)核參數(shù)。設(shè)置:
shmsys:shminfo_shmmax = 15099494 (~90% of 16GB)
例 2 考慮如下配置: (所有頁的大小都為 4K)
服務(wù)器上的物理 RAM 是 1 GB。
數(shù)據(jù)庫 A:
IBMDEFAULTBP 137,500 頁
INTRA_PARALLEL ON
UTILHEAP 10,000 頁
DBHEAP 10,000 頁
SHEAPTHRES_SHR 20,000 頁
LOCKLIST 1000 頁
PCKCACHE 5000 頁
CATALOGCACHE 2500 頁
APPGROUP_MEM_SZ 20,000 頁
數(shù)據(jù)庫 B:
IBMDEFAULTBP 92,500 頁
INTRA_PARALLEL ON
UTILHEAP 5,000 頁
DBHEAP 10,000 頁
SHEAPTHRES_SHR 15,000 頁
LOCKLIST 1000 頁
PCKCACHE 5000 頁
CATALOGCACHE 2500 頁
APPGROUP_MEM_SZ 20,000 頁
限制: 因?yàn)楣蚕韮?nèi)存是固定到物理 RAM 的,所以這種內(nèi)存不會(huì)被換出。因此,我們只能分配最多 1GB (可用的物理 RAM)的共享內(nèi)存給數(shù)據(jù)庫使用。
計(jì)算:
數(shù)據(jù)庫 A 共享內(nèi)存 = (186,000 頁 x 4KB/頁) x 1.1% = ~818MB
數(shù)據(jù)庫 A 應(yīng)用程序組內(nèi)存 = 20,000 頁 x 4KB/頁 = 80MB
數(shù)據(jù)庫 B 共享內(nèi)存 = (131,000 頁 x 4KB/頁) x 1.1% = ~576MB
數(shù)據(jù)庫 B 應(yīng)用程序組內(nèi)存 = 20,000 頁 x 4KB/頁 = 80MB
為了啟動(dòng)數(shù)據(jù)庫 A,要求: 818MB + 80MB = ~898MB
為了啟動(dòng)數(shù)據(jù)庫 B,要求: 576MB + 80MB = ~656MB
問題: 假設(shè)數(shù)據(jù)庫 A 是激活的。至少有 898MB 的共享內(nèi)存固定在物理 RAM 中。當(dāng)嘗試激活數(shù)據(jù)庫 B 時(shí),就會(huì)碰到如下錯(cuò)誤消息:
SQL1084C Shared memory segments cannot be allocated. SQLSTATE=57019
如果同時(shí)啟動(dòng)數(shù)據(jù)庫 A 和數(shù)據(jù)庫 B,我們將請(qǐng)求至少 1.55GB (898MB + 656MB) 的可用物理 RAM,以便同樣地將共享內(nèi)存固定在 RAM 中。顯然,1GB 的 RAM 不夠。為解決這一問題:
嘗試減少這兩個(gè)數(shù)據(jù)庫的緩沖池大小;蛘
嘗試減少應(yīng)用程序組內(nèi)存;蛘
更可能的是,增加更多的物理 RAM。在這種情況下,您將需要至少 1.55GB 的物理 RAM,才能同時(shí)啟動(dòng)這兩個(gè)數(shù)據(jù)庫。
在這種情況下,按照上面的數(shù)據(jù)庫配置參數(shù),在任何時(shí)刻啟動(dòng)某一個(gè)數(shù)據(jù)庫(數(shù)據(jù)庫 A 或數(shù)據(jù)庫 B)是可行的,但是不能同時(shí)啟動(dòng)兩個(gè)數(shù)據(jù)庫。這是必須增加更多的物理 RAM。
這個(gè)問題在 AIX 中不會(huì)出現(xiàn),因?yàn)樵?AIX 中共享內(nèi)存沒有固定在物理 RAM 中。在這種場(chǎng)景中,可以啟動(dòng)數(shù)據(jù)庫 B。但是,這意味著數(shù)據(jù)庫 A 的數(shù)據(jù)庫內(nèi)存必須調(diào)出。當(dāng)一個(gè)應(yīng)用程序訪問數(shù)據(jù)庫 A 時(shí),又得將數(shù)據(jù)庫 B 的數(shù)據(jù)庫內(nèi)存調(diào)出。您可以想象未來要發(fā)生的調(diào)頁次數(shù)有多少。
例 3 考慮如下配置: (所有頁的大小都是 4K)
服務(wù)器:
服務(wù)器上的物理 RAM 16GB
shmsys:shminfo_shmmax = 15099494 (16GB 的 ~90%)
數(shù)據(jù)庫:
IBMDEFAULTBP 350,000 頁
UTILHEAP 17,500 頁
DBHEAP 10,000 頁
LOCKLIST 1000 頁
PCKCACHE 5000 頁
CATALOGCACHE 2500 頁
ESTORE_SEG_SZ = 400000 頁
NUM_ESTORE_SEGS = 1
計(jì)算:
數(shù)據(jù)庫共享內(nèi)存 = (386,000 頁 x 4KB/頁 + 400,000 頁的 estore * 100 字節(jié)) x 1.1 = ~1.66GB
ESTORE memory = 400000 x 4KB = 1.6GB
問題: 數(shù)據(jù)庫共享內(nèi)存是 1.66GB。這個(gè)數(shù)小于 3.35GB 的數(shù)據(jù)庫共享內(nèi)存限制。shmmax 參數(shù)設(shè)置得比較恰當(dāng)。但是在啟動(dòng)數(shù)據(jù)庫時(shí)可能返回下面的錯(cuò)誤消息!您可以在 db2diag.log 中看到如下錯(cuò)誤消息:
2003-12-04-10.10.13.362027 Instance:db2inst1 Node:000
PID:18327(db2agent (SAMPLE) 0) TID:1 Appid:*LOCAL.sample.047844091013
oper system services sqloVLMAttachVLMSegment Probe:20 Database:SAMPLE
sqloVLMAttachVLMSegment - shmat failed
0xFFBE833C : 0x0000000C
shmat 是一個(gè) UNIX 函數(shù),它將與 shmid(另一個(gè) Solaris 函數(shù))所標(biāo)識(shí)的共享內(nèi)存相關(guān)的共享內(nèi)存段附加到調(diào)用進(jìn)程的數(shù)據(jù)段上。shmat 失敗于 0x000000C,即 ENOMEM 或可用數(shù)據(jù)空間不足以容納共享內(nèi)存段。
換句話說,不能激活數(shù)據(jù)庫或連接到數(shù)據(jù)庫,因?yàn)闆]有足夠的共享內(nèi)存來滿足請(qǐng)求。
那么該怎么辦呢?答案在于我們分配 ESTORE 的方式。每個(gè) ESTORE 段必須是一個(gè)連續(xù)的塊。在我們的例子中,我們?cè)噲D為 ESTORE 分配很大的一塊(連續(xù)的)內(nèi)存(1.6GB)。即使有 16GB 的 RAM,它也可能會(huì)被分段,從而沒有一塊連續(xù)的 1.6GB 的內(nèi)存。
為解決這個(gè)問題,在數(shù)據(jù)庫配置文件中像下面這樣設(shè)置 ESTORE 的值:
ESTORE_SEG_SZ = 40000 頁
NUM_ESTORE_SEGS = 10
通過設(shè)置上面的 ESTORE 值,實(shí)際上我們?nèi)匀辉噲D為 ESTORE 分配總共 1.6 GB 的內(nèi)存。然而,我們將嘗試為 ESTORE 分配 10 塊 160MB 的內(nèi)存。這樣分配的連續(xù)空間就要小得多,因此最有可能解決問題。 |
|