データベースキャッシュおよびルーチンキャッシュの最適値の設定方法
これは InterSystems FAQ サイトの記事です。
データベースキャッシュおよびルーチンキャッシュをモニターし、最適値を調べる方法をご紹介します。
(1) データベースキャッシュ
現状の設定値で問題ないかは、^GLOSTAT ユーティリティ のCache Efficency値(キャッシュ効率)でモニターします。
Cache Efficiency 値は大きければ大きいほど良いですが、目安として100 以上であれば、設定サイズは問題ありません。
実行例)
Should detailed statistics be displayed for each block type? No =>
Statistics Local Remote Total
------------------------- ----------- ------------- -------------
Global references (all): 207,538 0 207,538
(略)
Cache Efficiency: 134 no gets <--- この値
(略)
Continue (c), zero statistics (z), timed stats (# sec > 0), quit?
こちらの値は、管理ポータルのシステムダッシュボードでも参照可能です。
[システムオペレーション] > [システムダッシュボード]
また、グローバル変数毎のデータベースバッファの使用量を確認できる ^GLOBUFFユーティリティがあります。
実行例)
Find which globals are using the most buffers.
Display the top <25>:
Total buffers: 19584 Buffers in use:4412
Item Global Database Percentage (Count)
1 rOBJ CACHELIB 24.320 (1073)
2 rOBJ CACHESYS 16.772 (740)
3 perf.TestD PERF 13.101 (578)
(略)
^GLOSTAT と ^GBLBUFF の結果をファイルに出力するものを用意しています。
以下のルーチン(ZGLOBUFREPORT.mac)を %SYS に作成します。
/// ZGLOBUFREPORT.mac
Set logdir="C:\Intersystems\cache\mgr\" //ログファイルディレクトリ
Set HostName=$ZUtil(54,0)
Set Date=$$CurDate,Time=$$CurTime
Set File=logdir_"GLOBUF"_HostName_Date_Time_".log"
Open File:"WNS"
Use File
Do GLOSTAT
Do display^GLOBUFF(50) // 上位50グローバル
Close File
Quit
GLOSTAT
New
Set client=$D(^NET(2,$P($ZU(86),"*",2),"DV","ECPNET1"))
Set dskbase=$ZU(40,2,86) ;zero -> no detailed disk stats
Set jrnbase=$ZU(40,2,94),xjwrites=0,xjents=1
Set ecpcstat=$ZU(40,2,148)
Set detail=0
Do static^GLOSTAT
Set act=60 Do timing^GLOSTAT
Quit
CurDate() {
Do INT^%D
Set %DAT=$ZConvert(%DAT,"U")
Set MonthName=$Extract(%DAT,1,3)
Set Day=+$Piece(%DAT," ",2) If Day?1n Set Day=0_Day
Set Year=+$Piece(%DAT," ",3) If Year?2n Set Year=2000+Year
Set Month=$Find("JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC",MonthName)\3 If Month?1n Set Month=0_Month
Quit Year_Month_Day
}
CurTime() {
Do INT^%T
Set %TIM=$ZConvert(%TIM,"U")
For Quit:%TIM'?1" ".e Set %TIM=$Extract(%TIM,2,99999)
Set Time=$Piece(%TIM," ",1),AMPM=$Piece(%TIM," ",2)
Set Hour=+$Piece(Time,":",1),Minutes=+$Piece(Time,":",2)
If AMPM="AM",Hour=12 Set Hour=0
If AMPM="PM",Hour'=12 Set Hour=Hour+12
If Hour?1n Set Hour=0_Hour
If Minutes?1n Set Minutes=0_Minutes
Set Sec=$P($ZDATETIME($H,,1),":",3)
Quit Hour_Minutes_Sec
}
ルーチンの以下の箇所を環境に合わせて変更してください。
Set logdir="C:\Intersystems\cache\mgr\" //ログファイルディレクトリ
実行例)
添付ファイル(GLOBUF_ROUBUF.pdf:P.1~2)が出力ファイルの例になります。
(2) ルーチンキャッシュ
現状の設定値で問題ないかは、^GLOSTAT ユーティリティの Routine buffer loads and saves 値(ルーチンのデータベースへのI/O数)でモニターします。
60秒間の集計で20以下であれば、設定サイズは、問題ありません。
実行例)
Should detailed statistics be displayed for each block type? No =>
Statistics Local Remote Total
-------------------------- ------------- ------------- -------------
Global references (all): 479,434 0 479,434
(略)
Continue (c), zero statistics (z), timed stats (# sec > 0), quit? 60
Counts per Second for 60 Seconds...
Should detailed statistics be displayed for each block type? No =>
Statistics Local Remote Total
-------------------------- ------------- ------------- -------------
=>Routine buffer loads and saves: 12 0 12
ルーチンキャッシュの使用状況をファイルに出力するものを用意しています。
以下のルーチン(ZGLOBUFREPORT.mac)を、%SYSに作成します。
/// ZROUBUFREPORT.MAC Set logdir="C:\Intersystems\cache\mgr\" //ログファイルディレクトリ Set HostName=$ZUtil(54,0) Set Date=$$CurDate,Time=$$CurTime Set File=logdir_"ROUBUF"_HostName_Date_Time_".log" Do CSTATR1 Quit CSTATR1 Set Instdir=$P($G(^%SYS("bindir")),"bin\") Set BinDir=Instdir_"BIN\" Set MgrDir=Instdir_"MGR" Set cstatSwitches="-a0 -R1 -s"_MgrDir Set Cmd=BinDir_"cstat" Set Cmd=Cmd_" "_cstatSwitches_" > "_File Set x=$ZF(-1,Cmd) Quit CurDate() { Do INT^%D Set %DAT=$ZConvert(%DAT,"U") Set MonthName=$Extract(%DAT,1,3) Set Day=+$Piece(%DAT," ",2) If Day?1n Set Day=0_Day Set Year=+$Piece(%DAT," ",3) If Year?2n Set Year=2000+Year Set Month=$Find("JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC",MonthName)\3 If Month?1n Set Month=0_Month Quit Year_Month_Day } CurTime() { Do INT^%T Set %TIM=$ZConvert(%TIM,"U") For Quit:%TIM'?1" ".e Set %TIM=$Extract(%TIM,2,99999) Set Time=$Piece(%TIM," ",1),AMPM=$Piece(%TIM," ",2) Set Hour=+$Piece(Time,":",1),Minutes=+$Piece(Time,":",2) If AMPM="AM",Hour=12 Set Hour=0 If AMPM="PM",Hour'=12 Set Hour=Hour+12 If Hour?1n Set Hour=0_Hour If Minutes?1n Set Minutes=0_Minutes Set Sec=$P($ZDATETIME($H,,1),":",3) Quit Hour_Minutes_Sec }
ルーチンの以下の箇所を環境に合わせて変更してください。
Set logdir="C:\Intersystems\cache\mgr\" //ログファイルディレクトリ
実行例)
添付ファイル(GLOBUF_ROUBUF.pdf:P.3~)が出力ファイルの例になります。