#!/bin/bash

# Author: Songtang Liu <liusongtang@bytedance.com>
#
# This script creates a lot of pressure in fork/exit path as well as some other paths in kernel mode.
# Called by cg.sh, see cg.sh's comments.

CGROUP_ROOT="/sys/fs/cgroup"
CGROUP_NAME=$1
CGROUP_PATH="${CGROUP_ROOT}/${CGROUP_NAME}"
cleanup() {
	echo "Cleaning up..."
	kill $sleep_pid $WRITE_PID $CPU_PID $FORK_PID $NETLINK_PID $READ_PID $MOVE_PID $TEST_PID  2>/dev/null
	pids=$(cat "${CGROUP_PATH}/cgroup.procs")
	for pid in $pids; do
		kill $pid 2>/dev/null
	done
	pids=$(pgrep stress-ng)
	kill $pids
	rmdir $CGROUP_PATH
	exit
}
trap cleanup SIGINT

mkdir -p $CGROUP_PATH
echo "+cpu +memory +pids" > $CGROUP_ROOT/cgroup.subtree_control
echo "1600000 100000" > ${CGROUP_PATH}/cpu.max
echo "34G" > ${CGROUP_PATH}/memory.max
echo $$ > ${CGROUP_PATH}/cgroup.procs

while true; do
	echo $$ > ${CGROUP_PATH}/cgroup.procs
	stress-ng --vm 16 -t 60h --vm-bytes 2G --aggressive >/dev/null 2>&1
done &
MEM_PID=$!

sleep 1000000000 &
sleep_pid=$!
while true; do
	echo $sleep_pid > ${CGROUP_PATH}/cgroup.procs &
	echo $sleep_pid > ${CGROUP_ROOT}/cgroup.procs &
done &
WRITE_PID=$!

class=network
# class=os
while true; do
	echo $$ > ${CGROUP_PATH}/cgroup.procs
	stress-ng --class $class --all 0 -t 1 --aggressive  &>/dev/null
done &

while true; do
	echo $$ > ${CGROUP_PATH}/cgroup.procs
	stress-ng --class $class --all 0 -t 1 --aggressive  &>/dev/null
done &

while true; do
	echo $$ > ${CGROUP_PATH}/cgroup.procs
	stress-ng --class $class --all 0 -t 1 --aggressive  &>/dev/null
done &

while true; do
	echo $$ > ${CGROUP_PATH}/cgroup.procs
	stress-ng --class $class --all 0 -t 1 --aggressive  &>/dev/null
done &

stress-ng --class $class --all 0 -t 1 --aggressive  &>/dev/null

# stress-ng --class $class --all 0 -t 60m --aggressive  &>/dev/null
NETLINK_PID=$!
while true; do
	echo $$ > ${CGROUP_PATH}/cgroup.procs
	stress-ng --fork 1000 -t 1 --aggressive &>/dev/null
done &
TEST_PID=$!

stress-ng --fork 1000 -t 60h --aggressive &>/dev/null

# while true; do
#   echo $$ > ${CGROUP_PATH}/cgroup.procs
#   ssh -t root@10.37.89.113 "cat /proc/cgroups"  > /dev/null
# done &

wait
