memcg_stress_test.sh 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #!/bin/sh
  2. # SPDX-License-Identifier: GPL-2.0-or-later
  3. # Copyright (c) 2009 FUJITSU LIMITED
  4. # Copyright (c) 2018-2019 ARM Ltd. All Rights Reserved.
  5. # Copyright (c) 2019 Petr Vorel <pvorel@suse.cz>
  6. #
  7. # Author: Li Zefan <lizf@cn.fujitsu.com>
  8. # Restructure for LTP: Shi Weihua <shiwh@cn.fujitsu.com>
  9. # Added memcg enable/disable functionality: Rishikesh K Rajak <risrajak@linux.vnet.ibm.com>
  10. TST_TESTFUNC=test
  11. TST_SETUP=setup
  12. TST_CLEANUP=cleanup
  13. TST_CNT=2
  14. TST_NEEDS_ROOT=1
  15. TST_NEEDS_CMDS="mount umount cat kill mkdir rmdir grep awk cut"
  16. # Each test case runs for 900 secs when everything fine
  17. # therefore the default 5 mins timeout is not enough.
  18. TST_TIMEOUT=2100
  19. . cgroup_lib.sh
  20. setup()
  21. {
  22. if ! is_cgroup_subsystem_available_and_enabled "memory"; then
  23. tst_brk TCONF "Either kernel does not support Memory Resource Controller or feature not enabled"
  24. fi
  25. echo 3 > /proc/sys/vm/drop_caches
  26. sleep 2
  27. local mem_free=`cat /proc/meminfo | grep MemFree | awk '{ print $2 }'`
  28. local swap_free=`cat /proc/meminfo | grep SwapFree | awk '{ print $2 }'`
  29. local pgsize=`tst_getconf PAGESIZE`
  30. MEM=$(( $mem_free + $swap_free / 2 ))
  31. MEM=$(( $MEM / 1024 ))
  32. RUN_TIME=$(( 15 * 60 ))
  33. [ "$pgsize" = "4096" ] && THREAD_SPARE_MB=1 || THREAD_SPARE_MB=8
  34. tst_res TINFO "Calculated available memory $MEM MB"
  35. }
  36. cleanup()
  37. {
  38. if [ -e /dev/memcg ]; then
  39. umount /dev/memcg 2> /dev/null
  40. rmdir /dev/memcg 2> /dev/null
  41. fi
  42. }
  43. do_mount()
  44. {
  45. cleanup
  46. mkdir /dev/memcg 2> /dev/null
  47. mount -t cgroup -omemory memcg /dev/memcg
  48. }
  49. # $1 Number of cgroups
  50. # $2 Allocated MB memory in one process
  51. # $3 The interval to touch memory in a process
  52. # $4 Test duration (sec)
  53. run_stress()
  54. {
  55. local cgroups="$1"
  56. local mem_size="$2"
  57. local interval="$3"
  58. local timeout="$4"
  59. local i pid pids
  60. tst_res TINFO "Testing $cgroups cgroups, using $mem_size MB, interval $interval"
  61. do_mount
  62. tst_res TINFO "Starting cgroups"
  63. for i in $(seq 0 $(($cgroups-1))); do
  64. mkdir /dev/memcg/$i 2> /dev/null
  65. memcg_process_stress $mem_size $interval &
  66. echo $! > /dev/memcg/$i/tasks
  67. pids="$! $pids"
  68. done
  69. for pid in $pids; do
  70. kill -USR1 $pid 2> /dev/null
  71. done
  72. tst_res TINFO "Testing cgroups for ${timeout}s"
  73. sleep $timeout
  74. tst_res TINFO "Killing groups"
  75. i=0
  76. for pid in $pids; do
  77. kill -KILL $pid 2> /dev/null
  78. wait $pid 2> /dev/null
  79. rmdir /dev/memcg/$i 2> /dev/null
  80. i=$((i+1))
  81. done
  82. tst_res TPASS "Test passed"
  83. cleanup
  84. }
  85. test1()
  86. {
  87. run_stress 150 $(( ($MEM - 150 * $THREAD_SPARE_MB) / 150 )) 5 $RUN_TIME
  88. }
  89. test2()
  90. {
  91. run_stress 1 $(( $MEM - $THREAD_SPARE_MB)) 5 $RUN_TIME
  92. }
  93. tst_run