| #!/usr/bin/env bash |
| set -euo pipefail |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| HOST="${1:-localhost:9867}" |
| NUM_INSTANCES="${2:-2}" |
| TABS_PER_INSTANCE="${3:-10}" |
|
|
| RED='\033[0;31m' |
| GREEN='\033[0;32m' |
| YELLOW='\033[1;33m' |
| CYAN='\033[0;36m' |
| NC='\033[0m' |
|
|
| URLS=( |
| "https://en.wikipedia.org/wiki/Main_Page" |
| "https://news.ycombinator.com" |
| "https://github.com/trending" |
| "https://developer.mozilla.org/en-US/" |
| "https://www.bbc.com/news" |
| "https://stackoverflow.com/questions" |
| "https://www.reddit.com/r/programming" |
| "https://docs.github.com" |
| "https://go.dev/doc/" |
| "https://react.dev" |
| "https://www.typescriptlang.org/docs/" |
| "https://kubernetes.io/docs/home/" |
| "https://www.rust-lang.org" |
| "https://nodejs.org/en/docs" |
| "https://www.postgresql.org/docs/" |
| ) |
|
|
| api() { |
| local method="$1" path="$2" |
| shift 2 |
| curl -s -X "$method" "http://${HOST}${path}" \ |
| -H "Content-Type: application/json" \ |
| "$@" |
| } |
|
|
| echo -e "${CYAN}Memory Load Simulator${NC}" |
| echo -e "Target: ${HOST}" |
| echo -e "Instances to launch: ${NUM_INSTANCES}" |
| echo -e "Tabs per instance: ${TABS_PER_INSTANCE}" |
| echo "" |
|
|
| |
| STATUS=$(curl -s -o /dev/null -w "%{http_code}" "http://${HOST}/health" 2>/dev/null || echo "000") |
| if [ "$STATUS" != "200" ]; then |
| echo -e "${RED}β Server not reachable at ${HOST} (HTTP ${STATUS})${NC}" |
| echo " Start pinchtab first: ./pinchtab server" |
| exit 1 |
| fi |
| echo -e "${GREEN}β Server healthy${NC}" |
| echo "" |
|
|
| INSTANCE_IDS=() |
|
|
| |
| echo -e "${YELLOW}Phase 1: Launching ${NUM_INSTANCES} headless instances...${NC}" |
| for i in $(seq 1 "$NUM_INSTANCES"); do |
| RESULT=$(api POST "/instances/launch" -d '{"mode":"headless"}') |
| ID=$(echo "$RESULT" | grep -o '"id":"[^"]*"' | head -1 | cut -d'"' -f4) |
|
|
| if [ -z "$ID" ]; then |
| echo -e " ${RED}β Failed to launch instance ${i}: ${RESULT}${NC}" |
| continue |
| fi |
|
|
| INSTANCE_IDS+=("$ID") |
| echo -e " ${GREEN}β Instance ${i}: ${ID}${NC}" |
| sleep 1 |
| done |
|
|
| if [ ${#INSTANCE_IDS[@]} -eq 0 ]; then |
| echo -e "${RED}No instances launched. Exiting.${NC}" |
| exit 1 |
| fi |
|
|
| |
| echo "" |
| echo -e "${YELLOW}Waiting for instances to initialize...${NC}" |
| sleep 3 |
|
|
| |
| echo "" |
| echo -e "${YELLOW}Phase 2: Opening ${TABS_PER_INSTANCE} tabs per instance...${NC}" |
| for ID in "${INSTANCE_IDS[@]}"; do |
| echo -e " ${CYAN}Instance ${ID}:${NC}" |
| for j in $(seq 1 "$TABS_PER_INSTANCE"); do |
| URL_IDX=$(( (j - 1) % ${#URLS[@]} )) |
| URL="${URLS[$URL_IDX]}" |
|
|
| RESULT=$(api POST "/instances/${ID}/tabs/open" -d "{\"url\":\"${URL}\"}" 2>/dev/null) |
| printf "\r Opened %d/%d tabs" "$j" "$TABS_PER_INSTANCE" |
| sleep 0.5 |
| done |
| echo -e "\r ${GREEN}β Opened ${TABS_PER_INSTANCE} tabs${NC}" |
| done |
|
|
| |
| echo "" |
| echo -e "${GREEN}Done!${NC}" |
| echo "" |
| echo -e "${CYAN}Monitor memory in the dashboard:${NC}" |
| echo -e " 1. Open http://${HOST} β Monitoring tab" |
| echo -e " 2. Enable 'Memory Metrics' in Settings" |
| echo -e " 3. Watch JS heap grow as pages load" |
| echo "" |
| echo -e "${CYAN}Check metrics via API:${NC}" |
| for ID in "${INSTANCE_IDS[@]}"; do |
| echo -e " curl http://${HOST}/instances/${ID}/tabs" |
| done |
| echo "" |
| echo -e "${CYAN}Cleanup β stop all instances:${NC}" |
| for ID in "${INSTANCE_IDS[@]}"; do |
| echo -e " curl -X POST http://${HOST}/instances/${ID}/stop" |
| done |
|
|