blob: a8df6efa3184fdba9240254fefd8108816e08920 [file] [log] [blame]
#!/bin/sh
if [ -n "$runtime" ]; then
USEMEM="$CMD ./usemem --runtime $runtime"
else
USEMEM="$CMD ./usemem"
fi
[ -n "$SYNC_RW" ] && USEMEM="$USEMEM -y"
[ -n "$SYNC_FREE" ] && USEMEM="$USEMEM -x"
[ -n "$BIND_CPU" ] && USEMEM="$USEMEM -b $BIND_CPU"
[ -n "$REPEAT_COUNT" ] && USEMEM="$USEMEM -r $REPEAT_COUNT"
[ -n "$DELAY" ] && USEMEM="$USEMEM -e $DELAY"
[ -n "$TIMED_WP" ] && USEMEM="$USEMEM --timed-wp $TIMED_WP"
TMPFS_MNT=/tmp/vm-scalability-tmp
SHM_FILE=$TMPFS_MNT/sparse-${0#*case-}
SPARSE_ROOT=${SPARSE_ROOT:-$TMPFS_MNT/vm-scalability}
SPARSE_FILE=$SPARSE_ROOT/sparse-${0#*case-}
# SPARSE_FSTYPE=$(/usr/bin/stat -fc %T $SPARSE_ROOT)
# [ $SPARSE_FSTYPE = tmpfs ] && echo "$SPARSE_ROOT is tmpfs, sparse files won't eat memory." && exit 1
# [ $SPARSE_FSTYPE = nfs ] && echo "$SPARSE_ROOT is nfs, sparse file reads will be slow." && exit 1
PIDFILE=$SPARSE_ROOT/${0#*case-}.pid
mount_tmpfs()
{
if [ -d "$TMPFS_MNT" ]; then
mountpoint -q $TMPFS_MNT && umount $TMPFS_MNT
else
mkdir $TMPFS_MNT
fi
$CMD mount -t tmpfs -o size=100% vm-scalability-tmp $TMPFS_MNT
shm_size=$(/usr/bin/stat -f -c "%b*%S" $TMPFS_MNT)
export shm_size=$(($shm_size))
}
create_loop_devices()
{
local i
modprobe loop 2>/dev/null
[ -e "/dev/loop0" ] || modprobe loop 2>/dev/null
for i in $(seq 0 8)
do
[ -e "/dev/loop$i" ] && continue
mknod /dev/loop$i b 7 $i
done
}
# sparse files won't work as expected on tmpfs/nfs
create_sparse_root () {
$CMD truncate -s $((mem)) $SPARSE_ROOT.img
case ${fs:-xfs} in
btrfs)
$CMD mkfs.btrfs $SPARSE_ROOT.img > /dev/null
;;
ext4)
$CMD mkfs.ext4 -q -F $SPARSE_ROOT.img
;;
xfs)
$CMD mkfs.xfs -q $SPARSE_ROOT.img
;;
esac
[ -d "$SPARSE_ROOT" ] || mkdir $SPARSE_ROOT
# check if already mounted
if mountpoint -q $SPARSE_ROOT; then
echo "$SPARSE_ROOT already mounted"
else
create_loop_devices
$CMD mount -o loop $SPARSE_ROOT.img $SPARSE_ROOT 2>/dev/null || {
local loop_dev=$(losetup -f --show $SPARSE_ROOT.img)
[ -n "$loop_dev" ] || {
grep -q loop /proc/devices || echo 'No loop block device!' >&2
lsmod | grep -q loop || echo 'No loop module' >&2
LOOPDEV_DEBUG=1 losetup -f --show $SPARSE_ROOT.img
exit
}
mount $loop_dev $SPARSE_ROOT
}
fi
}
remove_tmpfs()
{
$CMD umount $TMPFS_MNT
}
remove_sparse_root () {
$CMD umount $SPARSE_ROOT || {
df
lsof $SPARSE_ROOT
}
# rmdir $SPARSE_ROOT
$CMD rm $SPARSE_ROOT.img
}
create_sparse_file () {
name=$1
size=$2
# echo "$name is of size $size"
$CMD truncate $name -s $size
# dd if=/dev/zero of=$name bs=1k count=1 seek=$((size >> 10)) 2>/dev/null
# ls $SPARSE_ROOT
# ls /tmp/vm-scalability/*
}
pagesize=$(getconf PAGESIZE)
nr_cpu=$(grep -c processor /proc/cpuinfo)
nr_node=$(echo /sys/devices/system/node/node* | wc -w)
nr_task=${nr_task:-$nr_cpu}
while read key val; do
[ -n "${val}" ] || continue
[ -z "${val##*[0-9]}" -a -z "${val%%[0-9]*}" ] || {
echo "invalid vmstat line: $key $val" >&2
break
}
eval "$key=$val"
done < /proc/vmstat
reclaimable=$((nr_free_pages + nr_file_pages))
reclaimable=$((reclaimable * pagesize))
while read key val unit; do
key=${key%%:}
key=${key%%)}
[ "${key#*(}" != "$key" ] &&
key=${key%(*}_${key#*(}
eval $key=$val
done < /proc/meminfo
mem=$((MemTotal << 10))
mem_avail=$((MemAvailable << 10))
hugepagesize=$((Hugepagesize << 10))
ROTATE_BYTES=$((1<<42))
# Documentation/x86/x86_64/mm.txt
# 0000000000000000 - 00007fffffffffff (=47 bits) user space, different per mm
AS_LIMIT=$((1<<46))
# prevent OOM: limit pagetable pages to half available memory
# $mem_avail / 2 / 4K = upper_limit_nr_page_table_pages
# every PTE maps 2M space, so
# $upper_limit_nr_page_table_pages * 2M = upper_limit_test_size = PTE_LIMIT
# PTE_LIMIT = 256 * $mem_tail
PTE_LIMIT=$((mem_avail << 8))
[ "$ROTATE_BYTES" -gt $PTE_LIMIT ] && ROTATE_BYTES=$PTE_LIMIT