| #!/bin/selfclean /bin/sh |
| main_pid=$$ |
| |
| log() |
| { |
| echo "$@" >&2 |
| } |
| |
| |
| fs_writable() |
| { |
| local dir="$1" |
| if ( : >"$dir/.check.tmp" ) 2>/dev/null; then |
| rm -f "$dir/.check.tmp" |
| return 0 |
| else |
| return 1 |
| fi |
| } |
| |
| |
| label() |
| { |
| "$@" 2>&1 | ( |
| shift |
| while read line; do |
| echo "$*: $line" |
| done |
| ) |
| } |
| |
| |
| abort() |
| { |
| if [ -z "$DONT_ABORT" ]; then |
| log 'Error encountered and $DONT_ABORT is not set: aborting.' |
| sleep 1 |
| kill -TERM $main_pid |
| exit 98 |
| else |
| log 'Not aborting - $DONT_ABORT is set.' |
| sleep 10 |
| fi |
| } |
| |
| |
| retry() |
| { |
| while :; do |
| if "$@"; then |
| sleep 5 |
| log "restarting '$*'" |
| else |
| log |
| log "FATAL: process ($*) died unexpectedly with code $?" |
| abort |
| fi |
| done |
| } |
| |
| |
| should_never_die() |
| { |
| while :; do |
| "$@" |
| log |
| log "FATAL: process ($*) died unexpectedly with code $?" |
| abort |
| log "restarting '$*'" |
| done |
| } |
| |
| main() |
| { |
| # We originally tried to stress *both* ethernet and MoCA here, but that's |
| # too hard if the bridge device is configured (which is the normal case). |
| # So let's just send packets out the bridge interface, if it exists, or |
| # eth0, otherwise. The net effect is we'll end up sending packets over |
| # MoCA if the thin bruno is connected over MoCA, or ethernet if it's |
| # connected over ethernet, which is a lot like what should happen in real |
| # life. |
| if is-storage-box; then |
| log "Fat bruno: operating in server mode." |
| label should_never_die iperf -s & |
| label should_never_die iperf -s -u & |
| else |
| if [ -z "$SERVER_IP" ]; then |
| while :; do |
| log "Thin bruno: broadcasting for servers..." |
| SERVERS=$(find-servers) |
| [ -n "$SERVERS" ] && break |
| done |
| log "Found servers: " $SERVERS |
| else |
| SERVERS=$SERVER_IP |
| log "Hardcoded \$SERVER_IP: $SERVERS" |
| fi |
| |
| for server in $SERVERS; do |
| while ! nc $server 5001 </dev/null; do |
| log "Waiting for iperf server to listen on $server:5001..." |
| sleep 2 |
| done |
| done |
| |
| for server in $SERVERS; do |
| if [ -n "$MAX_BANDWIDTH" ]; then |
| # iperf can't explicitly limit bandwidth in TCP mode. Sigh. So |
| # skip TCP and use fast UDP instead. |
| log "MAX_BANDWIDTH=$MAX_BANDWIDTH; testing UDP only." |
| label retry iperf -t60 -i10 -u -c $server -b "${MAX_BANDWIDTH}M" -d & |
| else |
| log "MAX_BANDWIDTH not set; testing max rate TCP and slow UDP." |
| label retry iperf -t60 -i10 -u -c $server -d & |
| label retry iperf -t60 -i10 -c $server -d & |
| fi |
| done |
| fi |
| |
| if fs_writable /var/media; then |
| # fast random writes |
| should_never_die stress-disk -p10 --random --write /var/media & |
| else |
| log "No /var/media; skipping disk-write test." |
| fi |
| |
| # raw disk/usb reads |
| for d in /dev/sd?; do |
| if [ -e "$d" ]; then |
| # fast sequential read (to force some seeks) |
| should_never_die stress-disk -p10 "$d" & |
| |
| # slow small random read |
| should_never_die stress-disk -p0 -c4096 -m10 --random "$d" & |
| fi |
| done |
| |
| # NAND reads |
| #TODO(apenwarr): -c65536 causes memory allocation problems. |
| # This seems to be because the MTD driver tries to allocate kernel memory |
| # the same size as the read() parameter as a single contiguous block, |
| # which, under heavy load, might not be available. There's no good reason |
| # for MTD to do this, afaik, so we could try to debug the kernel so we |
| # can increase this parameter. It could theoretically cause problems on |
| # a normal system under high load, not just one being stresstested. |
| if [ -e /dev/mtd/rootfs0 ]; then |
| should_never_die stress-disk -p10 -c4096 /dev/mtd/rootfs0 & |
| fi |
| |
| # NOR reads |
| #TODO(apenwarr): see above about -c65536. |
| if [ -e /dev/mtd/hnvram ]; then |
| should_never_die stress-disk -p10 -c4096 /dev/mtd/hnvram & |
| fi |
| |
| sleep 5 |
| #TODO(apenwarr): actually bind the following to cpu0 and cpu1 |
| should_never_die nice -n 19 spin cpu0-idle & |
| should_never_die nice -n 19 spin cpu1-idle & |
| |
| wait |
| } |
| |
| |
| main 2>&1 | tee /proc/self/fd/2 | logos stresstest |