From 05c315857cee824edb055b298eb60626ac773b98 Mon Sep 17 00:00:00 2001 From: "Shiratori, Takehiro" Date: Thu, 6 Dec 2018 20:49:23 +0900 Subject: [PATCH] Test "Add mcstat tool" on arm64 Change-Id: I4bf1260e999c16fe7b9c339af3833ea007277889 --- test/mcstat/arm64/Makefile | 20 ++++ test/mcstat/arm64/README | 50 +++++++++ test/mcstat/arm64/get_rusage.c | 73 ++++++++++++ test/mcstat/arm64/result.log | 20 ++++ test/mcstat/arm64/run.sh | 196 +++++++++++++++++++++++++++++++++ 5 files changed, 359 insertions(+) create mode 100644 test/mcstat/arm64/Makefile create mode 100644 test/mcstat/arm64/README create mode 100644 test/mcstat/arm64/get_rusage.c create mode 100644 test/mcstat/arm64/result.log create mode 100755 test/mcstat/arm64/run.sh diff --git a/test/mcstat/arm64/Makefile b/test/mcstat/arm64/Makefile new file mode 100644 index 00000000..9b9d1e15 --- /dev/null +++ b/test/mcstat/arm64/Makefile @@ -0,0 +1,20 @@ +# Makefile COPYRIGHT FUJITSU LIMITED 2018 +CC = gcc +TARGET = get_rusage +LDFLAGS = -Wall + +include $(HOME)/.mck_test_config + +INCLUDE_DIR = $(BIN)/../include +LIBDIR = $(BIN)/../lib + +all: $(TARGET) + +get_rusage: get_rusage.c + $(CC) -o $@ $^ $(LDFLAGS) -I$(INCLUDE_DIR) -Wl,-rpath=$(LIBDIR) -L$(LIBDIR) -lihk + +test: all + ./run.sh + +clean: + rm -f $(TARGET) diff --git a/test/mcstat/arm64/README b/test/mcstat/arm64/README new file mode 100644 index 00000000..24fe6df2 --- /dev/null +++ b/test/mcstat/arm64/README @@ -0,0 +1,50 @@ +/* README COPYRIGHT FUJITSU LIMITED 2018 */ + +mcstatテストセットREADME + +(1) テストの実行方法 + 以下の手順でテストを実行する + 1. $HOME/.mck_test_configを用意する + 当該ファイルは、McKernelをビルドした際に生成されるmck_test_config.sample ファイルを + $HOMEにコピーし、適宜編集する + 2. make testを実行する + +(2) テスト項目詳細 + TEST001 メモリ総容量の表示が期待通りであるか確認する + TEST002 現在の使用量の表示が期待通りであるか確認する + TEST003 メモリ最大使用量の表示が期待通りであるか確認する + TEST004 システム時間の表示が期待通りであるか確認する + TEST005 ユーザ時間の表示が期待通りであるか確認する + TEST006 現在動作中のスレッド数が期待通りであるか確認する + TEST007 表示されている最大スレッド数が期待通りであるか確認する + TEST008 -nオプションを付与した場合、ヘッダが1つだけ表示されることを確認する + TEST009 -nオプションを付与しなかった場合、ヘッダが10行ごとに出力されることを確認する + TEST010 -sオプションでMcKernelのステータスのみ表示することを確認する + TEST011 -hオプションでusageが表示されることを確認する + TEST012 -hオプションを他オプションと同時に指定してもusage表示が優先されることを確認する + TEST013 delayを指定した秒間単位で行を出力することを確認する + TEST014 delayのみを指定した場合、間隔単位で継続出力を行うことを確認する + TEST015 不正なオプションを指定した場合に期待通りの動作になることを確認する + +(3) 実行結果ログ + result.logファイル内に実行時のログを記載する。 + 実行に利用したIHK/McKernelは、IA版における下記の版数相当に加えて、 + https://postpeta.pccluster.org/redmine/issues/1237 + https://postpeta.pccluster.org/redmine/issues/1223 + の関連修正を加えたarm64版移植IHK/McKernelである。 + + IHK + commit d6fcbee8cb91f9ec4b49f97c918e696ac0335aaf + Author: Shiratori, Takehiro + Date: Tue Oct 16 16:25:33 2018 +0900 + + McKernel + commit 6f9fef2b13447c74c36d15cf5ebd186f8395ccca + Author: Ken Sato + Date: Tue Sep 25 10:05:41 2018 +0900 + +(4) 備考 + 特になし。 + + +以上。 diff --git a/test/mcstat/arm64/get_rusage.c b/test/mcstat/arm64/get_rusage.c new file mode 100644 index 00000000..75e3ec8e --- /dev/null +++ b/test/mcstat/arm64/get_rusage.c @@ -0,0 +1,73 @@ +/* get_rusage.c COPYRIGHT FUJITSU LIMITED 2018 */ +#include +#include +#include +#include +#include + +static void usage(char *cmd) +{ + printf("Usage:\n"); + printf(" %s \n", cmd); +} + +int main(int argc, char *argv[]) +{ + int os_num = 0; + int ret = -1; + int i = 0; + struct mckernel_rusage mck_rusage; + + if (argc != 2) { + usage(argv[0]); + goto out; + } + + os_num = atoi(argv[1]); + if (os_num < 0 || 63 < os_num) { + printf("Invalid argument 1 os_num.\n"); + usage(argv[0]); + goto out; + } + + memset(&mck_rusage, 0, sizeof(mck_rusage)); + ret = ihk_os_getrusage(os_num, &mck_rusage, sizeof(mck_rusage)); + if (ret) { + perror("ihk_os_getrusage()"); + goto out; + } + + for (i = 0; i < IHK_MAX_NUM_PGSIZES; i++) { + printf("memory_stat_rss[%d] : 0x%lx\n", i, + mck_rusage.memory_stat_rss[i]); + } + + for (i = 0; i < IHK_MAX_NUM_PGSIZES; i++) { + printf("memory_stat_mapped_file[%d] : 0x%lx\n", i, + mck_rusage.memory_stat_mapped_file[i]); + } + + printf("memory_max_usage : 0x%lx\n", mck_rusage.memory_max_usage); + printf("memory_kmem_usage : 0x%lx\n", mck_rusage.memory_kmem_usage); + printf("memory_kmem_max_usage : 0x%lx\n", mck_rusage.memory_kmem_max_usage); + + for (i = 0; i < IHK_MAX_NUM_NUMA_NODES; i++) { + printf("memory_numa_stat[%d] : 0x%lx\n", i, + mck_rusage.memory_numa_stat[i]); + } + + printf("cpuacct_stat_system : 0x%lx\n", mck_rusage.cpuacct_stat_system); + printf("cpuacct_stat_user : 0x%lx\n", mck_rusage.cpuacct_stat_user); + printf("cpuacct_usage : 0x%lx\n", mck_rusage.cpuacct_usage); + + for (i = 0; i < IHK_MAX_NUM_CPUS; i++) { + printf("cpuacct_usage_percpu[%d] : 0x%lx\n", i, + mck_rusage.cpuacct_usage_percpu[i]); + } + + printf("num_threads : 0x%x\n", mck_rusage.num_threads); + printf("max_num_threads : 0x%x\n", mck_rusage.max_num_threads); + +out: + return ret; +} diff --git a/test/mcstat/arm64/result.log b/test/mcstat/arm64/result.log new file mode 100644 index 00000000..59140687 --- /dev/null +++ b/test/mcstat/arm64/result.log @@ -0,0 +1,20 @@ +gcc -o get_rusage get_rusage.c -Wall -I/opt/ppos/bin/../include -Wl,-rpath=/opt/ppos/bin/../lib -L/opt/ppos/bin/../lib -lihk +./run.sh +mcstop+release.sh ... done +mcreboot.sh -c 4-7 -m 512M@0 ... done +TEST001: OK +TEST002: OK +TEST003: OK +TEST004: OK +TEST005: OK +TEST006: OK +TEST007: OK +TEST008: OK +TEST009: OK +TEST010: OK +TEST011: OK +TEST012: OK +TEST013: OK +./run.sh: 172 行: 6701 Terminated stdbuf -i0 -o0 -e0 ${MCSTAT} 1 > ./tmp.log 2>&1 +TEST014: OK +TEST015: OK diff --git a/test/mcstat/arm64/run.sh b/test/mcstat/arm64/run.sh new file mode 100755 index 00000000..9aa99ca3 --- /dev/null +++ b/test/mcstat/arm64/run.sh @@ -0,0 +1,196 @@ +#!/bin/sh +## run.sh COPYRIGHT FUJITSU LIMITED 2018 ## + +USELTP=0 +USEOSTEST=1 +MCREBOOT=0 + +. ../../common.sh + +MCSTAT="${BIN}/mcstat" +BOOTPARAM="-c 4-7 -m 512M@0" + +mcreboot + +sleep 1 + +${MCEXEC} ${TESTMCK} -s mem_limits -n 0 -- -s $((64*1024*1024)) -c 1 -f mmap > /dev/null 2>&1 + +sleep 1 + +result=0 + +################# +## mcstat test ## +################# + +output=`${MCSTAT} | sed -n -e 3p` +mck_mem_total=$(awk '{print $1}' <<< ${output}) +mem_current=$(awk '{print $2}' <<< ${output}) +mem_max=$(awk '{print $3}' <<< ${output}) +tsc_system=$(awk '{print $4}' <<< ${output}) +tsc_user=$(awk '{print $5}' <<< ${output}) +thread_current=$(awk '{print $6}' <<< ${output}) +thread_max=$(awk '{print $7}' <<< ${output}) + +output=`./get_rusage 0` +exp_kmem_current=`echo "${output}" | grep "memory_kmem_usage" | cut -c 21-` +exp_umem_current=`echo "${output}" | grep "memory_numa_stat\[0\]" | cut -c 23-` +exp_mem_current=$((${exp_kmem_current}+${exp_umem_current})) + +exp_kmem_max=`echo "${output}" | grep "memory_kmem_max_usage" | cut -c 25-` +exp_umem_max=`echo "${output}" | grep "memory_max_usage" | cut -c 20-` +exp_mem_max=$((${exp_kmem_max}+${exp_umem_max})) + +exp_tsc_system=`echo "${output}" | grep "cpuacct_stat_system" | cut -c 23-` +exp_tsc_user=`echo "${output}" | grep "cpuacct_stat_user" | cut -c 21-` +exp_thread_current=`echo "${output}" | grep "num_threads" | head -1 | cut -c 15-` +exp_thread_max=`echo "${output}" | grep "max_num_threads" | cut -c 19-` + +mck_mem_total=`echo "scale=3; ${mck_mem_total} - ${mem_current}" | bc` +mck_mem_total=${mck_mem_total%.*} +if [ 502 -le ${mck_mem_total} -a ${mck_mem_total} -lt 512 ]; then + echo "TEST001: OK" +else + echo "TEST001: NG, memory total value (exp:near512MiB val:${mck_mem_total}MiB)." + result=-1 +fi + +exp_mem_current=$((${exp_mem_current} / 1024 / 1024)) +mem_current=${mem_current%.*} +if [ ${mem_current} == ${exp_mem_current} ]; then + echo "TEST002: OK" +else + echo "TEST002: NG, memory current value (exp:${exp_mem_current}MiB val:${mem_current}MiB)" + result=-1 +fi + +exp_mem_max=$((${exp_mem_max} / 1024 / 1024)) +mem_max=${mem_max%.*} +if [ ${mem_max} == ${exp_mem_max} ]; then + echo "TEST003: OK" +else + echo "TEST003: NG, memory max value (exp:${exp_mem_max}MiB val:${mem_current}MiB)" + result=-1 +fi + +exp_tsc_system=$((${exp_tsc_system})) +if [ ${tsc_system} == ${exp_tsc_system} ]; then + echo "TEST004: OK" +else + echo "TEST004: NG, tsc system value (exp:${exp_tsc_system} val:${tsc_system})" + result=-1 +fi + +exp_tsc_user=$((${exp_tsc_user})) +if [ ${tsc_user} == ${exp_tsc_user} ]; then + echo "TEST005: OK" +else + echo "TEST005: NG, tsc user value (exp:${exp_tsc_system} val:${tsc_system})" + result=-1 +fi + +exp_thread_current=$((${exp_thread_current})) +if [ ${thread_current} == ${exp_thread_current} ]; then + echo "TEST006: OK" +else + echo "TEST006: NG, current thread value (exp:${exp_thread_current} val:${thread_current})" + result=-1 +fi + +exp_thread_max=$((${exp_thread_max})) +if [ ${thread_max} == ${exp_thread_max} ]; then + echo "TEST007: OK" +else + echo "TEST007: NG, max thread value (exp:${exp_thread_max} val:${thread_max})" + result=-1 +fi + +output=`${MCSTAT} -n 1 20 | grep -c "\-\-\-\-\-\-\- memory"` +if [ ${output} == 1 ]; then + echo "TEST008: OK" +else + echo "TEST008: NG, header output frequency -n option setting." + result=-1 +fi + +output=`${MCSTAT} 1 20 | grep -c "\-\-\-\-\-\-\- memory"` +if [ ${output} == 2 ]; then + echo "TEST009: OK" +else + echo "TEST009: NG, header output frequency -n option not setting." + result=-1 +fi + +output=`${MCSTAT} -s | awk '{print toupper($0)}'` +output=`echo ${output} | cut -c 18-` +exp_status=`${IHKOSCTL} 0 get status` +if [ ${output} == ${exp_status} ]; then + echo "TEST010: OK" +else + echo "TEST010: NG, -s option get status.(exp:${exp_status} status:${output})" + result=-1 +fi + +${MCSTAT} -h 2>&1 | grep -q "Usage" +if [ $? == 0 ]; then + echo "TEST011: OK" +else + echo "TEST011: NG, -h option setting." + result=-1 +fi + +${MCSTAT} -s -h 2>&1 | grep -q "Usage" +if [ $? == 0 ]; then + echo "TEST012: OK" +else + echo "TEST012: NG, -h and other option setting." + result=-1 +fi + +(time ${MCSTAT} 5 2) > ./tmp.log 2>&1 +output=`cat ./tmp.log | tac | sed -n -e 3p | cut -c 8-12` +output=${output%.*} +if [ ${output} == 5 ]; then + output=`cat ./tmp.log | sort | uniq -c | sort -nr | head -1 | cut -c 7-8` + + if [ ${output} == 2 ]; then + echo "TEST013: OK" + else + echo "TEST013: NG, delay/count option setting. (lines mismatch)" + result=-1 + fi +else + echo "TEST013: NG, delay/count option setting. (times mismatch)" + result=-1 +fi + +stdbuf -i0 -o0 -e0 ${MCSTAT} 1 > ./tmp.log 2>&1 & +sleep 10 +kill `pidof mcstat` +output=`cat ./tmp.log | sort | uniq -c | sort -nr | head -1 | cut -c 6-7` +if [ ${output} == 11 ]; then + echo "TEST014: OK" +else + echo "TEST014: NG, delay option only setting." + result=-1 +fi + +${MCSTAT} -k > ./tmp.log 2>&1 +if [ $? == 0 ]; then + cat ./tmp.log | grep -q "invalid option" + + if [ $? == 0 ]; then + echo "TEST015: OK" + else + echo "TEST015: NG, invalid option setting. (log mismatch)" + result=-1 + fi +else + echo "TEST015: NG, invalid option setting. (result mismatch)" + result=-1 +fi + +rm -f ./tmp.log + +exit ${result}