@@ -22,6 +22,12 @@ R=${WC_REGION:-eu-central-1}
2222# run their gen OUT-of-region (WC_GEN_REGION) until the platform fixes
2323# it. Server stays in R.
2424GR=${WC_GEN_REGION:- $R }
25+ # K generators on distinct source IPs (the edge caps concurrent
26+ # connections PER SOURCE IP at ~1.2-2k): gen k parks subscribers
27+ # [k*slice, (k+1)*slice) and only gen 0 writes. Regions round-robin
28+ # from WC_GEN_REGIONS so the gens really are distinct hosts/IPs.
29+ GENS=${WC_GENS:- 1}
30+ GEN_REGIONS=(${WC_GEN_REGIONS:- $GR } )
2531export SOAK_RUN_ID=${SOAK_RUN_ID:- " wc-$( date -u +%Y%m%dT%H%M%SZ) " }
2632export BIN_TAG=$SOAK_RUN_ID
2733OUT=" $S /results/$SOAK_RUN_ID " ; mkdir -p " $OUT "
@@ -87,7 +93,13 @@ for path, key in [(sys.argv[1], sys.argv[2]), (sys.argv[3], sys.argv[4])]:
8793 print(f"uploaded {key} ({len(data)} bytes)")
8894PY
8995
90- role_region () { [ " $1 " = gen ] && echo " $GR " || echo " $R " ; }
96+ role_region () {
97+ case " $1 " in
98+ gen) echo " ${GEN_REGIONS[0]} " ;;
99+ gen-* ) local k=${1# gen-} ; echo " ${GEN_REGIONS[$((k % ${#GEN_REGIONS[@]} ))]}" ;;
100+ * ) echo " $R " ;;
101+ esac
102+ }
91103role_project () { cat " $S /proj-$( role_region " $1 " ) .txt" ; }
92104svc_id () {
93105 local ROLE=$1 DR=$( role_region " $1 " ) DP=$( role_project " $1 " )
@@ -108,7 +120,7 @@ svc_id() {
108120}
109121deploy () {
110122 local ROLE=$1 ; shift
111- local DIR=" $S /app-$ROLE - $R "
123+ local DIR=" $S /app-${ ROLE%% - * } - $R " # gen-k roles share the gen app dir
112124 local DR=$( role_region " $ROLE " ) DP=$( role_project " $ROLE " )
113125 local SVC=$( svc_id " $ROLE " ) ; local SVCARG=()
114126 [ -n " $SVC " ] && SVCARG=(--service " $SVC " )
@@ -180,25 +192,35 @@ verify_server_live
180192curl -sf --max-time 20 -H " authorization: Bearer $AUTH " \
181193 " $( cat " $S /url-server-$R .txt" ) /v1/debug/load" > " $OUT /server-before-$STAGE .json" || true
182194
183- echo " == gen: cert stage $STAGE "
184- deploy gen \
185- --env AWSBENCH_S3_KEY=" bin/awsbench-$BIN_TAG -x64" \
186- --env S3_ENDPOINT=$BINEP --env S3_BUCKET=$BINBKT --env S3_REGION=auto \
187- --env S3_ACCESS_KEY_ID=" $BINID " --env S3_SECRET_ACCESS_KEY=" $BINSEC " \
188- --env BENCH_SYSTEM=prisma --env BENCH_SHAPE=cert \
189- --env BENCH_TARGET=" $( cat " $S /url-server-$R .txt" ) " \
190- --env TOKENS_S3_KEY=" wc/$SOAK_RUN_ID /tokens.json" \
191- --env BENCH_CERT_TENANTS=" $TENANTS " --env BENCH_CERT_SUB_TENANTS=" $SUB_TENANTS " \
192- --env BENCH_CERT_SUBS_N=" $SUBS_N " --env BENCH_CERT_ACTIVE=" $ACTIVE " \
193- --env BENCH_CERT_FANOUT_ACTIVE=" $FANOUT " --env BENCH_CERT_WINDOW_MS=5000 \
194- --env BENCH_CERT_CONNECT_CONC=${WC_CONNECT_CONC:- 48} \
195- --env BENCH_CERT_WPS=" $WPS " --env BENCH_CERT_SECS=" $SECS " \
196- --env BENCH_WIDE_SETUP_CONC=64 --env BENCH_RECORD_BYTES=1024 --env BENCH_BATCH=1 \
197- --env BENCH_HOLD=1 --env BENCH_START_GATED=false \
198- --env AUTH_TOKEN=" $AUTH " --env STREAM_KEY=" $KEY " \
199- --env BENCH_STREAM=" wc$STAGE -" --env KEEP_AWAKE=1
195+ echo " == gen: cert stage $STAGE (gens=$GENS regions=${GEN_REGIONS[*]} )"
196+ SLICE=$(( (SUBS_N + GENS - 1 ) / GENS ))
197+ for k in $( seq 0 $(( GENS - 1 )) ) ; do
198+ ROLE=gen; [ " $k " -gt 0 ] && ROLE=" gen-$k "
199+ OFFSET=$(( k * SLICE )) ; N=$SLICE
200+ [ $(( OFFSET + N )) -gt " $SUBS_N " ] && N=$(( SUBS_N - OFFSET ))
201+ [ " $N " -lt 0 ] && N=0
202+ W=1; [ " $k " -gt 0 ] && W=0
203+ echo " gen $k ($ROLE @ $( role_region " $ROLE " ) ): subs $N from $OFFSET , writers=$W "
204+ deploy " $ROLE " \
205+ --env AWSBENCH_S3_KEY=" bin/awsbench-$BIN_TAG -x64" \
206+ --env S3_ENDPOINT=$BINEP --env S3_BUCKET=$BINBKT --env S3_REGION=auto \
207+ --env S3_ACCESS_KEY_ID=" $BINID " --env S3_SECRET_ACCESS_KEY=" $BINSEC " \
208+ --env BENCH_SYSTEM=prisma --env BENCH_SHAPE=cert \
209+ --env BENCH_TARGET=" $( cat " $S /url-server-$R .txt" ) " \
210+ --env TOKENS_S3_KEY=" wc/$SOAK_RUN_ID /tokens.json" \
211+ --env BENCH_CERT_TENANTS=" $TENANTS " --env BENCH_CERT_SUB_TENANTS=" $SUB_TENANTS " \
212+ --env BENCH_CERT_SUBS_N=" $N " --env BENCH_CERT_SUB_OFFSET=" $OFFSET " --env BENCH_CERT_WRITERS=" $W " \
213+ --env BENCH_CERT_ACTIVE=" $ACTIVE " \
214+ --env BENCH_CERT_FANOUT_ACTIVE=" $FANOUT " --env BENCH_CERT_WINDOW_MS=5000 \
215+ --env BENCH_CERT_CONNECT_CONC=${WC_CONNECT_CONC:- 48} \
216+ --env BENCH_CERT_WPS=" $WPS " --env BENCH_CERT_SECS=" $SECS " \
217+ --env BENCH_WIDE_SETUP_CONC=64 --env BENCH_RECORD_BYTES=1024 --env BENCH_BATCH=1 \
218+ --env BENCH_HOLD=1 --env BENCH_START_GATED=false \
219+ --env AUTH_TOKEN=" $AUTH " --env STREAM_KEY=" $KEY " \
220+ --env BENCH_STREAM=" wc$STAGE -" --env KEEP_AWAKE=1
221+ done
200222
201- GURL=$( cat " $S /url-gen-$GR .txt" )
223+ GURL=$( cat " $S /url-gen-$( role_region gen ) .txt" ) # the writer gen decides cert_done
202224SURL=$( cat " $S /url-server-$R .txt" )
203225DEADLINE=$(( $(date +% s) + SECS + 1500 ))
204226# RSS timeline: correlate memory peaks with shed windows.
@@ -215,6 +237,11 @@ while [ "$(date +%s)" -lt "$DEADLINE" ]; do
215237 BODY=$( curl -sf --max-time 15 " $GURL /" || true)
216238 if [ -n " $BODY " ] && echo " $BODY " | grep -q ' "cert_done"' ; then
217239 echo " $BODY " > " $OUT /stage-$STAGE .json"
240+ # Every subscriber-only gen's stats too (subsLive adds up across them).
241+ for k in $( seq 1 $(( GENS - 1 )) ) ; do
242+ U=$( cat " $S /url-gen-$k -$( role_region " gen-$k " ) .txt" 2> /dev/null) || continue
243+ curl -sf --max-time 15 " $U /" > " $OUT /stage-$STAGE -gen$k .json" || true
244+ done
218245 curl -sf --max-time 20 -H " authorization: Bearer $AUTH " \
219246 " $( cat " $S /url-server-$R .txt" ) /v1/debug/load" > " $OUT /server-after-$STAGE .json" || true
220247 echo " WC_STAGE_DONE $STAGE "
0 commit comments