記事
Megumi Kakechi · 2021年2月15日 6m read

データベースキャッシュおよびルーチンキャッシュの最適値の設定方法

これは InterSystems FAQ サイトの記事です。
 

データベースキャッシュおよびルーチンキャッシュをモニターし、最適値を調べる方法をご紹介します。
 

(1) データベースキャッシュ

現状の設定値で問題ないかは、^GLOSTAT ユーティリティ のCache Efficency値(キャッシュ効率)でモニターします。

Cache Efficiency 値は大きければ大きいほど良いですが、目安として100 以上であれば、設定サイズは問題ありません。

実行例)

%SYS>do ^GLOSTAT
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ユーティリティがあります。

実行例)

%SYS>do ^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?1Set Day=0_Day
   Set Year=+$Piece(%DAT," ",3) If Year?2Set Year=2000+Year
   Set Month=$Find("JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC",MonthName)\3 If Month?1Set 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?1Set Hour=0_Hour
   If Minutes?1Set Minutes=0_Minutes
   Set Sec=$P($ZDATETIME($H,,1),":",3)
   Quit Hour_Minutes_Sec
}


ルーチンの以下の箇所を環境に合わせて変更してください。

Set logdir="C:\Intersystems\cache\mgr\" //ログファイルディレクトリ


実行例)

%SYS>Do ^ZGLOBUFREPORT


添付ファイル(GLOBUF_ROUBUF.pdf:P.1~2)が出力ファイルの例になります。


(2) ルーチンキャッシュ

現状の設定値で問題ないかは、^GLOSTAT ユーティリティの Routine buffer loads and saves 値(ルーチンのデータベースへのI/O数)でモニターします。

60秒間の集計で20以下であれば、設定サイズは、問題ありません。

実行例)

%SYS>d ^GLOSTAT
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?1Set Day=0_Day
   Set Year=+$Piece(%DAT," ",3) If Year?2Set Year=2000+Year
   Set Month=$Find("JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC",MonthName)\3 If Month?1Set 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?1Set Hour=0_Hour
   If Minutes?1Set Minutes=0_Minutes
   Set Sec=$P($ZDATETIME($H,,1),":",3)
   Quit Hour_Minutes_Sec
}


ルーチンの以下の箇所を環境に合わせて変更してください。

Set logdir="C:\Intersystems\cache\mgr\" //ログファイルディレクトリ


実行例)

%SYS>Do ^ZROUBUFREPORT


添付ファイル(GLOBUF_ROUBUF.pdf:P.3~)が出力ファイルの例になります。

00
0 0 0 14