300 likes | 497 Views
CPU 時間の測定. 2002 年 4 月 22 日 上牧瀬 誠. 目的. 各プロセスごとの CPU 利用時間, I/O 処理時間の測定. プロセス情報収集のコマンド. time 単純コマンドの時間測定. time. 使用方法 time ./pserver 0.02u 0.04s 0:03.25 1.8% ユーザプロセスで消費された CPU 時間 ユーザプロセスに対しカーネルが消費した CPU 時間 コマンドの経過時間 経過時間と総 CPU 消費時間の割合. CPU 時間. 各プロセスで実際に CPU を利用している時間
E N D
CPU時間の測定 2002年4月22日 上牧瀬 誠
目的 • 各プロセスごとのCPU利用時間,I/O処理時間の測定
プロセス情報収集のコマンド • time • 単純コマンドの時間測定
time • 使用方法 • time ./pserver • 0.02u 0.04s 0:03.25 1.8% • ユーザプロセスで消費されたCPU時間 • ユーザプロセスに対しカーネルが消費したCPU時間 • コマンドの経過時間 • 経過時間と総CPU消費時間の割合
CPU時間 • 各プロセスで実際にCPUを利用している時間 • CPU時間=実行命令数×CPI×クロック・サイクル時間 • CPI:1命令あたりのクロックサイクル数
TPC-Cベンチマークのブロック図 pserver tserver ページサーバ トランザクションサーバ トランザクション生成をする トランザクション コーディネータ TPCBenchmark 生成されたトランザクションを 各Execute Elementに振り分ける トランザクションの生成が終わると MQTHの測定を始める Execute Element トランザクションを 実際に処理する Execute Elementの 実行結果を表示する tail • TPCBenchmarkがトランザクション生成すると,トランザクションコーディネータが各Execute Elementにトランザクションを振り分けて, Execute Elementはトランザクションを実行する • しかし最初のうちは,TPC-Cベンチマークはトランザクション生成するだけで,トランザクション生成が終わるまでMQTHの測定を始めない
測定方法 • トランザクション生成からMQTHの測定までのCPU時間の測定 • トランザクション生成が終わるまでのCPU時間の測定 1-2がトランザクション実行中のCPU時間 60秒 トランザクション生成 MQTH測定 2 1
この実験ではMQTHの測定をしている60秒間のCPU時間を求めたいが,直接CPU時間を測定できないこの実験ではMQTHの測定をしている60秒間のCPU時間を求めたいが,直接CPU時間を測定できない • timeはコマンドを入力してから終了するまでのCPU時間を測定する • そこで,トランザクション生成から60秒間のCPU時間の測定をする測定1から,トランザクション生成だけのCPU時間を測定する測定2の時間で引いて,MQTHを測定している60秒間のCPU時間とした
測定環境 ソフトウェア OS:Solaris8 コンパイラ:Forte Developer 6 update 2 ハードウェア CPU:PentiumⅢ1.13GHz メモリ:512M メーカー:Dell モデル:PowerEdge 2500 台数:1台 測定環境 MPL:1 測定時間:1分 Warehouse:1 データベース:hot
pserverのCPU時間 1 2 1-2
tserverのCPU時間 1 2 1-2
トランザクションコーディネータのCPU時間 1 2 1-2
Execute ElementのCPU時間 1 2 1-2
tailのCPU時間 1 2 1-2
TPCBenchmarkのCPU時間 1 2 1-2
CPU利用率の合計 処理の違い 実験1:通常のデータベース処理 実験2:ページロック要求が起きたとき,サーバーでロック獲得を処理をしない 実験3:ページロック要求が起きたとき,サーバーと通信をしない 実験4:メモリプロテクションをリード可能にしておき,ライトロック要求しか起きない 実験5:メモリプロテクションをリード/ライト可能にしておき,ロック要求が起きない
処理の違い(リード) ①リード データベース クライアント データベース処理 ページフォルト処理部 ②ページ フォルト READ ロック部 WRITE ロック部 ⑧OKなら,メモリプロテクションを リード可能に変更 通信部 ③ヒープ番号とページ番号を調べる ④リードかライトかを調べる ⑤リードロック要求 ⑦OK,WAIT, ABORT 通信部 サーバー ページロックマネージャ ロック 獲得部 ロック 解放部 ⑥リードロック獲得処理
処理の違い(ライト) ①ライト データベース クライアント データベース処理 ページフォルト処理部 ②ページ フォルト READ ロック部 WRITE ロック部 ⑧OKなら,メモリプロテクションを リード/ライト可能に変更 通信部 ③ヒープ番号とページ番号を調べる ④リードかライトかを調べる ⑦OK,WAIT, ABORT ⑤ライトロック要求 通信部 サーバー ページロックマネージャ ロック 獲得部 ロック 解放部 ⑥ライトロック獲得処理
処理の違い • 実験1:リード,ライトともに①~⑧を処理する • 実験2:⑥リードロック獲得処理,⑥ライトロック獲得処理が行われない • 実験3:通信が行われず,⑤リードロック要求,⑤ライトロック要求がサーバに出されない,⑤~⑦の処理が行われない • 実験4:メモリプロテクションをリード可能にしておき,リードしても②ページフォルトが起きない,リードでは②~⑧の処理が行われず,ライトでは⑤~⑦の処理が行われない • 実験5:メモリプロテクションをリード/ライト可能にしておき,リードしてもライトしても②ページフォルトは起きない,リード,ライトともに②~⑧の処理が行われない
getrusage • int getrusage(int who, struct rusage *r_usage) struct rusage{ struct timeval ru_utime; 使用されたユーザCPU時間 struct timeval ru_stime; 使用されたシステムCPU時間 long ru_maxrss; 最大常駐セットのサイズ long ru_idrss; 非共有データ総サイズ long ru_minflt; ページ再生数 long ru_majflt; ページフォルト long ru_nswap; スワップ long ru_inblock; ブロック入力操作 long ru_outblock; ブロック出力操作 long ru_msgsnd; 送信済みメッセージ long ru_msgrcv; 受信済みメッセージ long ru_nsignals; 受信済みシグナル long ru_nvcsw; 自発的なコンテキストスイッチ long ru_nivcsw; 非自発的なコンテキストスイッチ } who:RUSAGE_SELFまたはRUSAGE_CHILDRENが入る
ru_utime ユーザモードで処理を実行するのに消費した時間の合計 • ru_stime (1つ以上の) プロセスのためにシステムが処理を実行するのに消費した時間の合計 • ru_maxrss 使用された常駐セットサイズの最大値 (キロバイト単位) • ru_idrss プロセスのデータセグメントに常駐している非共有メモリ量の合計値 • ru_minflt 入出力アクティビティなしにサービスを受けたページフォルトの数。ここで、入出力アクティビティは、再割り当てを待っているページのリストからページフレームを “再生” することで回避される • ru_majflt 入出力アクティビティを必要としたサービスを受けたページフォルトの数 • ru_nswap プロセスがメインメモリから “スワップ” された回数 • ru_inblock ファイルシステムが入力を実行する必要があった回数 • ru_oublock ファイルシステムが出力を実行する必要があった回数 • ru_msgsnd 送信された IPC メッセージの数 • ru_msgrcv 受信した IPC メッセージの数 • ru_nsignals 受信したシグナルの数 • ru_nvcsw タイムスライスが完了する前に、プロセスが自発的にプロセッサを放棄した結果として発生したコンテキストスイッチの回数 (通常はリソースの取得待ちをするため) • ru_nivcsw より高い優先順位プロセスが実行可能になったために、または現在のプロセスがそのタイムスライスを超過したために、結果として発生したコンテキストスイッチの回数
whoの値 • RUSAGE_SELF • 呼び出したプロセスのリソース使用量を要求 • RUSAGE_CHILDREN • 呼び出したプロセスの子プロセスのうち終了して待ち状態にあるプロセスの使用量を要求
getrusage使用の注意 • getrusageはマイクロステート・アカウンティングを有効にしないと正確な値が取り出せない(田村さんからのコメント)
マイクロステート・アカウンティング • ナノ秒単位での測定を行う • Solarisのデフォルト設定では,オーバーヘッドを減らすため無効にしてある • マイクロステート・アカウンティングを有効にするにはprocファイルシステムを操作するコードを書く必要がある
マイクロステート・アカウンティングを有効にするためのコードマイクロステート・アカウンティングを有効にするためのコード • procfs.hをインクルードし,以下のコードをmainプログラムの先頭に書く int control[2]; int cfd; char procname[64]; control[0] = PCSET; control[1] = PR_MSACCT; sprintf(procname, “/proc/%d/ctl”, getpid()); cfd = open(procname, O_WRONLY); write(cdf, control, sizeof(control));
サーバでの処理時間 • リードロック獲得処理,ライトロック獲得処理に対して,10,000回測定を行った平均 リードロック獲得処理1回のコスト ユーザCPU時間 15.6μsec リードロック獲得処理1回のコスト システムCPU時間 19.0μsec ライトロック獲得処理1回のコスト ユーザCPU時間 33.3μsec ライトロック獲得処理1回のコスト システムCPU時間 22.4μsec
リードロックにかかるCPU時間 • 447819×(15.6+19.0)=15.49(sec) • ライトロックにかかるCPU時間 • 136803×(33.3+22.4)=7.62(sec)