name: Memory/CPU/Disk/stress tests production on: workflow_dispatch: jobs: benchmark-memory-speed: name: macOS Performance Benchmark--Production images runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [macos-13, macos-14, macos-15] steps: - name: Install sysbench shell: bash run: brew install sysbench # Description: The Memory Metrics Test is designed to gather and analyze memory-related system metrics on macOS environments. # It checks total memory, free memory, and memory usage percentage, ensuring enough memory is available for test execution. - name: Memory Metrics Test shell: bash id: memory_metrics run: | echo "========================================" echo "🚀 Memory Metrics Test Started" echo "========================================" # Get total memory directly from macOS system info total_memory_bytes=$(sysctl -n hw.memsize) total_memory_gb=$(sysctl -n hw.memsize | awk '{print $1 / 1024 / 1024 / 1024}') echo "Detected Total Memory: ${total_memory_gb} GB" # Detect correct page size (macOS 15 uses 16K pages) page_size=$(sysctl -n hw.pagesize) echo "Detected Page Size: $page_size bytes" # Get free memory from vm_stat vm_stat_output=$(vm_stat) pages_free=$(echo "$vm_stat_output" | awk '/Pages free/ {gsub("\\.","",$3); print $3}') free_memory_bytes=$((pages_free * page_size)) free_memory_mb=$((free_memory_bytes / 1024 / 1024)) # Compute used memory correctly used_memory_mb=$(( (total_memory_bytes - free_memory_bytes) / 1024 / 1024 )) # Ensure total memory is valid before calculating percentage if [ "$total_memory_bytes" -gt 0 ]; then used_percentage=$(( (used_memory_mb * 100) / (total_memory_bytes / 1024 / 1024) )) else used_percentage=0 fi # Reserve memory for the runner (1GB recommended) runner_reserved_memory_mb=1024 # 1GB reserved for system processes adjusted_memory_mb=$(( (total_memory_bytes / 1024 / 1024) - runner_reserved_memory_mb )) # Ensure adjusted memory does not go below a safe limit (2GB) safe_memory_limit_mb=2048 if [ "$adjusted_memory_mb" -lt "$safe_memory_limit_mb" ]; then adjusted_memory_mb=$safe_memory_limit_mb fi # Print memory details echo "🖥️ Total Memory: ${total_memory_gb} GB" echo "🆓 Free Memory: ${free_memory_mb} MB" echo "🔥 Memory Used: ${used_memory_mb} MB" echo "📊 Memory Usage Percentage: $used_percentage%" echo "⚠️ Reserved Memory for Runner: ${runner_reserved_memory_mb} MB" echo "✅ Memory Available for Tests: ${adjusted_memory_mb} MB" # Check if memory usage is too high (above 70%) memory_usage_limit=70 if [ "$used_percentage" -gt "$memory_usage_limit" ]; then echo "⚠️ WARNING: Memory usage is above ${memory_usage_limit}%! (${used_percentage}%)" echo "⚠️ Consider reducing memory usage before running tests." fi # Store values in GitHub Actions environment variables echo "TOTAL_MEMORY=$adjusted_memory_mb" >> $GITHUB_ENV echo "USED_PERCENTAGE=$used_percentage" >> $GITHUB_ENV # Description: This test measures system memory read performance using sysbench. # It verifies that memory read speed meets the expected threshold, ensuring stable system performance for workloads requiring high memory throughput. - name: Benchmark Memory Read Speed shell: bash run: | echo "Benchmarking memory read speed..." START_TIME=$(date +%s) # Capture start time sysbench memory --memory-block-size=1M --memory-total-size=${{ env.TOTAL_MEMORY }}M --memory-oper=read run | tee benchmark_read.txt END_TIME=$(date +%s) # Capture end time EXECUTION_TIME=$((END_TIME - START_TIME)) # Calculate elapsed time echo "Execution Time: $EXECUTION_TIME seconds" # Extract throughput value (remove parentheses and keep only the number) THROUGHPUT=$(grep "MiB transferred" benchmark_read.txt | awk -F'[()]' '{print $2}' | awk '{print $1}') # Print extracted value echo "Extracted Memory Read Throughput: ${THROUGHPUT} MB/sec" # Define minimum expected throughput MIN_THROUGHPUT=500 # Check if throughput is valid and numeric using bc for floating point comparison if [[ -z "$THROUGHPUT" || ! "$THROUGHPUT" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then echo "⚠️ Warning: Could not extract a valid memory read speed." elif (( $(echo "$THROUGHPUT < $MIN_THROUGHPUT" | bc -l) )); then echo "⚠️ Warning: Memory read speed is below the expected threshold: ${THROUGHPUT} MB/sec (Expected: ${MIN_THROUGHPUT} MB/sec)" else echo "✅ Memory read speed: ${THROUGHPUT} MB/sec (Threshold: ${MIN_THROUGHPUT} MB/sec)" fi # Export variables for telemetry tracking echo "EXECUTION_TIME=$EXECUTION_TIME" >> $GITHUB_ENV echo "THROUGHPUT=$THROUGHPUT" >> $GITHUB_ENV echo "Benchmark completed!" exit 0 # Ensure script always exits successfully # Description: This test measures system memory write performance using sysbench. # It ensures that memory write speed meets the expected threshold, which is critical for performance-intensive applications. - name: Benchmark Memory Write Speed shell: bash run: | echo "Benchmarking memory write speed..." START_TIME=$(date +%s) # Capture start time sysbench memory --memory-block-size=1M --memory-total-size=${{ env.TOTAL_MEMORY }}M --memory-oper=write run | tee benchmark_write.txt END_TIME=$(date +%s) # Capture end time EXECUTION_TIME=$((END_TIME - START_TIME)) # Calculate elapsed time echo "Execution Time: $EXECUTION_TIME seconds" # Extract throughput value (remove parentheses and keep only the number) THROUGHPUT=$(grep "MiB transferred" benchmark_write.txt | awk -F'[()]' '{print $2}' | awk '{print $1}') # Print extracted value echo "Extracted Memory Write Throughput: ${THROUGHPUT} MB/sec" # Define minimum expected throughput MIN_THROUGHPUT=500 # Check if throughput is valid and numeric using bc for floating point comparison if [[ -z "$THROUGHPUT" || ! "$THROUGHPUT" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then echo "⚠️ Warning: Could not extract a valid memory read speed." elif (( $(echo "$THROUGHPUT < $MIN_THROUGHPUT" | bc -l) )); then echo "⚠️ Warning: Memory write speed is below the expected threshold: ${THROUGHPUT} MB/sec (Expected: ${MIN_THROUGHPUT} MB/sec)" else echo "✅ Memory write speed: ${THROUGHPUT} MB/sec (Threshold: ${MIN_THROUGHPUT} MB/sec)" fi # Export variables for telemetry tracking echo "EXECUTION_TIME_WRITE=$EXECUTION_TIME" >> $GITHUB_ENV echo "THROUGHPUT_WRITE=$THROUGHPUT" >> $GITHUB_ENV echo "Benchmark completed!" # Description: This test benchmarks memory performance using a custom block size and total memory size. # It measures throughput and ensures the system meets the minimum required memory performance standards. - name: Customizing Block Size & Total Memory shell: bash run: | echo "============================================" echo "🚀 Starting Memory Benchmark Test with Custom Block Size & Total Memory" echo "============================================" # Define test parameters MEMORY_BLOCK_SIZE="1M" TOTAL_MEMORY="10G" MIN_THROUGHPUT=500 # Minimum acceptable throughput in MB/sec # Run sysbench memory benchmark START_TIME=$(date +%s) sysbench memory --memory-block-size=$MEMORY_BLOCK_SIZE --memory-total-size=$TOTAL_MEMORY run | tee memory_test.txt END_TIME=$(date +%s) EXECUTION_TIME=$((END_TIME - START_TIME)) echo "Execution Time: $EXECUTION_TIME seconds" # Extract Memory Throughput (MB/sec) THROUGHPUT=$(grep "MiB transferred" memory_test.txt | awk -F'[()]' '{print $2}' | awk '{print $1}') # Validate throughput extraction if [[ -z "$THROUGHPUT" || ! "$THROUGHPUT" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then echo "⚠️ Warning: Could not extract a valid memory throughput value." THROUGHPUT=0 # Default to 0 if extraction fails else echo "✅ Extracted Memory Throughput: ${THROUGHPUT} MB/sec" fi # Performance validation check if [[ $(echo "$THROUGHPUT < $MIN_THROUGHPUT" | bc -l) -eq 1 ]]; then echo "⚠️ Warning: Memory throughput ($THROUGHPUT MB/sec) is below the expected threshold ($MIN_THROUGHPUT MB/sec)." else echo "✅ Memory throughput is within acceptable limits." fi # Export metrics for logging echo "EXECUTION_TIME=$EXECUTION_TIME" >> $GITHUB_ENV echo "THROUGHPUT=$THROUGHPUT" >> $GITHUB_ENV echo "============================================" echo "✅ Memory Benchmark Completed" echo "============================================" # Description: This test benchmarks multi-threaded memory performance using 8 concurrent threads. # It measures both read and write throughput to ensure the system handles parallel memory operations efficiently. - name: Multi-Threaded Memory Test shell: bash run: | echo "============================================" echo "🚀 Starting Multi-Threaded Memory Test (8 Threads)" echo "============================================" # Define test parameters MEMORY_BLOCK_SIZE="1M" TOTAL_MEMORY="${{ env.TOTAL_MEMORY }}M" MIN_THROUGHPUT=500 # Minimum acceptable throughput in MB/sec # Run memory read test echo "📌 Running Multi-Threaded Memory Read Test..." START_TIME=$(date +%s) sysbench memory --memory-block-size=$MEMORY_BLOCK_SIZE --memory-total-size=$TOTAL_MEMORY --memory-oper=read --threads=8 run | tee memory_read.txt END_TIME=$(date +%s) EXECUTION_TIME_READ=$((END_TIME - START_TIME)) MEMORY_READ_SPEED=$(grep "MiB transferred" memory_read.txt | awk -F'[()]' '{print $2}' | awk '{print $1}') # Validate read throughput extraction if [[ -z "$MEMORY_READ_SPEED" || ! "$MEMORY_READ_SPEED" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then echo "⚠️ Warning: Could not extract a valid memory read throughput." MEMORY_READ_SPEED=0 else echo "✅ Extracted Multi-Threaded Memory Read Throughput: ${MEMORY_READ_SPEED} MB/sec" fi # Run memory write test echo "📌 Running Multi-Threaded Memory Write Test..." START_TIME=$(date +%s) sysbench memory --memory-block-size=$MEMORY_BLOCK_SIZE --memory-total-size=$TOTAL_MEMORY --memory-oper=write --threads=8 run | tee memory_write.txt END_TIME=$(date +%s) EXECUTION_TIME_WRITE=$((END_TIME - START_TIME)) MEMORY_WRITE_SPEED=$(grep "MiB transferred" memory_write.txt | awk -F'[()]' '{print $2}' | awk '{print $1}') # Validate write throughput extraction if [[ -z "$MEMORY_WRITE_SPEED" || ! "$MEMORY_WRITE_SPEED" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then echo "⚠️ Warning: Could not extract a valid memory write throughput." MEMORY_WRITE_SPEED=0 else echo "✅ Extracted Multi-Threaded Memory Write Throughput: ${MEMORY_WRITE_SPEED} MB/sec" fi # Performance validation check for read if [[ $(echo "$MEMORY_READ_SPEED < $MIN_THROUGHPUT" | bc -l) -eq 1 ]]; then echo "⚠️ Warning: Multi-threaded memory read speed ($MEMORY_READ_SPEED MB/sec) is below the expected threshold ($MIN_THROUGHPUT MB/sec)." else echo "✅ Multi-threaded memory read speed is within acceptable limits." fi # Performance validation check for write if [[ $(echo "$MEMORY_WRITE_SPEED < $MIN_THROUGHPUT" | bc -l) -eq 1 ]]; then echo "⚠️ Warning: Multi-threaded memory write speed ($MEMORY_WRITE_SPEED MB/sec) is below the expected threshold ($MIN_THROUGHPUT MB/sec)." else echo "✅ Multi-threaded memory write speed is within acceptable limits." fi # Calculate total execution time TOTAL_EXECUTION_TIME=$((EXECUTION_TIME_READ + EXECUTION_TIME_WRITE)) # Export results for further analysis echo "EXECUTION_TIME=$TOTAL_EXECUTION_TIME" >> $GITHUB_ENV echo "THROUGHPUT_READ=$MEMORY_READ_SPEED" >> $GITHUB_ENV echo "THROUGHPUT_WRITE=$MEMORY_WRITE_SPEED" >> $GITHUB_ENV echo "============================================" echo "✅ Multi-Threaded Memory Test Completed" echo "============================================" # Description: This test measures memory read and write performance by running sysbench for a fixed duration of 30 seconds per test. # It evaluates how the system performs under sustained memory operations using 8 concurrent threads. - name: Running for a Fixed Time shell: bash run: | echo "============================================" echo "🚀 Running Memory Benchmark for a Fixed Time (30 seconds per test)" echo "============================================" # Define test parameters MEMORY_BLOCK_SIZE="1M" THREADS=8 TEST_DURATION=30 # Run test for 30 seconds MIN_THROUGHPUT=500 # Minimum acceptable throughput in MB/sec # Run memory read test echo "📌 Running Memory Read Test for $TEST_DURATION seconds..." START_TIME=$(date +%s) sysbench memory --memory-block-size=$MEMORY_BLOCK_SIZE --memory-total-size=0 --memory-oper=read --threads=$THREADS --time=$TEST_DURATION run | tee memory_read_fixed.txt END_TIME=$(date +%s) EXECUTION_TIME_READ=$((END_TIME - START_TIME)) MEMORY_READ_SPEED=$(grep "MiB transferred" memory_read_fixed.txt | awk -F'[()]' '{print $2}' | awk '{print $1}') # Validate read throughput extraction if [[ -z "$MEMORY_READ_SPEED" || ! "$MEMORY_READ_SPEED" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then echo "⚠️ Warning: Could not extract a valid memory read throughput." MEMORY_READ_SPEED=0 else echo "✅ Extracted Memory Read Throughput: ${MEMORY_READ_SPEED} MB/sec" fi # Run memory write test echo "📌 Running Memory Write Test for $TEST_DURATION seconds..." START_TIME=$(date +%s) sysbench memory --memory-block-size=$MEMORY_BLOCK_SIZE --memory-total-size=0 --memory-oper=write --threads=$THREADS --time=$TEST_DURATION run | tee memory_write_fixed.txt END_TIME=$(date +%s) EXECUTION_TIME_WRITE=$((END_TIME - START_TIME)) MEMORY_WRITE_SPEED=$(grep "MiB transferred" memory_write_fixed.txt | awk -F'[()]' '{print $2}' | awk '{print $1}') # Validate write throughput extraction if [[ -z "$MEMORY_WRITE_SPEED" || ! "$MEMORY_WRITE_SPEED" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then echo "⚠️ Warning: Could not extract a valid memory write throughput." MEMORY_WRITE_SPEED=0 else echo "✅ Extracted Memory Write Throughput: ${MEMORY_WRITE_SPEED} MB/sec" fi # Performance validation check for read if [[ $(echo "$MEMORY_READ_SPEED < $MIN_THROUGHPUT" | bc -l) -eq 1 ]]; then echo "⚠️ Warning: Memory read speed ($MEMORY_READ_SPEED MB/sec) is below the expected threshold ($MIN_THROUGHPUT MB/sec)." else echo "✅ Memory read speed is within acceptable limits." fi # Performance validation check for write if [[ $(echo "$MEMORY_WRITE_SPEED < $MIN_THROUGHPUT" | bc -l) -eq 1 ]]; then echo "⚠️ Warning: Memory write speed ($MEMORY_WRITE_SPEED MB/sec) is below the expected threshold ($MIN_THROUGHPUT MB/sec)." else echo "✅ Memory write speed is within acceptable limits." fi # Calculate total execution time TOTAL_EXECUTION_TIME=$((EXECUTION_TIME_READ + EXECUTION_TIME_WRITE)) # Export results for further analysis echo "EXECUTION_TIME=$TOTAL_EXECUTION_TIME" >> $GITHUB_ENV echo "THROUGHPUT_READ=$MEMORY_READ_SPEED" >> $GITHUB_ENV echo "THROUGHPUT_WRITE=$MEMORY_WRITE_SPEED" >> $GITHUB_ENV echo "============================================" echo "✅ Memory Benchmark for Fixed Time Completed" echo "============================================" # Description: This test performs an intensive memory stress test using sysbench to push system memory performance to its limits. # It writes 100GB of data in 4MB blocks across 16 threads to evaluate system stability, throughput, and resilience under extreme load. - name: Extreme Stress Test shell: bash run: | echo "========================================" echo "⚠️ Running an EXTREME memory stress test! This may take a long time." echo "========================================" # Define test parameters MEMORY_BLOCK_SIZE="4M" TOTAL_MEMORY="100G" THREADS=16 MIN_THROUGHPUT=1000 # Minimum acceptable throughput in MB/sec # Start timer START_TIME=$(date +%s) # Run stress test and capture logs sysbench memory --memory-block-size=$MEMORY_BLOCK_SIZE --memory-total-size=$TOTAL_MEMORY --memory-oper=write --threads=$THREADS run | tee memory_stress_test.txt EXIT_STATUS=$? # End timer END_TIME=$(date +%s) EXECUTION_TIME=$((END_TIME - START_TIME)) # Check if the test failed if [[ $EXIT_STATUS -ne 0 ]]; then echo "❌ Memory stress test failed due to system limits or OOM (Out of Memory) conditions." THROUGHPUT=0 else # Extract Memory Throughput (MB/sec) THROUGHPUT=$(grep "MiB transferred" memory_stress_test.txt | awk -F'[()]' '{print $2}' | awk '{print $1}') # Validate throughput extraction if [[ -z "$THROUGHPUT" || ! "$THROUGHPUT" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then echo "⚠️ Warning: Could not extract a valid memory throughput value." THROUGHPUT=0 else echo "✅ Extracted Memory Write Throughput: ${THROUGHPUT} MB/sec" fi fi # Performance validation check if [[ $(echo "$THROUGHPUT < $MIN_THROUGHPUT" | bc -l) -eq 1 ]]; then echo "⚠️ Warning: Memory write speed ($THROUGHPUT MB/sec) is below the expected threshold ($MIN_THROUGHPUT MB/sec)." else echo "✅ Memory write speed is within acceptable limits." fi # Store metrics in environment variables echo "EXECUTION_TIME=$EXECUTION_TIME" >> $GITHUB_ENV echo "THROUGHPUT=$THROUGHPUT" >> $GITHUB_ENV echo "========================================" echo "✅ Memory performance validation Completed" echo "========================================" # ------------------------------- CPU stress Test cases -------------------- # Description: These `stress-ng` tests evaluate CPU performance across floating-point operations,recursion depth, integer arithmetic, prime number calculations, and bitwise operations. # They help assess computational efficiency, stack usage, and memory impact under load. 🚀 - name: Install stress tools (macOS) shell: bash run: | brew install stress-ng - name: Run CPU Stress Test shell: bash run: | echo "========================================" echo "🚀 CPU Metrics Test Started" echo "========================================" stress-ng --cpu 4 --cpu-method matrixprod --cpu-ops 200 --metrics-brief --verbose stress-ng --cpu 4 --cpu-method ackermann --cpu-ops 200 --metrics-brief --verbose stress-ng --cpu 4 --cpu-method fibonacci --cpu-ops 200 --metrics-brief --verbose stress-ng --cpu 4 --cpu-method prime --cpu-ops 200 --metrics-brief --verbose stress-ng --cpu 4 --cpu-method sieve --cpu-ops 200 --metrics-brief --verbose stress-ng --cpu 4 --cpu-method bitops --cpu-ops 200 --metrics-brief --verbose echo "========================================" echo "🚀 CPU Metrics Test End" echo "========================================" - name: Check CPU Load Threshold shell: bash run: | echo "Checking CPU Load..." # Get CPU Load Percentage (User + System Load) cpu_load=$(top -l 1 | awk -F'[:,]' '/CPU usage/ {print $2 + $4}' | tr -d ' ') echo "🖥️ Current CPU Load: ${cpu_load}%" # Check if CPU load exceeds 90% if (( $(echo "$cpu_load > 90" | bc -l) )); then echo "🚨 Warning:High CPU Load Detected! ($cpu_load%) Exceeding 90% threshold." elif (( $(echo "$cpu_load > 70" | bc -l) )); then echo "⚠️ Warning: CPU Load is High ($cpu_load%)" else echo "✅ CPU Load is Normal ($cpu_load%)" fi # -------------------------------------------------Disk I/O threshold test cases--------------------------------- - name: Install fio and iostat shell: bash run: | # Install fio for I/O testing and iostat for disk stats brew install fio # brew install sysstat - name: Run sequential write test with fio id: sequential_write shell: bash run: | # Start the sequential write test with fio echo "=================================================" echo "🚀 Running sequential write test for Disk I/O 💾..." echo "=================================================" # Run fio test and store output - measure Disk I/O speed fio_output=$(fio --name=write_test --rw=write --bs=4k --size=4G --numjobs=$(sysctl -n hw.ncpu)) # Display the full output of fio echo "$fio_output" # Extract IOPS, and bandwidth from the fio output WRITE_IOPS=$(echo "$fio_output" | grep 'IOPS' | tail -n 1 | awk '{print $2}') WRITE_BW=$(echo "$fio_output" | grep 'bw=' | tail -n 1 | awk '{print $2}' | sed 's/.$//') # Remove trailing 'B' for bandwidth # Define thresholds for IOPS IOPS_THRESHOLD=5000 # 5000 IOPS threshold # Output the extracted IOPS, and bandwidth for reference echo "Write IOPS: $WRITE_IOPS" echo "Write Bandwidth: $WRITE_BW MiB/s" # Flag to indicate if performance is below threshold IOPS_OK=true # Check if IOPS falls below the threshold if (( WRITE_IOPS < IOPS_THRESHOLD )); then echo "⚠️ Warning: Write IOPS fell below threshold ($IOPS_THRESHOLD IOPS) with $WRITE_IOPS IOPS" IOPS_OK=false fi # If all thresholds are met, confirm the performance is within limits if $IOPS_OK; then echo "✅ Sequential write performance is within acceptable limits: IOPS: $WRITE_IOPS, Bandwidth: $WRITE_BW MiB/s" else echo "❌ Sequential write performance did not meet acceptable limits." fi # Calculate disk I/O avargae read/writes count echo "=====================================================" echo "🚀 Calculating avarge read/writes of disk 💾.." echo "=====================================================" # Detect the disk name dynamically disk_name=$(iostat -d | awk 'NR==3 {print $1}') if [ -z "$disk_name" ]; then echo "❌ Error: No disk found!" disk_error=true else disk_error=false fi # Capture iostat output and extract reads/writes if disk was found if [ "$disk_error" = false ]; then iostat -d $disk_name 1 5 | awk -v disk="$disk_name" ' BEGIN {reads=0; writes=0; count=0} $1 == disk {reads+=$3; writes+=$4; count++} END { if (count > 0) { print "✅ Average Reads/s:", reads/count, "Average Writes/s:", writes/count; } else { print "❌ Error: No disk activity detected!"; } } ' else echo "❌ Skipping disk I/O calculations due to missing disk 💾 ." fi #------------------Incremental stress test cases - Memory,CPU,Disk I/O,Memory Read/Write, File system-------------------# ##This section outlines a series of incremental stress tests designed to evaluate the system's performance under increasing load across multiple resources: Memory, CPU, Disk I/O, Memory Read/Write, and File System.## - name: Install stress tools (macOS) shell: bash run: | echo "Checking if stress-ng is already installed..." if ! brew list stress-ng &>/dev/null; then echo "Installing coreutils (for gtimeout)..." brew list coreutils &>/dev/null || brew install coreutils || echo "⚠️ Warning: Failed to install coreutils, continuing..." echo "Installing stress-ng..." if command -v gtimeout &>/dev/null; then gtimeout 300 brew install stress-ng || echo "⚠️ Warning: Failed to install stress-ng, but continuing..." else echo "⚠️ Warning: gtimeout not found, running without timeout..." brew install stress-ng || echo "⚠️ Warning: Failed to install stress-ng, but continuing..." fi else echo "✅ stress-ng is already installed." fi - name: Run Incremental Memory Stress Test shell: bash continue-on-error: true # Allows next steps to execute even if this one fails run: | VM_OPS_START=200 # Initial value VM_OPS_INCREMENT=100 # Step increment VM_OPS_MAX=3000 # Maximum limit VM_BYTES=2G # Memory allocation LOG_FILE="stress_test_results.log" echo "Starting incremental memory stress test..." | tee $LOG_FILE for ((vm_ops=$VM_OPS_START; vm_ops<=$VM_OPS_MAX; vm_ops+=$VM_OPS_INCREMENT)); do echo "Running stress-ng with --vm-ops=$vm_ops" | tee -a $LOG_FILE if stress-ng --vm 2 --vm-bytes $VM_BYTES --vm-ops $vm_ops --metrics-brief --verbose; then echo "✅ Passed: --vm-ops=$vm_ops" | tee -a $LOG_FILE else echo "❌ Failed: --vm-ops=$vm_ops" | tee -a $LOG_FILE echo "⚠️ Stopping further increments as failure occurred at --vm-ops=$vm_ops" | tee -a $LOG_FILE break # Stops increasing vm-ops but allows next workflow steps to run fi echo "---------------------------------------------" | tee -a $LOG_FILE done echo "Stress test completed. Check $LOG_FILE for details." | tee -a $LOG_FILE # Add Incremental CPU Stress Test here - name: Run Incremental CPU Stress Test shell: bash continue-on-error: true # Allows next steps to execute even if this one fails run: | # Get the number of CPU cores available on the system (for macOS) CPU_CORES=$(sysctl -n hw.physicalcpu) # macOS command to get the number of physical CPU cores echo "Detected $CPU_CORES CPU cores." # Define the starting and maximum stressors and the increment CPU_CORES_START=2 # Start with 2 CPU stressors CPU_CORES_INCREMENT=2 # Increase by 2 each iteration CPU_CORES_MAX=$((CPU_CORES * 2)) # Maximum number of CPU stressors (set to 2 * number of cores detected) # Set initial operations per stressor. This can be dynamically calculated based on the number of cores. BASE_CPU_OPS=5000 # Base number of operations per stressor for initial low load CPU_OPS=$((BASE_CPU_OPS * CPU_CORES)) # Multiply base operations with the number of cores to increase load with more stressors LOG_FILE="cpu_stress_results.log" # Log file for results echo "Testing with stressors from $CPU_CORES_START to $CPU_CORES_MAX (based on $CPU_CORES cores)." | tee -a $LOG_FILE echo "Initial operations per stressor: $CPU_OPS" | tee -a $LOG_FILE # Incrementally increase CPU stressors and operations per stressor for ((cpu_cores=$CPU_CORES_START; cpu_cores<=$CPU_CORES_MAX; cpu_cores+=$CPU_CORES_INCREMENT)); do # Adjust operations based on the number of cores for higher load CPU_OPS=$((BASE_CPU_OPS * cpu_cores)) # Increasing number of operations with stressor count echo "Running stress-ng with --cpu $cpu_cores --cpu-ops $CPU_OPS" | tee -a $LOG_FILE # Run the CPU stress test with increasing CPU stressors if stress-ng --cpu $cpu_cores --cpu-method matrixprod --cpu-ops $CPU_OPS --metrics-brief --verbose; then echo "✅ Passed: --cpu=$cpu_cores with $CPU_OPS operations" | tee -a $LOG_FILE else echo "❌ Failed: --cpu=$cpu_cores with $CPU_OPS operations" | tee -a $LOG_FILE echo "⚠️ Stopping further increments as failure occurred at --cpu=$cpu_cores" | tee -a $LOG_FILE break # Stop the test if failure occurs fi echo "---------------------------------------------" | tee -a $LOG_FILE done echo "CPU Stress test completed. Check $LOG_FILE for details." | tee -a $LOG_FILE - name: Run Incremental Disk I/O Stress Test shell: bash continue-on-error: true # Allows next steps to execute even if this one fails run: | # Define test parameters DISK_OPS_START=1000 # Start with 1000 disk operations DISK_OPS_INCREMENT=1000 # Increase by 1000 disk operations each iteration DISK_OPS_MAX=18000 # Maximum number of disk operations (adjust as needed) DISK_SIZE=5G # Size of the test file to use for stress LOG_FILE="disk_stress_results.log" # Log file for results echo "Starting incremental disk I/O stress test..." | tee $LOG_FILE # Create an initial test file dd if=/dev/zero of=./testfile bs=1M count=1024 oflag=direct sync # Ensure disk write is flushed # Loop for disk I/O stress test with increasing operations for ((disk_ops=$DISK_OPS_START; disk_ops<=$DISK_OPS_MAX; disk_ops+=$DISK_OPS_INCREMENT)); do echo "Running disk I/O stress with $disk_ops operations" | tee -a $LOG_FILE # Use dd to stress the disk by writing and reading data dd_output=$(dd if=/dev/zero of=./testfile bs=1M count=$disk_ops oflag=direct 2>&1) sync # Ensure disk write is flushed sleep 2 # Log the dd output echo "$dd_output" | tee -a $LOG_FILE # Measure the performance using iostat to capture disk I/O stats echo "Calculating disk I/O operations..." | tee -a $LOG_FILE iostat_output=$(iostat -d 1 10) echo "$iostat_output" | tee -a $LOG_FILE # Check disk I/O operations (Reads/Writes) iostat_summary=$(iostat -d | awk 'NR>2 {print $1 " reads=" $3 " writes=" $4}') echo "Disk I/O stats for current iteration:" | tee -a $LOG_FILE echo "$iostat_summary" | tee -a $LOG_FILE # Check for performance issues if [[ $dd_output == *"error"* || $iostat_summary == *"NaN"* ]]; then echo "❌ Failed: disk operations=$disk_ops" | tee -a $LOG_FILE echo "⚠️ Stopping further increments due to performance issues." | tee -a $LOG_FILE break # Stop the test if failure occurs else echo "✅ Passed: disk operations=$disk_ops" | tee -a $LOG_FILE fi echo "---------------------------------------------" | tee -a $LOG_FILE done # Clean up: remove the test file rm -f ./testfile echo "Disk stress test completed. Check $LOG_FILE for details." | tee -a $LOG_FILE #memory read write stress test - name: Run Incremental Memory Read/Write Stress Test shell: bash continue-on-error: true # Allows next steps to execute even if this one fails run: | # Define test parameters MEM_OPS_START=1000 # Start with 1000 memory read/write operations MEM_OPS_INCREMENT=1000 # Increase by 1000 operations each iteration MEM_OPS_MAX=20000 # Maximum number of operations MEM_SIZE=2G # Starting size of memory to stress LOG_FILE="memory_stress_results.log" # Log file for results echo "Starting incremental memory read/write stress test..." | tee $LOG_FILE # Loop for memory read/write stress test with increasing operations for ((mem_ops=$MEM_OPS_START; mem_ops<=$MEM_OPS_MAX; mem_ops+=$MEM_OPS_INCREMENT)); do echo "Running stress-ng with --vm 2 --vm-bytes $MEM_SIZE --vm-ops $mem_ops" | tee -a $LOG_FILE # Run the memory stress test with increasing memory operations if stress-ng --vm 2 --vm-bytes $MEM_SIZE --vm-ops $mem_ops --metrics-brief --verbose; then echo "✅ Passed: --vm-ops=$mem_ops with $MEM_SIZE allocated memory" | tee -a $LOG_FILE else echo "❌ Failed: --vm-ops=$mem_ops with $MEM_SIZE allocated memory" | tee -a $LOG_FILE echo "⚠️ Stopping further increments as failure occurred at --vm-ops=$mem_ops" | tee -a $LOG_FILE break # Stop the test if failure occurs fi echo "---------------------------------------------" | tee -a $LOG_FILE done echo "Memory Read/Write stress test completed. Check $LOG_FILE for details." | tee -a $LOG_FILE # Incremental file system stress test - name: Run Incremental File System Stress Test shell: bash continue-on-error: true # Allows next steps to execute even if this one fails run: | # Define variables for the incremental file system stress test FALLOCATE_OPS_START=1000 # Initial number of allocate operations FALLOCATE_OPS_INCREMENT=500 # Increment step for allocate operations FALLOCATE_OPS_MAX=8000 # Maximum value for allocate operations LOG_FILE="filesystem_stress_results.log" # Log file for file system stress test results echo "Starting incremental file system stress test..." | tee $LOG_FILE # Loop through file system allocation increments for ((fallocate_ops=$FALLOCATE_OPS_START; fallocate_ops<=$FALLOCATE_OPS_MAX; fallocate_ops+=$FALLOCATE_OPS_INCREMENT)); do # Print which iteration is being run echo "Running stress-ng with --fallocate-ops=$fallocate_ops" | tee -a $LOG_FILE # Run the file system stress test with the current number of allocate operations if stress-ng --fallocate 2 --fallocate-ops $fallocate_ops --metrics-brief --verbose; then echo "✅ Passed: --fallocate-ops=$fallocate_ops" | tee -a $LOG_FILE # Log success else echo "❌ Failed: --fallocate-ops=$fallocate_ops" | tee -a $LOG_FILE # Log failure echo "⚠️ Stopping further increments as failure occurred at --fallocate-ops=$fallocate_ops" | tee -a $LOG_FILE break # Stop further increments if failure occurs fi echo "---------------------------------------------" | tee -a $LOG_FILE done echo "File system stress test completed. Check $LOG_FILE for details." | tee -a $LOG_FILE - name: Clean up (optional) shell: bash run: | rm -f ./testfile