Run the load generators against our server: the window holds, memory returns to baseline, no defects
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user