Test "fix: Bug for getrusage" on arm64

The following test set:
  fix: Bug for getrusage return incorrect ru_maxrss
  fix: Bug for getrusage(RUSAGE_CHILDREN) return parent info (POSTK_DEBUG_TEMP_FIX_72)
  fix: Bug for getrusage often return incorrect ru_stime

Change-Id: I6734b1e34565d5d2715f9901a04ba5b6f0278032
Refs: #1032
Refs: #1033
Refs: #1034
This commit is contained in:
Shiratori, Takehiro
2018-12-04 17:16:51 +09:00
committed by Masamichi Takagi
parent a11d4d7a9d
commit ec844bb6e3
37 changed files with 1746 additions and 0 deletions

View File

@ -0,0 +1,229 @@
/* README COPYRIGHT FUJITSU LIMITED 2018 */
getrusage()の最大メモリ消費量および時間計測機能テストセットREADME
(1) テストの実行方法
以下の手順でテストを実行する
1. $HOME/.mck_test_configを用意する
当該ファイルは、McKernelをビルドした際に生成されるmck_test_config.sample ファイルを
$HOMEにコピーし、適宜編集する
2. Makefileの変数KERN_DIRの内容を、必要に応じてカーネルソースのあるディレクトリに変更する
デフォルトでは/usr/src/kernels/`uname -r`/を設定
3. make test を実行する
(2) テスト項目詳細
1. 下記Issueで報告されたテストプログラムによる確認
Issue#1032 (https://postpeta.pccluster.org/redmine/issues/1032)
Issue#1033 (https://postpeta.pccluster.org/redmine/issues/1033)
Issue#1034 (https://postpeta.pccluster.org/redmine/issues/1034)
ISSUE01
getrusage(RUSAGE_SELF)で正しい情報が取得できること
ru_utime,ru_stime,ru_maxrssについて、それぞれ以下の近似値が
取得出来る事を確認する
ru_utime 2秒 程度
ru_stime 2秒 程度
ru_maxrss22MiB 程度
ISSUE02
getrusage(RUSAGE_CHILDREN)で正しい情報が取得できること
ru_utime,ru_stime,ru_maxrssについて、それぞれ以下の近似値が
取得出来る事を確認する
ru_utime 2秒 程度
ru_stime 2秒 程度
ru_maxrss22MiB 程度
ISSUE03
getrusage(RUSAGE_THREAD)で正しい情報が取得できること
ru_utime,ru_stime,ru_maxrssについて、それぞれ以下の近似値が
取得出来る事を確認する
ru_utime 2秒 程度
ru_stime 4秒 程度
ru_maxrss30MiB 程度
2. McKernelでのgetrusage()の基本動作確認
CT_001: 単一プロセスでのRUSAGE_SELFの utime, stime計測動作
観点自プロセスのutime, stime計測を確認する
1. getrusage(RUSAGE_SELF) を実行し、以下を確認
- utimeの値が 0 < utime < 0.1 (秒)
- stimeの値が 0 < stime < 0.1 (秒)
2. 2秒程度かかる処理をユーザモードで実行
3. getrusage(RUSAGE_SELF) を実行し、以下を確認
- utimeの増分が 2秒程度
- stimeの増分が 0.1秒未満
4. 1秒程度かかる処理をカーネルモードで実行
- utimeの増分が 0.1秒未満
- stimeの増分が 1秒程度
CT_002: 単一プロセスでのRUSAGE_SELF のmaxrss計測
観点自プロセスのmaxrss計測を確認する
1. getrusage(RUSAGE_SELF) を実行し、以下を確認
- maxrssの値が 0より大きい
2. mmap()で12Mバイトの領域を確保し、全体に書き込み処理を実施
3. getrusage(RUSAGE_SELF) を実行し、以下を確認
- maxrssの値が 12Mバイト以上
4. 確保した領域(12Mバイト)をmunmap()で解放
5. getrusage(RUSAGE_SELF) を実行し、以下を確認
- maxrssの値が 前回と同じ
6. mmap()で16Mバイトの領域を確保し、全体に書き込み処理を実施
7. getrusage(RUSAGE_SELF) を実行し、以下を確認
- maxrssの増分が 4Mバイト程度
8. 確保した領域(16Mバイト)をmunmap()で解放
CT_003: サブスレッド作成時のRUSAGE_SELF のutime, stime計測
観点サブスレッドの動作がutime, stimeに加算されることを確認する
1. getrusage(RUSAGE_SELF) を実行し、以下を確認
- utimeの値が 0 < utime < 0.1 (秒)
- stimeの値が 0 < stime < 0.1 (秒)
2. pthread_create()でサブスレッドを作成する
3. メインスレッドが、pthread_join()でサブスレッドの終了を待つ
3.1. サブスレッドが、2秒程度かかる処理をユーザモードで実行
3.2. サブスレッドが、1秒程度かかる処理をカーネルモードで実行
3.3. サブスレッドが、終了する
4. メインスレッドがgetrusage(RUSAGE_SELF) を実行し、以下を確認
- utimeの増分が 2秒程度 (サブスレッド増分2秒)
- stimeの増分が 4秒程度 (サブスレッド増分1秒、メインスレッドjoin待ち3秒)
※ Linuxではjoin待ち中は他タスクへとスイッチされてシステム時間が加算されないため、
Linuxでの実行時、本項目はFAILとなる
CT_004: サブスレッド作成時のRUSAGE_SELF のmaxrss計測
観点サブスレッドの動作がmaxrssに加算されることを確認する
1. getrusage(RUSAGE_SELF) を実行し、以下を確認
- maxrssの値が 0より大きい
2. pthread_create()でサブスレッドを作成する
3. メインスレッドが、pthread_join()でサブスレッドの終了を待つ
3.1. サブスレッドが、mmap()で16Mバイトの領域を確保し、全体に書き込み処理を実施
3.2. サブスレッドが、確保した領域(16Mバイト)をmunmap()で解放
3.3. サブスレッドが、終了する
4. メインスレッドがgetrusage(RUSAGE_SELF) を実行し、以下を確認
- maxrssの値が 16Mバイト以上
CT_005: 子プロセス作成時のRUSAGE_SELF のutime, stime, maxrss計測
観点子プロセスのutime, stime, maxrssが加算されないことを確認する
1. getrusage(RUSAGE_SELF) を実行し、以下を確認
- utimeの値が 0 < utime < 0.1 (秒)
- stimeの値が 0 < stime < 0.1 (秒)
- maxrssの値が 0より大きい
2. fork()で子プロセスを作成する
3. 親プロセスが、3秒程度かかる処理をユーザモードで実行
3.1. 子プロセスが、1秒程度かかる処理をユーザモードで実行
3.2. 子プロセスが、1秒程度かかる処理をカーネルモードで実行
3.3. 子プロセスが、16Mバイトの領域の確保、書き込み、解放処理を実施
3.4. 子プロセスが終了する
4. 親プロセスがwaitpid()で子プロセスの終了を回収する
5. getrusage(RUSAGE_SELF) を実行し、以下を確認
- utimeの増分が 3秒程度
- stimeの増分が 0.1秒未満
- maxrssの値が 16Mバイト未満
CT_006: 子プロセス作成時のRUSAGE_CHILDREN のutime, stime計測
観点子プロセスのutime, stimeのみが計測されていることを確認する
1. getrusage(RUSAGE_CHILDREN) を実行し、以下を確認
- utimeの値が 0
- stimeの値が 0
2. fork()で子プロセスを作成する
3. 親プロセスが、1秒程度かかる処理をユーザモードで実行
3.1. 子プロセスが、2秒程度かかる処理をユーザモードで実行
4. 親プロセスがgetrusage(RUSAGE_CHILDREN)を実行し、以下を確認
- utimeの値が 0 (子プロセスがまだ終了していないため)
- stimeの値が 0
5. 親プロセスがwaitpid()で子プロセスの終了を待つ
5.1. 子プロセスが、1秒程度かかる処理をカーネルモードで実行
5.2. 子プロセスが終了する
6. 親プロセスがgetrusage(RUSAGE_CHILDREN)を実行し、以下を確認
- utimeの増分が 2秒程度
- stimeの増分が 1秒程度
CT_007: 子プロセス作成時のRUSAGE_CHILDREN のmaxrss計測
観点子プロセスのmaxrssのみが計測されていることを確認する
1. getrusage(RUSAGE_CHILDREN) を実行し、以下を確認
- maxrssの値が 0
2. fork()で子プロセスを作成する
3. 親プロセスが、32Mバイトの領域の確保、書き込み、解放処理を実施
4. 親プロセスがwaitpid()で子プロセスの終了を待つ
4.1. 子プロセスが、1秒程度かかる処理をユーザモードで実行
4.2. 子プロセスが、16Mバイトの領域の確保、書き込み、解放処理を実施
4.3. 子プロセスが終了する
5. 親プロセスがgetrusage(RUSAGE_CHILDREN)を実行し、以下を確認
- maxrssの値が 16 < maxrss < 32 (MB)
CT_008: 孫プロセス作成時のRUSAGE_CHILDREN のutime, stime, maxrss計測
観点:子プロセス、孫プロセスの使用資源が計測されることを確認する
1. getrusage(RUSAGE_SELF) を実行し、以下を確認
- utimeの値が 0
- stimeの値が 0
- maxrssの値が 0
2. fork()で子プロセスを作成し、waitpidで子プロセスの終了を待つ
2.1. 子プロセスが、fork()で孫プロセスを作成する
2.2. 子プロセスが、ユーザモード処理2秒、カーネルモード処理1秒 を実施
2.3. 子プロセスが、8Mバイトの領域の確保、書き込み、開放処理を実施
2.4. 子プロセスが、waitpid()で孫プロセスの終了を待つ
2.4.1. 孫プロセスが、ユーザモード処理1秒、カーネルモード処理1秒 を実施
2.4.2. 孫プロセスが、32Mバイトの領域の確保、書き込み、開放処理を実施
2.4.3. 孫プロセスが終了する
2.5. 子プロセスが終了する
3. 親プロセスがgetrusage(RUSAGE_CHILDREN)を実行し、以下を確認
- utimeの値が 3秒程度 (子2秒、孫1秒の和)
- stimeの値が 2秒程度 (子1秒、孫1秒の和)
- maxrssの値が 32 < maxrss < 40 (MB) (子、孫のmaxrssの最大値)
CT_009: サブスレッド作成時のRUSAGE_THREAD のutime, stime計測
観点複数のスレッドでそれぞれのutime, stimeが計測されることを確認する
1. getrusage(RUSAGE_THREAD) を実行し、以下を確認
- utimeの値が 0 < utime < 0.1 (秒)
- stimeの値が 0 < stime < 0.1 (秒)
2. 1秒程度かかる処理をユーザモードで実行
3. pthread_create()でサブスレッドを作成する
4. メインスレッドが、pthread_join()でサブスレッドの終了を待つ
4.1. サブスレッドがgetrusage(RUSAGE_THREAD) を実行し、以下を確認
- utimeの値が 0 < utime 0.1 (秒)
- stimeの値が 0 < stime 0.1 (秒)
4.2. サブスレッドが、2秒程度かかる処理をユーザモードで実行
4.3. サブスレッドが、1秒程度かかる処理をカーネルモードで実行
4.4. サブスレッドがgetrusage(RUSAGE_THREAD) を実行し、以下を確認
- utimeの増分が 2秒程度
- stimeの増分が 1秒程度
4.4. サブスレッドが、終了する
5. メインスレッドがgetrusage(RUSAGE_THREAD) を実行し、以下を確認
- utimeの増分が 1秒程度
- stimeの増分が 3秒程度 (join待ち3秒)
※ Linuxではjoin待ち中は他タスクへとスイッチされてシステム時間が加算されないため、
Linuxでの実行時、本項目はFAILとなる
CT_010: サブスレッド作成時のRUSAGE_THREAD のmaxrss計測
観点複数のスレッドで、プロセス全体のmaxrssが取得されることを確認する
1. getrusage(RUSAGE_THREAD) を実行し、以下を確認
- maxrssの値が 0より大きい
2. 8Mバイトの領域の確保、書き込み、解放処理を実施
3. pthread_create()でサブスレッドを作成し、pthread_join()でサブスレッドの終了を待つ
3.1. サブスレッドがgetrusage(RUSAGE_THREAD) を実行し、以下を確認
- maxrssの値が 8MB 以上
3.2. サブスレッドが16Mバイトの領域の確保、書き込み、解放処理を実施
3.3. サブスレッドが終了する
4. メインスレッドがgetrusage(RUSAGE_THREAD) を実行し、以下を確認
- maxrssの値が 16MB 以上
(3) 実行結果ログ
result.logファイル内に実行時のログを記載する。
実行に利用したIHK/McKernelは、IA版における下記の版数相当の
arm64版移植IHK/McKernelである。
IHK
commit d6fcbee8cb91f9ec4b49f97c918e696ac0335aaf
Author: Shiratori, Takehiro <fj0300es@aa.jp.fujitsu.com>
Date: Tue Oct 16 16:25:33 2018 +0900
McKernel
commit 6f9fef2b13447c74c36d15cf5ebd186f8395ccca
Author: Ken Sato <ken.sato.ty@hitachi-solutions.com>
Date: Tue Sep 25 10:05:41 2018 +0900
(4) 備考
特になし。
以上。