146 lines
3.9 KiB
Bash
Executable File
146 lines
3.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
api_url="http://localhost:4001/api/links"
|
|
num_links=1000
|
|
num_requests=10
|
|
resource_usage_interval=1 # Interval in seconds for resource usage logging
|
|
|
|
semaphore="/tmp/semaphore"
|
|
max_concurrent_processes=$(ulimit -u) # Adjust this number based on your system's capability
|
|
|
|
# Initialize semaphore
|
|
mkfifo $semaphore
|
|
exec 3<> $semaphore
|
|
rm $semaphore
|
|
|
|
for ((i=0; i<max_concurrent_processes; i++)); do
|
|
echo >&3
|
|
done
|
|
|
|
echo "Semaphore initialized with $max_concurrent_processes slots."
|
|
|
|
function get_resource_usage {
|
|
while true; do
|
|
docker stats --no-stream --format "{{.MemUsage}} {{.CPUPerc}}" url-shortener >> resource_usage.txt
|
|
sleep $resource_usage_interval
|
|
done
|
|
}
|
|
|
|
function calculate_average_usage {
|
|
total_mem=0
|
|
count=0
|
|
|
|
while read -r line; do
|
|
mem=$(echo $line | awk '{print $1}')
|
|
|
|
# Convert memory to MiB if necessary
|
|
if [[ $mem == *MiB ]]; then
|
|
mem=$(echo $mem | sed 's/MiB//')
|
|
elif [[ $mem == *GiB ]]; then
|
|
mem=$(echo $mem | sed 's/GiB//')
|
|
mem=$(echo "$mem * 1024" | bc)
|
|
fi
|
|
|
|
total_mem=$(echo "$total_mem + $mem" | bc)
|
|
((count++))
|
|
done < resource_usage.txt
|
|
|
|
avg_mem=$(echo "scale=2; $total_mem / $count" | bc)
|
|
rm resource_usage.txt
|
|
|
|
echo "Average Memory Usage: $avg_mem MiB"
|
|
}
|
|
|
|
function measure {
|
|
total_time=0
|
|
declare -a refer_links
|
|
|
|
# Start resource usage logging in the background
|
|
nohup bash -c "$(declare -f get_resource_usage); get_resource_usage" &> /dev/null &
|
|
resource_usage_pid=$!
|
|
disown
|
|
|
|
echo "Creating $num_links short links..."
|
|
for ((i=1; i<=num_links; i++)); do
|
|
response=$(curl --silent --request POST \
|
|
--url $api_url \
|
|
--header "X-Api-Key: $api_key" \
|
|
--header "Content-Type: application/json" \
|
|
--data "{ \"url\": \"https://kagi.com\" }")
|
|
|
|
refer=$(echo $response | awk -F'"' '/"refer":/{print $(NF-1)}')
|
|
if [[ -n $refer ]]; then
|
|
refer_links+=("$refer")
|
|
if (( i % 100 == 0 )); then
|
|
echo "Created short link $i/$num_links"
|
|
fi
|
|
else
|
|
echo "Failed to create short link $i"
|
|
fi
|
|
done
|
|
|
|
echo "Accessing each link $num_requests times concurrently..."
|
|
> times.txt # Ensure times.txt is created and empty
|
|
|
|
total_accesses=$((num_links * num_requests))
|
|
accesses_done=0
|
|
|
|
for refer in "${refer_links[@]}"; do
|
|
for ((i=1; i<=num_requests; i++)); do
|
|
# Wait for a slot
|
|
read -u 3
|
|
{
|
|
start_time=$(date +%s%6N)
|
|
curl -s "$refer" >> /dev/null
|
|
end_time=$(date +%s%6N)
|
|
elapsed_time=$(echo "$end_time - $start_time" | bc)
|
|
echo $elapsed_time >> times.txt
|
|
# Release the slot
|
|
echo >&3
|
|
|
|
((accesses_done++))
|
|
if (( accesses_done % 10 == 0 )); then
|
|
echo "Accessed $accesses_done/$total_accesses"
|
|
fi
|
|
} &
|
|
done
|
|
done
|
|
|
|
wait
|
|
|
|
# Stop resource usage logging
|
|
if kill -0 $resource_usage_pid 2>/dev/null; then
|
|
kill $resource_usage_pid
|
|
fi
|
|
|
|
# Read all elapsed times and calculate total
|
|
while read -r time; do
|
|
total_time=$(echo "$total_time + $time" | bc)
|
|
done < times.txt
|
|
rm times.txt
|
|
|
|
echo "****Results****"
|
|
|
|
calculate_average_usage
|
|
echo "Average Response Time: $(echo "scale=2; $total_time / ($num_links * $num_requests)" | bc) µs"
|
|
}
|
|
|
|
echo "Setup..."
|
|
|
|
docker-compose up -d
|
|
# Ensure migrations are done
|
|
docker-compose exec -T app migrate
|
|
|
|
# Create a new user and capture the API key
|
|
output=$(docker-compose exec -T app cli --create-user=Admin)
|
|
api_key=$(echo "$output" | awk -F' ' '/X-Api-Key:/{print $NF}')
|
|
echo "Captured API Key: $api_key"
|
|
|
|
echo "Waiting for database to be ready..."
|
|
sleep 5
|
|
|
|
measure
|
|
|
|
# Clean up
|
|
docker-compose down
|