Created
August 27, 2024 02:54
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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