溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用DB2 UDB的電子商務(wù)OLTP應(yīng)用程序進(jìn)行性能優(yōu)化

發(fā)布時(shí)間:2021-09-23 14:52:02 來源:億速云 閱讀:105 作者:小新 欄目:數(shù)據(jù)庫(kù)

這篇文章給大家分享的是有關(guān)如何使用DB2 UDB的電子商務(wù)OLTP應(yīng)用程序進(jìn)行性能優(yōu)化的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

  一、 監(jiān)視開關(guān)

  確保已經(jīng)打開監(jiān)視開關(guān)。如果它們沒有打開,您將無法獲取您需要的性能信息。要打開該監(jiān)視開關(guān),請(qǐng)發(fā)出以下命令:

  db2 "update monitor switches using

  lock ON sort ON bufferpool ON uow ON

  table ON statement ON"

  二、代理程序

  確保有足夠的 DB2 代理程序來處理工作負(fù)載。要找出代理程序的信息,請(qǐng)發(fā)出命令:

  db2 "get snapshot for database manager"

  并查找以下行:

  High water mark for agents registered = 7

  High water mark for agents waiting for a token = 0

  Agents registered= 7

  Agents waiting for a token= 0

  Idle agents= 5

  Agents assigned from pool= 158

  Agents created from empty Pool = 7

  Agents stolen from another application= 0

  High water mark for coordinating agents= 7

  Max agents overflow= 0

  如 果您發(fā)現(xiàn)Agents waiting for a token或Agents stolen from another application不為 0,那么請(qǐng)?jiān)黾訉?duì)數(shù)據(jù)庫(kù)管理器可用的代理程序數(shù)(MAXAGENTS 和/或 MAX_COORDAGENTS取適用者)。

  三、最大打開的文件數(shù)

  DB2 在操作系統(tǒng)資源的約束下盡量做一個(gè)“優(yōu)秀公民”。它的一個(gè)“優(yōu)秀公民”的行動(dòng)就是給在任何時(shí)刻打開文件的最大數(shù)設(shè)置一個(gè)上限。數(shù)據(jù)庫(kù)配置參數(shù) MAXFILOP約束 DB2 能夠同時(shí)打開的文件最大數(shù)量。當(dāng)打開的文件數(shù)達(dá)到此數(shù)量時(shí),DB2 將開始不斷地關(guān)閉和打開它的表空間文件(包括裸設(shè)備)。不斷地打開和關(guān)閉文件減緩了 SQL 響應(yīng)時(shí)間并耗費(fèi)了 CPU 周期。要查明 DB2 是否正在關(guān)閉文件,請(qǐng)發(fā)出以下命令:

  db2 "get snapshot for database on DBNAME"

  并查找以下的行:

  Database files closed = 0

  如果上述參數(shù)的值不為 0,那么增加MAXFILOP的值直到不斷打開和關(guān)閉文件的狀態(tài)停埂。

  db2 "update db cfg for DBNAME using MAXFILOP N"

  四、鎖

  LOCKTIMEOUT 的缺省值是 -1,這意味著將沒有鎖超時(shí)(對(duì) OLTP 應(yīng)用程序,這種情況可能會(huì)是災(zāi)難性的)。盡管如此,我還是經(jīng)常發(fā)現(xiàn)許多 DB2 用戶用LOCKTIMEOUT= -1。將LOCKTIMEOUT設(shè)置為很短的時(shí)間值,例如 10 或 15 秒。在鎖上等待過長(zhǎng)時(shí)間會(huì)在鎖上產(chǎn)生雪崩效應(yīng)。

  首先,用以下命令檢查L(zhǎng)OCKTIMEOUT的值:

  db2 "get db cfg for DBNAME"

  并查找包含以下文本的行:

  Lock timeout (sec) (LOCKTIMEOUT) = -1

  如果值是 -1,考慮使用以下命令將它更改為 15 秒(一定要首先詢問應(yīng)用程序開發(fā)者或您的供應(yīng)商以確保應(yīng)用程序能夠處理鎖超時(shí)):

  db2 "update db cfg for DBNAME using LOCKTIMEOUT 15"

  您同時(shí)應(yīng)該監(jiān)視鎖等待的數(shù)量、鎖等待時(shí)間和正在使用鎖列表內(nèi)存(lock list memory)的量。請(qǐng)發(fā)出以下命令:

  db2 "get snapshot for database on DBNAME"

  查找以下行:

  Locks held currently= 0

  Lock waits= 0

  Time database waited on locks (ms)= 0

  Lock list memory in use (Bytes)= 576

  Deadlocks detected= 0

  Lock escalations= 0

  Exclusive lock escalations= 0

  Agents currently waiting on locks= 0

  Lock Timeouts= 0

  如果Lock list memory in use (Bytes)超過所定義LOCKLIST大小的 50%,那么在LOCKLIST數(shù)據(jù)庫(kù)配置中增加 4k 頁(yè)的數(shù)量。

  怎么使用 DB2 UDB 的電子商務(wù) OLTP 應(yīng)用程序進(jìn)行性能優(yōu)化

  五、臨時(shí)表空間

  為了改善 DB2 執(zhí)行并行 I/O 和提高使用TEMPSPACE的排序、散列連接(hash join)和其它數(shù)據(jù)庫(kù)操作的性能,臨時(shí)表空間至少應(yīng)該在三個(gè)不同的磁盤驅(qū)動(dòng)器上擁有三個(gè)容器。

  要想知道您的臨時(shí)表空間具有多少容器,請(qǐng)發(fā)出以下命令:

  db2 "list tablespaces show detail"

  查找與以下示例類似的TEMPSPACE表空間定義:

  Tablespace ID= 1

  Name= TEMPSPACE1

  Type= System managed space

  Contents= Temporary data

  State= 0x0000

  Detailed explanation: Normal

  Total pages= 1

  Useable pages= 1

  Used pages= 1

  Free pages= Not applicable

  High water mark (pages)= Not applicable

  Page size (bytes)= 4096

  Extent size (pages)= 32

  Prefetch size (pages)= 96

  Number of containers= 3

  注意Number of containers的值是 3,而且Prefetch size是Extent size的三倍。為了得到最佳的并行 I/O 性能,重要的是Prefetch size為Extent size的倍數(shù)。這個(gè)倍數(shù)應(yīng)該等于容器的個(gè)數(shù)。

  要查找容器的定義,請(qǐng)發(fā)出以下命令:

  db2 "list tablespace containers for 1 show detail"

  指的是tablespace ID #1,它是剛才所給出的示例中的TEMPSPACE1。

  六、內(nèi)存排序

  OLTP 應(yīng)用程序不應(yīng)該執(zhí)行大的排序。它們?cè)?CPU、I/O 和所用時(shí)間方面的成本極高,而且將使任何 OLTP 應(yīng)用程序慢下來。因此,256 個(gè) 4K 頁(yè)(1MB)的缺省SORTHEAP大小(1MB)應(yīng)該是足夠了。您也應(yīng)該知道排序溢出的數(shù)量和每個(gè)事務(wù)的排序數(shù)。

  請(qǐng)發(fā)出以下命令:

  Db2 "get snapshot for database on DBNAME"

  并查找以下行:

  Total sort heap allocated= 0

  2 Total sorts = 1

  3 Total sort time (ms)= 8

  4 Sort overflows = 0

  5 Active sorts = 0

  6 Commit statements attempted = 3

  7 Rollback statements attempted = 0

  8 Let transactions = Commit statements attempted + Rollback

  9 statements attempted

  10 Let SortsPerTX= Total sorts / transactions

  11 Let PercentSortOverflows = Sort overflows * 100 / Total sorts

  如 果PercentSortOverflows ((Sort overflows * 100) / Total sorts )大于 3 個(gè)百分點(diǎn),那么在應(yīng)用程序 SQL 中會(huì)出現(xiàn)嚴(yán)重的或意外的排序問題。因?yàn)檎且绯龅拇嬖诒砻靼l(fā)生了大的排序,所以理想的情況是發(fā)現(xiàn)沒有排序溢出或至少其百分比小于一個(gè)百分點(diǎn)。

  如果出現(xiàn)過多的排序溢出,那么“應(yīng)急”解決方案是增加SORTHEAP的大小。然而,這樣做只是掩蓋了真實(shí)的性能問題。相反,您應(yīng)該確定引起排序的 SQL 并更改該 SQL、索引或群集來避免或減少排序開銷。

  如 果SortsPerTX大于 5 (作為一種經(jīng)驗(yàn)之談),那么每個(gè)事務(wù)的排序數(shù)可能很大。雖然某些應(yīng)用程序事務(wù)執(zhí)行許多小的組合排序(它們不會(huì)溢出并且執(zhí)行時(shí)間很短),但是它消耗了過多的 CPU。當(dāng)SortsPerTX很大時(shí),按我的經(jīng)驗(yàn),這些機(jī)器通常會(huì)受到 CPU 的限制。確定引起排序的 SQL 并改進(jìn)存取方案(通過索引、群集或更改 SQL)對(duì)提高事務(wù)吞吐率是極為重要的。

  七、表訪問

  對(duì)于每個(gè)表,確定 DB2 為每個(gè)事務(wù)讀取的行數(shù)。您必須發(fā)出兩個(gè)命令:

  1 db2 "get snapshot for database on DBNAME"

  2 db2 "get snapshot for tables on DBNAME"

  在發(fā)出第一個(gè)命令以后,確定發(fā)生了多少個(gè)事務(wù)(通過取Commit statements attempted和Rollback statements attempted之和 - 請(qǐng)參閱 技巧 3)。

  在 發(fā)出第二個(gè)命令以后,將讀取的行數(shù)除以事務(wù)數(shù)(RowsPerTX)。在每個(gè)事務(wù)中,OLTP 應(yīng)用程序通常應(yīng)該從每個(gè)表讀取 1 到 20 行。如果您發(fā)現(xiàn)對(duì)每個(gè)事務(wù)有成百上千的行正被讀取,那么發(fā)生了掃描操作,也許需要?jiǎng)?chuàng)建索引。(有時(shí)以分布和詳細(xì)的索引來運(yùn)行 runstats 也可提供了一個(gè)解決的辦法。)

  “get snapshot for tables on DBNAME”的樣本輸出如下:

  Snapshot timestamp = 09-25-2000

  4:47:09.970811

  Database name= DGIDB

  Database path= /fs/inst1/inst1/NODE0000/SQL00001/

  Input database alias= DGIDB

  Number of accessed tables= 8

  Table List

  Table Schema= INST1

  Table Name= DGI_

  SALES_ LOGS_TB

  Table Type= User

  Rows Written= 0

  Rows Read= 98857

  Overflows= 0

  Page Reorgs= 0

  Overflows 的數(shù)量很大就可能意味著您需要重組表。當(dāng)由于更改了行的寬度從而 DB2 必須在一個(gè)不夠理想的頁(yè)上定位一個(gè)行時(shí)就會(huì)發(fā)生溢出。

感謝各位的閱讀!關(guān)于“如何使用DB2 UDB的電子商務(wù)OLTP應(yīng)用程序進(jìn)行性能優(yōu)化”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI