mirror of
https://github.com/logos-messaging/logos-messaging-interop-tests.git
synced 2026-01-03 14:33:07 +00:00
125 lines
4.6 KiB
Bash
Executable File
125 lines
4.6 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e
|
|
|
|
# ID
|
|
export SCENARIO_ID="cpu_store_stress"
|
|
export TEST_NAME="${SCENARIO_ID}_$(date +%Y%m%d_%H%M%S)"
|
|
echo "[${TEST_NAME}] start"
|
|
|
|
# Images (pin for comparability)
|
|
export NWAKU_IMAGE="wakuorg/nwaku:stable"
|
|
export LPT_IMAGE="wakuorg/liteprotocoltester:latest"
|
|
export SONDA_IMAGE="wakuorg/sonda:latest" # change if you host it elsewhere
|
|
|
|
# Service/DB resources (CPU bottleneck on service)
|
|
export SERVICENODE_CPU_CORES=0 # single core to amplify CPU load
|
|
export POSTGRES_CPU_CORES=1-3
|
|
export SERVICE_MEM_LIMIT="2g"
|
|
export POSTGRES_MEM_LIMIT="2g"
|
|
export POSTGRES_SHM_SIZE="1g"
|
|
|
|
# Topic/shards
|
|
export CLUSTER_ID=66
|
|
export SHARD=0
|
|
export PUBSUB_TOPIC="/waku/2/rs/${CLUSTER_ID}/${SHARD}"
|
|
export CONTENT_TOPIC="/sonda/2/polls/proto"
|
|
|
|
# REST endpoints
|
|
export RELAY_NODE_REST_ADDRESS="http://127.0.0.1:8645"
|
|
export STORE_NODE_REST_ADDRESS="http://127.0.0.1:8644"
|
|
export STORE_NODES="/ip4/127.0.0.1/tcp/30303/p2p/SERVICE_PEER_ID"
|
|
|
|
# Health
|
|
export HEALTH_THRESHOLD=0.85
|
|
|
|
# ---------- Phase 0: up ----------
|
|
echo "[${TEST_NAME}] up simulator"
|
|
cd ./waku-simulator
|
|
docker compose up -d
|
|
cd ..
|
|
echo "[${TEST_NAME}] wait 30s"
|
|
sleep 30
|
|
|
|
# ---------- Phase 1: CPU write hammer (small msgs, high rate) ----------
|
|
# Small payloads + high publisher count => per-message CPU (encode/verify/route) dominates.
|
|
export NUM_PUBLISHER_NODES=24
|
|
export NUM_RECEIVER_NODES=8 # keep some receivers to drive end-to-end
|
|
export MESSAGE_INTERVAL_MILLIS=8 # ~125 msg/s per publisher (adjust if too hot)
|
|
export MIN_MESSAGE_SIZE=256 # bytes
|
|
export MAX_MESSAGE_SIZE=1024 # bytes
|
|
export START_PUBLISHING_AFTER=10
|
|
export NUM_MESSAGES=0 # unlimited
|
|
|
|
echo "[${TEST_NAME}] phase1 writers: ${NUM_PUBLISHER_NODES} pubs @ ${MESSAGE_INTERVAL_MILLIS}ms, 256-1024B"
|
|
docker run -d --rm --name lpt_cpu \
|
|
-e PUB_NODES=${NUM_PUBLISHER_NODES} \
|
|
-e RCV_NODES=${NUM_RECEIVER_NODES} \
|
|
-e MSG_INTERVAL_MS=${MESSAGE_INTERVAL_MILLIS} \
|
|
-e MIN_MSG=${MIN_MESSAGE_SIZE} \
|
|
-e MAX_MSG=${MAX_MESSAGE_SIZE} \
|
|
-e PUBSUB_TOPIC=${PUBSUB_TOPIC} \
|
|
--network host ${LPT_IMAGE}
|
|
|
|
# ---------- Phase 2: Store read hammer (concurrent readers) ----------
|
|
# Mix includeData true/false and page sizes to exercise CPU (serialization/JSON) & DB.
|
|
echo "[${TEST_NAME}] phase2 store readers"
|
|
docker run -d --rm --name sonda_idx \
|
|
--network host ${SONDA_IMAGE} \
|
|
--relay-node-rest-address "${RELAY_NODE_REST_ADDRESS}" \
|
|
--store-node-rest-address "${STORE_NODE_REST_ADDRESS}" \
|
|
--pubsub-topic "${PUBSUB_TOPIC}" \
|
|
--store-nodes "${STORE_NODES}" \
|
|
--delay-seconds 0.07 --health-threshold ${HEALTH_THRESHOLD} \
|
|
--metrics-port 8004 --include-data=false --page-size 150
|
|
|
|
docker run -d --rm --name sonda_smallpages \
|
|
--network host ${SONDA_IMAGE} \
|
|
--relay-node-rest-address "${RELAY_NODE_REST_ADDRESS}" \
|
|
--store-node-rest-address "${STORE_NODE_REST_ADDRESS}" \
|
|
--pubsub-topic "${PUBSUB_TOPIC}" \
|
|
--store-nodes "${STORE_NODES}" \
|
|
--delay-seconds 0.05 --health-threshold ${HEALTH_THRESHOLD} \
|
|
--metrics-port 8005 --include-data=true --page-size 5
|
|
|
|
docker run -d --rm --name sonda_bigpages \
|
|
--network host ${SONDA_IMAGE} \
|
|
--relay-node-rest-address "${RELAY_NODE_REST_ADDRESS}" \
|
|
--store-node-rest-address "${STORE_NODE_REST_ADDRESS}" \
|
|
--pubsub-topic "${PUBSUB_TOPIC}" \
|
|
--store-nodes "${STORE_NODES}" \
|
|
--delay-seconds 0.05 --health-threshold ${HEALTH_THRESHOLD} \
|
|
--metrics-port 8006 --include-data=true --page-size 50
|
|
|
|
# Extra readers to push CPU on the service process:
|
|
docker run -d --rm --name sonda_mix1 \
|
|
--network host ${SONDA_IMAGE} \
|
|
--relay-node-rest-address "${RELAY_NODE_REST_ADDRESS}" \
|
|
--store-node-rest-address "${STORE_NODE_REST_ADDRESS}" \
|
|
--pubsub-topic "${PUBSUB_TOPIC}" \
|
|
--store-nodes "${STORE_NODES}" \
|
|
--delay-seconds 0.03 --health-threshold ${HEALTH_THRESHOLD} \
|
|
--metrics-port 8007 --include-data=true --page-size 25
|
|
|
|
docker run -d --rm --name sonda_mix2 \
|
|
--network host ${SONDA_IMAGE} \
|
|
--relay-node-rest-address "${RELAY_NODE_REST_ADDRESS}" \
|
|
--store-node-rest-address "${STORE_NODE_REST_ADDRESS}" \
|
|
--pubsub-topic "${PUBSUB_TOPIC}" \
|
|
--store-nodes "${STORE_NODES}" \
|
|
--delay-seconds 0.03 --health-threshold ${HEALTH_THRESHOLD} \
|
|
--metrics-port 8008 --include-data=false --page-size 200
|
|
|
|
echo "[${TEST_NAME}] hold 12m"
|
|
sleep 720
|
|
|
|
# ---------- Phase 3: plateau & recovery ----------
|
|
echo "[${TEST_NAME}] phase3 stop writers; keep readers 2m (recovery CPU/GC)"
|
|
docker kill lpt_cpu || true
|
|
sleep 120
|
|
|
|
# ---------- Cleanup ----------
|
|
echo "[${TEST_NAME}] cleanup"
|
|
docker kill sonda_idx sonda_smallpages sonda_bigpages sonda_mix1 sonda_mix2 || true
|
|
cd ./waku-simulator
|
|
docker compose down -v
|