Skip to content

Instantly share code, notes, and snippets.

@ylluminate
Created August 27, 2024 02:54
Show Gist options
  • Save ylluminate/5e668091f1c6f0ed851250fed87ec197 to your computer and use it in GitHub Desktop.
Save ylluminate/5e668091f1c6f0ed851250fed87ec197 to your computer and use it in GitHub Desktop.
Average of resource samplings on macOS over a period of time with a given frequency to check resource usage with different configurations
#!/usr/bin/env zsh
# macOS Resource Sampler
# Version: 1.1
# This script samples system resources over a specified duration and reports averages.
#
# NOTE: Useful for measuring potential differentials in performance with different services disabled / enabled on macOS.
# Default values
DURATION=600 # 10 minutes
INTERVAL=5 # 5 seconds
# Function to print usage information
print_usage() {
echo "Usage: $0 [-d|--duration <seconds>] [-i|--interval <seconds>]"
echo " -d, --duration Duration to run the sampling (default: 600 seconds)"
echo " -i, --interval Interval between samples (default: 5 seconds)"
echo " -h, --help Display this help message"
}
# Parse command-line arguments
while [[ $# -gt 0 ]]; do
case $1 in
-d|--duration) DURATION="$2"; shift 2 ;;
-i|--interval) INTERVAL="$2"; shift 2 ;;
-h|--help) print_usage; exit 0 ;;
*) echo "Unknown option: $1"; print_usage; exit 1 ;;
esac
done
# Initialize variables for aggregation
total_processes=0
total_user_cpu=0
total_sys_cpu=0
total_idle_cpu=0
total_used_mem=0
total_unused_mem=0
sample_count=0
# Calculate number of iterations
iterations=$((DURATION / INTERVAL))
echo "Sampling system resources every $INTERVAL seconds for $DURATION seconds..."
# Function to update progress
update_progress() {
local elapsed=$1
local remaining=$((DURATION - elapsed))
local samples_left=$((iterations - sample_count))
printf "\rElapsed: %ds | Remaining: %ds | Samples left: %d" $elapsed $remaining $samples_left
}
# Sampling loop
start_time=$SECONDS
for ((i=1; i<=iterations; i++)); do
# Update progress
elapsed=$((SECONDS - start_time))
update_progress $elapsed
# Sample system resources
sample=$(top -l 1 | awk '
/Processes:/ {processes = $2}
/CPU usage:/ {user_cpu = $3; sys_cpu = $5; idle_cpu = $7}
/PhysMem:/ {used_mem = $2; unused_mem = $6}
END {
gsub(/[^0-9.]/, "", user_cpu)
gsub(/[^0-9.]/, "", sys_cpu)
gsub(/[^0-9.]/, "", idle_cpu)
gsub(/M/, "", used_mem)
gsub(/M/, "", unused_mem)
print processes, user_cpu, sys_cpu, idle_cpu, used_mem, unused_mem
}
')
# Aggregate data
read -r proc user sys idle used unused <<< $sample
(( total_processes += proc ))
total_user_cpu=$(echo "$total_user_cpu + $user" | bc)
total_sys_cpu=$(echo "$total_sys_cpu + $sys" | bc)
total_idle_cpu=$(echo "$total_idle_cpu + $idle" | bc)
total_used_mem=$(echo "$total_used_mem + $used" | bc)
total_unused_mem=$(echo "$total_unused_mem + $unused" | bc)
(( sample_count++ ))
# Sleep until next sample
sleep $INTERVAL
done
# Clear the progress line
printf "\r%*s\r" $(tput cols) ""
# Calculate averages
avg_processes=$((total_processes / sample_count))
avg_user_cpu=$(echo "scale=2; $total_user_cpu / $sample_count" | bc)
avg_sys_cpu=$(echo "scale=2; $total_sys_cpu / $sample_count" | bc)
avg_idle_cpu=$(echo "scale=2; $total_idle_cpu / $sample_count" | bc)
avg_used_mem=$(echo "scale=2; $total_used_mem / $sample_count" | bc)
avg_unused_mem=$(echo "scale=2; $total_unused_mem / $sample_count" | bc)
# Print results
echo "Average system resource usage over $DURATION seconds:"
echo "Processes: $avg_processes"
echo "CPU usage: ${avg_user_cpu}% user, ${avg_sys_cpu}% sys, ${avg_idle_cpu}% idle"
echo "Memory: ${avg_used_mem}M used, ${avg_unused_mem}M unused"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment