blob: 7b03cc8c1f2baef7dd84dfa291cf852861244f99 [file]
#!/bin/sh
# - runtime
# - nr_threads
# - mode
# - ipc
# - iterations
# - datasize
## Hackbench is both a benchmark and a stress test for the Linux kernel scheduler.
## It's main job is to create a specified number of pairs of schedulable entities
## (either threads or traditional processes) which communicate via either sockets or
## pipes and time how long it takes for each pair to send data back and forth.
[ "$ipc" = 'pipe' ] && ipc_option='--pipe'
[ -n "$runtime" ] || runtime=600
# Default datasize for hackbench is 100
[ -n "$datasize" ] || datasize=100
set_env()
{
# default 40 fds/group
fds=40
tasks=$((nr_threads * fds))
# increase permitted open file number
ulimit -n $((tasks + 2048))
def_pid_max=32768
[ "$tasks" -gt $((def_pid_max / 2)) ] && {
sysctl -w kernel.pid_max=$((tasks * 2))
sysctl -w kernel.threads-max=$((tasks * 2))
sysctl -w vm.max_map_count=$((tasks * 100))
}
}
set_loops()
{
loops=$(( 30000 * nr_cpu / nr_threads ))
}
run_hackbench()
{
# args: groups number, mode [process/thread], times
local hackbench_path
if [ -f /usr/bin/hackbench ]; then
hackbench_path=/usr/bin/hackbench
elif [ -f /lkp/benchmarks/hackbench/usr/local/bin/hackbench ]; then
hackbench_path=/lkp/benchmarks/hackbench/usr/local/bin/hackbench
else
hackbench_path=/usr/local/bin/hackbench
fi
log_cmd $hackbench_path -g $nr_threads --$mode $ipc_option -l $loops -s $datasize
}
run_for_time()
{
start_time=$(date +%s)
while :
do
run_hackbench
now=$(date +%s)
[ $((now - start_time)) -gt "$runtime" ] && break
done
}
run_for_iterations()
{
for i in $(seq 1 $iterations); do
echo "Iterations: $i"
run_hackbench
done
}
set_env
set_loops
if [ -n "$iterations" ]; then
run_for_iterations
else
run_for_time
fi