Run the load generators against our server: the window holds, memory returns to baseline, no defects

This commit is contained in:
2026-09-06 22:25:29 +02:00
parent a7f3ea70d7
commit 5e53fad802
14 changed files with 946 additions and 2 deletions
+37
View File
@@ -0,0 +1,37 @@
# smpp-dumb-client has no published image; built from source at a pinned commit. A second binary
# is built from the same source with its own automatic enquire_link neutralised, for S6 - see
# findings/07-load.md for why (every peer built for this phase sends enquire_link on its own
# otherwise, and smppload, the one that never does, is blocked).
FROM --platform=linux/amd64 golang:1.26.8-alpine3.23 AS builder
RUN apk add --no-cache git ca-certificates
ARG LIBSMPP_COMMIT=de0334bf2c1155fb3dd4f929674968254c932be6
RUN git clone https://github.com/vponomarev/libsmpp.git /build \
&& cd /build \
&& git checkout "${LIBSMPP_COMMIT}"
WORKDIR /build
RUN go build -o /out/smpp-dumb-client ./app/smpp-dumb-client
# libsmpp's enquireSender(60)/enquireSender(10) are the two call sites that start its unconditional,
# unconfigurable 10s/60s enquire_link ticker (smpp.go) - both neutralised here for the no-ping build.
RUN sed -i \
-e 's/go s\.enquireSender(60)/\/\/ patched for S6 (no enquire_link): &/' \
-e 's/go s\.enquireSender(10)/\/\/ patched for S6 (no enquire_link): &/' \
smpp.go \
&& go build -o /out/smpp-dumb-client-noping ./app/smpp-dumb-client
FROM --platform=linux/amd64 alpine:3.23.5 AS runtime
RUN apk add --no-cache netcat-openbsd
WORKDIR /app
COPY --from=builder /out/smpp-dumb-client /app/smpp-dumb-client
COPY --from=builder /out/smpp-dumb-client-noping /app/smpp-dumb-client-noping
COPY entrypoint.sh /app/entrypoint.sh
COPY conf ./conf
RUN chmod +x /app/entrypoint.sh /app/smpp-dumb-client /app/smpp-dumb-client-noping
ENTRYPOINT ["/app/entrypoint.sh"]
@@ -0,0 +1,37 @@
log:
level: info
rate: yes
netbuf: false
profiler:
enabled: no
smpp:
remote: NODE_HOST:2775
bind:
systemID: dumb-idle
systemType: ""
password: dumbpw
mode: TRX
generator:
enabled: yes
message:
from:
ton: 1
npi: 1
addr: "15550005678"
to:
ton: 1
npi: 1
addr: "15550001234"
template: no
registeredDelivery: 0
dataCoding: 1
body: "load phase 7 - S6 idle probe"
count: 1
rate: 1
window: 10
# Sends its one message, gets the response, then goes silent - run through the no-ping binary
# (see the Dockerfile), so nothing at all crosses the wire after that: no enquire_link, no traffic.
stayConnected: yes
@@ -0,0 +1,35 @@
log:
level: info
rate: yes
netbuf: false
profiler:
enabled: no
smpp:
remote: NODE_HOST:2775
bind:
systemID: dumb-soak
systemType: ""
password: dumbpw
mode: TRX
generator:
enabled: yes
message:
from:
ton: 1
npi: 1
addr: "15550005678"
to:
ton: 1
npi: 1
addr: "15550001234"
template: no
registeredDelivery: 0
dataCoding: 1
body: "load phase 7 - long soak, fast handler"
count: 300000
rate: 500
window: 100
stayConnected: yes
@@ -0,0 +1,35 @@
log:
level: info
rate: yes
netbuf: false
profiler:
enabled: no
smpp:
remote: NODE_HOST:2775
bind:
systemID: dumb-w2000
systemType: ""
password: dumbpw
mode: TRX
generator:
enabled: yes
message:
from:
ton: 1
npi: 1
addr: "15550005678"
to:
ton: 1
npi: 1
addr: "15550001234"
template: no
registeredDelivery: 0
dataCoding: 1
body: "load phase 7 - window 2000, above maxHeldMessages (S9)"
count: 20000
rate: 2000
window: 2000
stayConnected: no
@@ -0,0 +1,35 @@
log:
level: info
rate: yes
netbuf: false
profiler:
enabled: no
smpp:
remote: NODE_HOST:2775
bind:
systemID: dumb-w500
systemType: ""
password: dumbpw
mode: TRX
generator:
enabled: yes
message:
from:
ton: 1
npi: 1
addr: "15550005678"
to:
ton: 1
npi: 1
addr: "15550001234"
template: no
registeredDelivery: 0
dataCoding: 1
body: "load phase 7 - window 500, below maxHeldMessages"
count: 20000
rate: 2000
window: 500
stayConnected: no
@@ -0,0 +1,23 @@
#!/bin/sh
# smpp-dumb-client is one-shot and dials out, so it needs node:2775 already listening - the same
# problem compose.smppload.yaml's entrypoint solves, and the same fix: a healthcheck this marker
# satisfies at once, and node depends on it rather than the other way round.
#
# Its own smpp.remote config field is fed straight into net.ParseIP with no DNS resolution at all
# (hdr.go), so the compose service name in every conf/*.yml is a NODE_HOST placeholder, resolved
# here and substituted into a writable copy before the real binary ever sees the config file.
set -eu
touch /tmp/healthy
host="${SMPP_HOST:-node}"
port="${SMPP_PORT:-2775}"
until nc -z "$host" "$port"; do
sleep 1
done
ip="$(getent hosts "$host" | awk '{print $1}' | head -n1)"
sed "s/NODE_HOST/$ip/" "$1" > /tmp/effective-config.yml
exec "${DUMBCLIENT_BIN:-/app/smpp-dumb-client}" -config /tmp/effective-config.yml