通常プログラムがどの程度CPUを消費したのかはソース等から予測したり計算することはできません。statspackのように特定のタイミングでの差分からSQLやセッション単位のCPU使用時間を求めているようです。Linuxでの検証Linuxではstraceコマンドによりシステムコールをトレースすることができますのでシステムコールの戻り値と実際にORACLEが表示するCPU使用時間とシステムコールの結果を比較してみます。aixやsolarisではtruss、HP-UXではtuscといったコマンドでシステムコールをトレースすることができます・straceを仕掛けてsqlを実行する以下のようにローカル接続のsqlplusに対してstraceを仕掛けます。-Fオプションを付与しています。Listener経由の接続の場合専用サーバプロセスがforkされるのはsqlplus等のクライアントからではなくリスナーからforkされるのでListener経由での接続をトレースする場合は-pオプションによりプロセス指定をしてトレースします。test/test続いて、CPUを使用するため以下のコマンドを何回か実行します。dba_source;・ORACLEのCPU使用時間を確認する以下のコマンドによりセッション統計のCPU使用時間を確認してみます。sessionが該当セッションが使用したCPU時間で単位はセンチ秒であるため以下の例では10.53秒のCPUを使用したことがわかります。1・straceの結果確認straceで出力したstrace.logを確認するとSQL実行回数が数十回程度だったのに対してgetrusageは数千回コールされている様子が確認できます。パースのCPU時間、SQLの使用時間、SQLの実行が終わった段階のCPU使用時間等、様々な単位でCPU時間を記録しているものと予想されます。ユーザ時間とシステム時間の合計がORACLEの表示である10.53秒と非常に近い値となっていることが確認できます。・CPU使用時間自体は正しい値ですが、その他の時間関連の統計と同じように考えるとつじつまが合わなくなる可能性が考えられます。実際にはI/Oは発生せずファイルキャッシュ上のメモリからデータを読み込むとシステムCPU使用時間が増えると思われるためCPU使用時間+I/O時間が処理時間を超えるケースが発生しそうな気がします。(未確認)・CPU使用時間はCPU使用率ではありません。I/O時間等が発生すればその間CPUは未使用の状態になるためCPU使用率50%で20秒間かかっている可能性もあります。・複数CPUコアを搭載しているサーバではCPU使用時間は1秒間に1秒以上増加する場合があります。パラレルや並列でSQLを流すと1秒間にCPU時間は1秒以上増加する場合があります。本サイトはリンクフリーです。本サイトの情報により発生した問題等については一切責任を負えません。管理人への連絡はftpsaba0123@hotmail.comまでどうぞ。