【DBQLからCPU使用率をみる】
◆ 私の職場の環境は以下のとおりです
◆ DBQLogTblのみかたです
[以下の2つの時間が計算できます]
経過時間:ElapsedTime = FirstRespTime - StartTime
実行時間:ExecuteTime = FirstRespTime - FirstStepTime (経過時間から待ち時間を除外)
[こっちも計算できます]
CPU使用時間:TotalCPUTime = AMPCPUTime + ParserCPUTime
SQLにするとこんな感じです
◆ ResUsageScpuのみかたです
[以下の2つの時間が計算できます]
退屈な時間:IdleTime = CPUIdle + CPUIoWait
忙しい時間:BusyTime = CPUUServ + CPUUExec
[つまりはこういうことのようです]
CPU使用率:CPUUsage = ( CPUUServ + CPUUExec ) / ( CPUIdle + CPUIoWait + CPUUServ + CPUUExec ) * 100
※分母は理論的にはTotalCPUTimeになるはずですが、微妙に誤差はでるようです
TotalCPUTimeは以下でも計算できます
1秒あたりのTotalCPUTimeはつまるところCPU(コア?)の数なので、
それにNominalSecs(何秒ごとにロギングしてるか)と100(㌢秒換算)をかけてさしあげます
理論的な分母:TotalCPUTime = TotalCPUTimePerSec * NominalSecs * 100
[特定のクエリがどれだけのCPUを占有しているかを平準化した率は、]
1秒間あたりのそのクエリのCPU時間をだして、
( DBQLogTbl.AMPCPUTime + DBQLogTbl.ParserCPUTime ) / DBQLogTbl.ExecuteTime ・・・(A)
1秒間あたりのTotalCPUTimeをだして(単位は秒のまま)、
ResUsageScpu.TotalCPUTimePerSec・・・(B)
(A) / (B) * 100 で割ることのすれば出せそうです
参考にしたリンクです
Main Log Table: DBQLogTbl
Calculating the actual query run time
ResUsageScpu Table - Summary Mode
◆ 私の職場の環境は以下のとおりです
- Teradata 13.10
◆ DBQLogTblのみかたです
カラム | 意訳 | 単位 |
QueryID | クエリごとに発番された内部的なID。system-wideで一意だからほかのテーブルとも(QueryIDだけをキーにして)結合できるよ、とのこと | |
StartTime | クエリがsubmitされたとき | TimeStamp |
FirstStepTime | クエリが最初にdispatchされたとき | TimeStamp |
FirstRespTime | 最初のresponseが返されたとき | TimeStamp |
AMPCPUTime | AMPが使用したCPUの時間 | 秒 |
ParserCPUTime | parserとdispatcherが使用したCPUの時間 | 秒 |
QueryText | SQLの最初の200文字 (全文はDBQLSQLTblに残ってる) |
[以下の2つの時間が計算できます]
経過時間:ElapsedTime = FirstRespTime - StartTime
実行時間:ExecuteTime = FirstRespTime - FirstStepTime (経過時間から待ち時間を除外)
[こっちも計算できます]
CPU使用時間:TotalCPUTime = AMPCPUTime + ParserCPUTime
SQLにするとこんな感じです
select ( FirstRespTime - StartTime HOUR(4) TO SECOND(2) ) as ElapsedTime, ( FirstRespTime - FirstStepTime HOUR(4) TO SECOND(2) ) as ExecuteTime, ( AMPCPUTime + ParserCPUTime ) as TotalCPUTime from DBC.DBQLogTbl where ~ |
◆ ResUsageScpuのみかたです
カラム | 意訳 | 単位 |
TheDate | ログがentryされた日付 | |
TheTime | ログがentryされた時刻 | |
NodeID | nodeのID | |
cpuid | nodeごとのCPUのID | |
NominalSecs | ロギングする間隔 | 秒 |
CPUIdle | idleの時間 | ㌢秒 |
CPUIoWait | idleおよびI/O待ち時間 | ㌢秒 |
CPUUServ | userのservice codeをexecuteしている時間 | ㌢秒 |
CPUUExec | userのexecution codeをexecuteしている時間 | ㌢秒 |
[以下の2つの時間が計算できます]
退屈な時間:IdleTime = CPUIdle + CPUIoWait
忙しい時間:BusyTime = CPUUServ + CPUUExec
[つまりはこういうことのようです]
CPU使用率:CPUUsage = ( CPUUServ + CPUUExec ) / ( CPUIdle + CPUIoWait + CPUUServ + CPUUExec ) * 100
※分母は理論的にはTotalCPUTimeになるはずですが、微妙に誤差はでるようです
TotalCPUTimeは以下でも計算できます
1秒あたりのTotalCPUTimeはつまるところCPU(コア?)の数なので、
select count ( * ) as TotalCPUTimePerSec from ( select NodeID, cpuid from DBC.ResUsageScpu group by NodeID, cpuid ) |
それにNominalSecs(何秒ごとにロギングしてるか)と100(㌢秒換算)をかけてさしあげます
理論的な分母:TotalCPUTime = TotalCPUTimePerSec * NominalSecs * 100
[特定のクエリがどれだけのCPUを占有しているかを平準化した率は、]
1秒間あたりのそのクエリのCPU時間をだして、
( DBQLogTbl.AMPCPUTime + DBQLogTbl.ParserCPUTime ) / DBQLogTbl.ExecuteTime ・・・(A)
1秒間あたりのTotalCPUTimeをだして(単位は秒のまま)、
ResUsageScpu.TotalCPUTimePerSec・・・(B)
(A) / (B) * 100 で割ることのすれば出せそうです
参考にしたリンクです
Main Log Table: DBQLogTbl
Calculating the actual query run time
ResUsageScpu Table - Summary Mode