#!/bin/sh # # Find the maximum I/O size for a single read/write syscall # Uses binary search after detecting the approximate limit by doubling # # Works on Linux, BSD, and other POSIX systems set -eu # Start with 1 MB size=$((1024 * 1024)) prev_size=0 echo "Finding maximum syscall I/O size..." echo "Starting from 1 MB and doubling until limit is reached" echo "" while true; do # Convert size to human-readable format if [ "$size" -lt $((1024 * 1024)) ]; then size_kb=$((size / 1024)) size_str="${size_kb} KB" elif [ "$size" -lt $((1024 * 1024 * 1024)) ]; then size_mb=$((size / 1024 / 1024)) size_str="${size_mb} MB" else size_gb=$((size / 1024 / 1024 / 1024)) size_str="${size_gb} GB" fi printf "Testing size: %s ... " "$size_str" # Read 'size' bytes in one syscall and count actual bytes read bytes_read=$(dd status=none if=/dev/zero count=1 bs="$size" 2>/dev/null | wc -c) # Check if we got fewer bytes than requested (short read) if [ "$prev_size" -gt 0 ] && [ "$bytes_read" -lt "$size" ]; then echo "LIMIT REACHED" echo "" echo "Starting binary search between $prev_size and $size bytes..." echo "" # Binary search for exact limit low=$prev_size high=$size initial_high=$high # Calculate human-readable format for initial_high if [ "$initial_high" -lt $((1024 * 1024)) ]; then initial_high_kb=$((initial_high / 1024)) initial_high_str="${initial_high_kb} KB" elif [ "$initial_high" -lt $((1024 * 1024 * 1024)) ]; then initial_high_mb=$((initial_high / 1024 / 1024)) initial_high_str="${initial_high_mb} MB" else initial_high_gb=$((initial_high / 1024 / 1024 / 1024)) initial_high_str="${initial_high_gb} GB" fi while [ $((high - low)) -gt 1 ]; do mid=$(((low + high) / 2)) # Calculate how much we subtracted from initial_high subtracted=$((initial_high - mid)) printf " Trying %s - %d bytes ... " "$initial_high_str" "$subtracted" # Test if this size works - check if we get all bytes bytes_read=$(dd status=none if=/dev/zero count=1 bs="$mid" 2>/dev/null | wc -c) if [ "$bytes_read" -eq "$mid" ]; then echo "OK" low=$mid else echo "FAIL" high=$mid fi done echo "" echo "=======================================" echo " MAXIMUM SYSCALL I/O SIZE: $low bytes" echo "=======================================" printf " Decimal: %d\n" "$low" printf " Hex: 0x%x\n" "$low" echo "" exit 0 fi echo "OK" # Save current size for next iteration prev_size=$size # Double the size for next iteration new_size=$((size * 2)) # Check for overflow (when doubling causes a negative number or smaller value) if [ "$new_size" -le "$size" ]; then echo "" echo "Reached maximum representable size without hitting limit" echo "Maximum tested size: $size bytes ($size_str)" exit 0 fi size=$new_size done