From: Subrata <sub...@us...> - 2009-09-14 07:14:36
|
Update of /cvsroot/ltp/ltp/testcases/kernel/controllers/memcg/stress In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv20890/ltp/testcases/kernel/controllers/memcg/stress Added Files: Makefile memcg_process_stress.c memcg_stress_test.sh Log Message: Add new testcases for memcgroup: My workmate Li Zefan (li...@cn...) has created some testcases for cgroup's subsystem "memory" in the last year. And, He catched some kernel bugs through these testcases. So we think you glad to push them into LTP. There are total 40 testcases that have been added. These testcases contain the basis operation test, part functionality test and stress test of memcgroup. How to run this test: # runltp -f controllers. Result: memcgroup_function_test 1 TPASS : rss=4096/4096, cache=0/0 memcgroup_function_test 2 TPASS : rss=0/0, cache=4096/4096 memcgroup_function_test 3 TPASS : rss=0/0, cache=4096/4096 memcgroup_function_test 4 TPASS : rss=4096/4096, cache=8192/8192 memcgroup_function_test 5 TPASS : rss=4096/4096, cache=0/0 memcgroup_function_test 6 TPASS : rss=4096/4096, cache=0/0 memcgroup_function_test 6 TPASS : rss=0/0, cache=0/0 memcgroup_function_test 7 TPASS : rss=0/0, cache=4096/4096 memcgroup_function_test 7 TPASS : rss=0/0, cache=0/0 memcgroup_function_test 8 TPASS : rss=0/0, cache=4096/4096 memcgroup_function_test 8 TPASS : rss=0/0, cache=0/0 memcgroup_function_test 9 TPASS : rss=4096/4096, cache=8192/8192 memcgroup_function_test 9 TPASS : rss=0/0, cache=0/0 memcgroup_function_test 10 TPASS : rss=4096/4096, cache=0/0 memcgroup_function_test 10 TPASS : rss=0/0, cache=0/0 memcgroup_function_test 11 TPASS : failcnt=6 memcgroup_function_test 12 TPASS : failcnt=6 memcgroup_function_test 13 TPASS : failcnt=6 memcgroup_function_test 14 TPASS : process 5793 is killed memcgroup_function_test 15 TPASS : process 5803 is killed memcgroup_function_test 16 TPASS : process 5813 is killed memcgroup_function_test 17 TPASS : process 5824 is killed memcgroup_function_test 18 TPASS : process 5835 is killed memcgroup_function_test 19 TPASS : process 5845 is killed memcgroup_function_test 20 TPASS : process 5854 is killed memcgroup_function_test 21 TPASS : process 5863 is killed memcgroup_function_test 22 TPASS : input=4095, limit_in_bytes=4096 memcgroup_function_test 23 TPASS : input=4097, limit_in_bytes=8192 memcgroup_function_test 24 TPASS : input=1, limit_in_bytes=4096 memcgroup_function_test 25 TPASS : return value is 0 memcgroup_function_test 26 TPASS : return value is 1 memcgroup_function_test 27 TPASS : return value is 1 memcgroup_function_test 28 TPASS : return value is 1 memcgroup_function_test 29 TPASS : force memory succeeded memcgroup_function_test 30 TPASS : force memory failed as expected memcgroup_function_test 31 TPASS : return value is 0 memcgroup_function_test 32 TPASS : return value is 0 memcgroup_function_test 33 TPASS : return value is 0 memcgroup_function_test 34 TPASS : return value is 0 memcgroup_function_test 35 TPASS : return value is 1 memcgroup_function_test 36 TPASS : rss=4096/4096, cache=0/0 memcgroup_function_test 36 TPASS : rss=0/0, cache=0/0 memcgroup_function_test 37 TPASS : rss=4096/4096, cache=0/0 memcgroup_function_test 37 TPASS : rss=0/0, cache=0/0 memcgroup_function_test 38 TPASS : rss=4096/4096, cache=0/0 memcgroup_function_test 38 TPASS : rss=0/0, cache=0/0 memcgroup_stress_test 1 TPASS : stress test 1 passed memcgroup_stress_test 2 TPASS : stress test 2 passed INFO: ltp-pan reported all tests PASS, Signed-off-by: Shi Weihua <sh...@cn...>, --- NEW FILE: memcg_stress_test.sh --- #! /bin/sh ################################################################################ ## ## ## Copyright (c) 2009 FUJITSU LIMITED ## ## ## ## This program is free software; you can redistribute it and#or modify ## ## it under the terms of the GNU General Public License as published by ## ## the Free Software Foundation; either version 2 of the License, or ## ## (at your option) any later version. ## ## ## ## This program is distributed in the hope that it will be useful, but ## ## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ## ## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ## ## for more details. ## ## ## ## You should have received a copy of the GNU General Public License ## ## along with this program; if not, write to the Free Software ## ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## ## ## ## Author: Li Zefan <li...@cn...> ## ## Restructure for LTP: Shi Weihua <sh...@cn...> ## ## ## ################################################################################ cd $LTPROOT/testcases/bin export TCID="memcg_stress_test" export TST_TOTAL=2 export TST_COUNT=0 grep -w memory /proc/cgroups 2>&1 > /dev/null if [ $? -ne 0 ]; then echo "WARNING:"; echo "Kernel does not support for memory resource controller"; echo "Skipping all memcgroup testcases...."; exit 0 fi RUN_TIME=$(( 60 * 60 )) cleanup() { if [ -e /dev/memcg ]; then umount /dev/memcg 2>/dev/null rmdir /dev/memcg 2>/dev/null fi } do_mount() { cleanup; mkdir /dev/memcg 2> /dev/null mount -t cgroup -omemory memcg /dev/memcg } # Run the stress test # # $1 - Number of cgroups # $2 - Allocated how much memory in one process? in MB # $3 - The interval to touch memory in a process # $4 - How long does this test run ? in second run_stress() { do_mount; for ((i = 0; i < $1; i++)) { mkdir /memcg/$i 2> /dev/null ./memcg_process_stress $2 $3 & pid[$i]=$! echo ${pid[$i]} > /memcg/$i/tasks } for ((i = 0; i < $1; i++)) { /bin/kill -s SIGUSR1 ${pid[$i]} 2> /dev/null } sleep $4 for ((i = 0; i < $1; i++)) { /bin/kill -s SIGINT ${pid[$i]} 2> /dev/null wait ${pid[$i]} rmdir /memcg/$i 2> /dev/null } cleanup; } testcase_1() { run_stress 150 $(( ($mem-150) / 150 )) 10 $RUN_TIME tst_resm TPASS "stress test 1 passed" } testcase_2() { run_stress 1 $mem 10 $RUN_TIME tst_resm TPASS "stress test 2 passed" } echo 3 > /proc/sys/vm/drop_caches sleep 2 mem_free=`cat /proc/meminfo | grep MemFree | awk '{ print $2 }'` swap_free=`cat /proc/meminfo | grep SwapFree | awk '{ print $2 }'` mem=$(( $mem_free + $swap_free / 2 )) mem=$(( mem / 1024 )) date export TST_COUNT=$(( $TST_COUNT + 1 )) testcase_1 export TST_COUNT=$(( $TST_COUNT + 1 )) testcase_2 date exit 0 --- NEW FILE: Makefile --- CFLAGS += -Wall -O2 -g -Wextra LDLIBS += -lm SRCS=$(wildcard *.c) OBJECTS=$(patsubst %.c,%.o,$(SRCS)) TARGETS=$(patsubst %.c,%,$(SRCS)) all: $(TARGETS) $(TARGETS): %: %.o install: @set -e; for i in $(TARGETS) *.sh; do ln -f $$i ../../../../bin/$$i ; chmod +x $$i ; done test: @./memcgroup_stress_test.sh clean: rm -f $(TARGETS) $(OBJECTS) uninstall: .DEFAULT: ; --- NEW FILE: memcg_process_stress.c --- /******************************************************************************/ /* */ /* Copyright (c) 2009 FUJITSU LIMITED */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation; either version 2 of the License, or */ /* (at your option) any later version. */ /* */ /* This program is distributed in the hope that it will be useful, */ /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ /* the GNU General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public License */ /* along with this program; if not, write to the Free Software */ /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* */ /* Author: Li Zefan <li...@cn...> */ /* */ /******************************************************************************/ #include <unistd.h> #include <stdlib.h> #include <signal.h> #include <string.h> #include <err.h> #include <math.h> #include <sys/mman.h> int flag_exit; int flag_ready; int interval; unsigned long memsize; char **pages; int nr_page; void touch_memory() { int i; for (i = 0; i < nr_page; i++) pages[i][0] = 0xef; } void sigusr_handler(int __attribute__((unused)) signo) { int i; int pagesize = getpagesize(); nr_page = ceil((double)memsize / pagesize); pages = calloc(nr_page, sizeof(char *)); if (pages == NULL) errx(1, "calloc() failed"); for (i = 0; i < nr_page; i++) { pages[i] = mmap(NULL, pagesize, PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); if (pages[i] == MAP_FAILED) err(1, "map() failed\n"); } flag_ready = 1; } void sigint_handler(int __attribute__((unused)) signo) { flag_exit = 1; } int main(int argc, char *argv[]) { char *end; struct sigaction sigint_action; struct sigaction sigusr_action; if (argc != 3) errx(1, "Wrong argument num"); memsize = strtoul(argv[1], &end, 10); if (*end != '\0') errx(1, "wrong memsize"); memsize = memsize * 1024 * 1024; interval = atoi(argv[2]); if (interval <= 0) interval = 1; memset(&sigint_action, 0, sizeof(sigint_action)); sigint_action.sa_handler = &sigint_handler; sigaction(SIGINT, &sigint_action, NULL); memset(&sigusr_action, 0, sizeof(sigusr_action)); sigusr_action.sa_handler = &sigusr_handler; sigaction(SIGUSR1, &sigusr_action, NULL); while (!flag_exit) { sleep(interval); if (flag_ready) touch_memory(); }; return 0; } |