diff --git a/Makefile b/Makefile index 4546afb2d8d2a11810a595fd97bece1b75e27f58..97d54e3d3654856aa022bc82d6962b83db4ba391 100644 --- a/Makefile +++ b/Makefile @@ -38,7 +38,7 @@ endif .DEFAULT_GOAL := help -.PHONY: $(SUPPORTED_SUITES) run inject help build longevity-prereqs longevity-prereqs-all longevity-matrix +.PHONY: $(SUPPORTED_SUITES) run inject help build longevity-prereqs longevity-prereqs-all longevity-matrix build-stress-ng build-stress-ng-all $(SUPPORTED_SUITES): @STARRY_MODE=$(STARRY_MODE) $(RUNNER) $(SUITE) $(STARRY_MODE) @@ -52,6 +52,12 @@ longevity-prereqs-all: longevity-matrix: @"$(CURDIR)/scripts/run-longevity-matrix.sh" +build-stress-ng: + @"$(CURDIR)/scripts/build-stress-ng.sh" "$(ARCH)" + +build-stress-ng-all: + @"$(CURDIR)/scripts/build-stress-ng.sh" all + run inject: @# helper target so `make ci-test inject` works as expected @@ -69,6 +75,8 @@ help: @echo " make longevity-prereqs # check guest binaries for one ARCH + CASES" @echo " make longevity-prereqs-all # prereqs × aarch64/riscv64/x86_64 (CASES=stress-ng-soak default)" @echo " make longevity-matrix # sequential matrix; CASES= for fs/net soak cases" + @echo " make build-stress-ng # musl static stress-ng + pthread (ARCH=)" + @echo " CASES=stress-ng-concurrency-soak make longevity-test run" @echo " make build # compile the Rust harness" @echo "" @echo "Yocto ptest targets:" diff --git a/scripts/build-stress-ng.sh b/scripts/build-stress-ng.sh new file mode 100755 index 0000000000000000000000000000000000000000..f313e9a297771b2442b106787b4ea0b81845f9a7 --- /dev/null +++ b/scripts/build-stress-ng.sh @@ -0,0 +1,88 @@ +#!/usr/bin/env bash +# Cross-build static musl stress-ng with pthread for longevity concurrency soak. +# Usage: ./scripts/build-stress-ng.sh [aarch64|riscv64|x86_64|all] +# +# Note: musl cross builds often omit stress-ng --mutex (needs setprioceiling); +# concurrency soak uses --mtx (C11 threads) instead — see run-concurrency-soak.sh. +set -euo pipefail +REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" +STRESSNG_SRC="${STRESSNG_SRC:-${REPO_ROOT}/.cache/stress-ng}" + +build_one() { + local arch="$1" + local cc + # musl-gcc defaults to PIE: -static alone yields "dynamically linked" ET_DYN; need -no-pie. + local ldflags="-static -no-pie -pthread" + case "$arch" in + aarch64) cc=aarch64-linux-musl-gcc ;; + riscv64) cc=riscv64-linux-musl-gcc; ldflags="-static -no-pie -pthread -latomic" ;; + x86_64) cc=x86_64-linux-musl-gcc ;; + *) + printf 'Unsupported arch: %s\n' "$arch" >&2 + return 1 + ;; + esac + if ! command -v "$cc" >/dev/null 2>&1; then + printf 'Need cross compiler: %s\n' "$cc" >&2 + return 1 + fi + + if [[ ! -d "$STRESSNG_SRC" ]]; then + git clone --depth 1 https://github.com/ColinIanKing/stress-ng.git "$STRESSNG_SRC" + fi + + local cxx="${cc%-gcc}-g++" + printf '=== building stress-ng for %s (%s, STATIC + pthread) ===\n' "$arch" "$cc" + ( + cd "$STRESSNG_SRC" + make clean cleanconfig >/dev/null 2>&1 || true + make -j"$(nproc)" \ + CC="$cc" CXX="$cxx" \ + STATIC=1 \ + LDFLAGS="$ldflags" + ) + + local dest="${REPO_ROOT}/tests/stress-ng/${arch}" + mkdir -p "$dest" + install -m 0755 "${STRESSNG_SRC}/stress-ng" "${dest}/stress-ng" + + local ftype + ftype="$(file -b "${dest}/stress-ng")" + if printf '%s' "$ftype" | grep -q 'statically linked'; then + printf 'OK: %s (%s)\n' "${dest}/stress-ng" "$ftype" + else + printf 'ERROR: %s is not statically linked: %s\n' "${dest}/stress-ng" "$ftype" >&2 + printf ' guest inject needs musl static executable; use STATIC=1 LDFLAGS="%s"\n' "$ldflags" >&2 + return 1 + fi + + "${dest}/stress-ng" --version 2>&1 | head -1 || true + ARCH="$arch" "${REPO_ROOT}/scripts/check-stress-ng-concurrency.sh" + printf '\n>>> build-stress-ng %s: SUCCESS <<<\n\n' "$arch" +} + +target="${1:-aarch64}" +failures=0 +built_ok=() +if [[ "$target" == "all" ]]; then + for a in aarch64 riscv64 x86_64; do + if build_one "$a"; then + built_ok+=("$a") + else + printf 'FAIL: build-stress-ng %s\n' "$a" >&2 + failures=$((failures + 1)) + fi + done + printf '=== build-stress-ng-all summary ===\n' + if [[ ${#built_ok[@]} -gt 0 ]]; then + printf ' OK : %s\n' "${built_ok[*]}" + fi + if [[ "$failures" -ne 0 ]]; then + printf ' FAIL: %s architecture(s)\n' "$failures" >&2 + exit 1 + fi + printf 'All architectures built (static + mtx prereq). Next:\n' + printf ' CASES=stress-ng-concurrency-soak make longevity-matrix\n' +else + build_one "$target" +fi diff --git a/scripts/check-longevity-prereqs.sh b/scripts/check-longevity-prereqs.sh index c580f7ef539e7398a200b8e83b142ff427f5a9c2..8878b29104d49389c11d675a661109b7ace8b28d 100755 --- a/scripts/check-longevity-prereqs.sh +++ b/scripts/check-longevity-prereqs.sh @@ -40,6 +40,9 @@ cases_norm="$(printf '%s' "$CASES" | tr ', ' ' ')" if cases_need_tool "$cases_norm" "stress-ng-soak"; then need_stress=1 fi +if cases_need_tool "$cases_norm" "stress-ng-concurrency-soak"; then + need_stress=1 +fi if cases_need_tool "$cases_norm" "fio-soak-ext4"; then need_fio=1 fi @@ -66,6 +69,13 @@ if [[ "$need_stress" -eq 1 ]]; then check_file "$REPO_ROOT/tests/stress-ng/$ARCH/stress-ng" \ "musl static build — see tests/stress-ng/BUILD.md" fi +if cases_need_tool "$cases_norm" "stress-ng-concurrency-soak"; then + if [[ -x "$REPO_ROOT/tests/stress-ng/$ARCH/stress-ng" ]]; then + if ! ARCH="$ARCH" "${REPO_ROOT}/scripts/check-stress-ng-concurrency.sh"; then + missing=1 + fi + fi +fi if [[ "$need_fio" -eq 1 ]]; then check_file "$REPO_ROOT/tests/fio/$ARCH/fio" \ "see tests/fio/BUILD.md" diff --git a/scripts/check-stress-ng-concurrency.sh b/scripts/check-stress-ng-concurrency.sh new file mode 100755 index 0000000000000000000000000000000000000000..b9e723e497ce574cd062a206ea958d8e39905e72 --- /dev/null +++ b/scripts/check-stress-ng-concurrency.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +# Host-side: verify stress-ng binary supports concurrency stressors (not all skipped). +# Uses mtx (C11 mutex), not --mutex (often missing on musl cross builds). +# Usage: ARCH=aarch64 ./scripts/check-stress-ng-concurrency.sh +set -euo pipefail +REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" +ARCH="${ARCH:-aarch64}" +BIN="${REPO_ROOT}/tests/stress-ng/${ARCH}/stress-ng" +# fork / mtx / sem / futex — lock pressure via mtx instead of pthread mutex +REQUIRED_STRESSORS="fork mtx sem futex" + +if [[ ! -x "$BIN" ]]; then + printf 'Missing: %s (see scripts/build-stress-ng.sh)\n' "$BIN" >&2 + exit 1 +fi + +stressor_skipped() { + local s="$1" + local out + out="$("$BIN" --dry-run "--$s" 1 2>&1)" || true + printf '%s\n' "$out" | grep -qE "skipped:.*${s}|${s} stressor will be skipped" +} + +missing=0 +for s in $REQUIRED_STRESSORS; do + if stressor_skipped "$s"; then + printf 'SKIP: stressor %s not available in %s\n' "$s" "$BIN" >&2 + "$BIN" --dry-run "--$s" 1 2>&1 | grep -E 'skipped:|will be skipped' | head -3 >&2 || true + missing=1 + fi +done + +if [[ "$missing" -ne 0 ]]; then + printf '\nRebuild: ./scripts/build-stress-ng.sh %s\n' "$ARCH" >&2 + printf 'Note: --mutex often fails on musl cross; soak uses --mtx.\n' >&2 + exit 1 +fi + +printf 'OK: stress-ng concurrency stressors available (ARCH=%s: %s)\n' "$ARCH" "$REQUIRED_STRESSORS" diff --git a/scripts/longevity-common.sh b/scripts/longevity-common.sh index 5f765f08f69e3f198b054cdb54a787165e9d3a82..56733488e231f8c3eb3ceee427bf96a3bc92ed74 100755 --- a/scripts/longevity-common.sh +++ b/scripts/longevity-common.sh @@ -13,4 +13,4 @@ LONGEVITY_MATRIX_ARCHES="${LONGEVITY_MATRIX_ARCHES:-aarch64 riscv64 x86_64}" # ping-flood-soak uses BusyBox ping — no extra binary. # Full longevity case names (for docs / CASES= help). -LONGEVITY_ALL_CASES="stress-ng-soak fio-soak-ext4 fs-soak-ext4 iperf3-soak-guest-client ping-flood-soak net-soak-guest-client" +LONGEVITY_ALL_CASES="stress-ng-soak stress-ng-concurrency-soak fio-soak-ext4 fs-soak-ext4 iperf3-soak-guest-client ping-flood-soak net-soak-guest-client" diff --git a/tests/longevity/README.md b/tests/longevity/README.md new file mode 100644 index 0000000000000000000000000000000000000000..8d16f818e5b95b7ef2f520714e03710115882f60 --- /dev/null +++ b/tests/longevity/README.md @@ -0,0 +1,55 @@ +# Longevity / soak 套件 + +入口:`make longevity-test run`(默认 `ARCH=aarch64`)。 + +## Case 列表 + +| Case | 工具 | 说明 | +|------|------|------| +| `stress-ng-soak` | stress-ng | cpu/vm/io 综合压力 | +| **`stress-ng-concurrency-soak`** | stress-ng | **fork + mtx + sem + futex**(mtx 替代 musl 上常缺的 mutex) | +| `fio-soak-ext4` | fio | 块设备 randrw | +| `fs-soak-ext4` | fsstress + fio | 元数据 + IO | +| `iperf3-soak-guest-client` | iperf3 | TCP/UDP 长连接 | +| `ping-flood-soak` | ping | flood 打网关 | +| `net-soak-guest-client` | iperf3 + ping | 网络组合 | + +脚本在 `tests/{stress-ng,fio,fsstress,iperf3}/`;本目录仅 `suite.toml` + `soak-common.sh`。 + +## 并发 soak(stress-ng-concurrency-soak) + +```bash +# 1. 静态 musl + pthread 重编 stress-ng(soak 用 --mtx,不用常缺的 --mutex) +make build-stress-ng ARCH=aarch64 + +# 2. 预检 +CASES=stress-ng-concurrency-soak ARCH=aarch64 make longevity-prereqs + +# 3. 冒烟 ~2min +export XKERNEL_REMOTE=/path/to/x-kernel +CASES=stress-ng-concurrency-soak ARCH=aarch64 make longevity-test run + +# 4. 三架构矩阵 +CASES=stress-ng-concurrency-soak make longevity-matrix +``` + +调压力(`suite.toml` 的 `guest_env`): + +```toml +guest_env = "LONGEVITY_SOAK_SEC=120 STRESSNG_FORK_PROCS=4 STRESSNG_MTX_PROCS=2" +``` + +生产时长:guest 脚本首参或 `LONGEVITY_SOAK_SEC=7200`,`timeout_secs` ≥ soak + 900。 + +若 guest 因内核问题(如 `pause` 未实现、OOM)在矩阵里失败,可先用冒烟降压: + +```toml +guest_env = "LONGEVITY_SOAK_SEC=120 STRESSNG_FORK_PROCS=1 STRESSNG_MTX_PROCS=1 STRESSNG_SEM_PROCS=1 STRESSNG_FUTEX_PROCS=1 STRESSNG_CPU_PROCS=1" +``` + +## 矩阵 + +```bash +make longevity-prereqs-all +CASES=stress-ng-concurrency-soak make longevity-matrix +``` diff --git a/tests/longevity/soak-common.sh b/tests/longevity/soak-common.sh new file mode 100755 index 0000000000000000000000000000000000000000..ed1011915eb1984830179dcc3e815df6154a32a8 --- /dev/null +++ b/tests/longevity/soak-common.sh @@ -0,0 +1,27 @@ +# Shared helpers for longevity guest soak scripts (source from run-*.sh). +# Usage: . "$(dirname "$0")/soak-common.sh" # when copied to /root/longevity/ +# . /root/longevity/soak-common.sh # after harness inject + +longevity_soak_seconds() { + if [ -n "${1:-}" ]; then + printf '%s' "$1" + return 0 + fi + if [ -n "${LONGEVITY_SOAK_SEC:-}" ]; then + printf '%s' "$LONGEVITY_SOAK_SEC" + return 0 + fi + printf '%s' "${LONGEVITY_SOAK_SEC_DEFAULT:-120}" +} + +longevity_mem_snapshot() { + tag="${1:-mem}" + printf '=== mem snapshot [%s] ===\n' "$tag" + if [ -r /proc/meminfo ]; then + grep -E '^(MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree):' \ + /proc/meminfo || true + fi + if command -v free >/dev/null 2>&1; then + free || true + fi +} diff --git a/tests/longevity/suite.toml b/tests/longevity/suite.toml index 56f8b27a7ba65061ff9711190af21b3ffd322455..5450393039ca01840097c16dd66a74ebbd729c38 100644 --- a/tests/longevity/suite.toml +++ b/tests/longevity/suite.toml @@ -6,11 +6,11 @@ # Default smoke: guest script first arg 120s. Production: 7200/43200; # timeout_secs ≥ soak_seconds + 900; iperf3 cases need companion_timeout_secs ≥ TCP + UDP + margin. # -# Cases: stress-ng-soak | fio-soak-ext4 | fs-soak-ext4 | iperf3-soak-guest-client | -# ping-flood-soak | net-soak-guest-client +# Cases: stress-ng-soak | stress-ng-concurrency-soak | fio-soak-ext4 | fs-soak-ext4 | +# iperf3-soak-guest-client | ping-flood-soak | net-soak-guest-client # Scripts: tests/{stress-ng,fio,fsstress,iperf3}/run-*.sh name = "longevity-test" -description = "长稳:stress-ng / fio / fs-soak / iperf3 / ping / net-soak(见各目录 run-*.sh)" +description = "长稳:stress-ng(含并发)/ fio / fs-soak / iperf3 / ping / net-soak(见各目录 run-*.sh)" build_script = "scripts/build_xkernel.sh" arch = "aarch64" default_timeout_secs = 900 @@ -30,6 +30,26 @@ dest = "/root/longevity/stress-ng" src = "tests/stress-ng/run-soak.sh" dest = "/root/longevity/run-soak.sh" +[[cases]] +name = "stress-ng-concurrency-soak" +description = "stress-ng 并发竞争:fork + mtx + sem + futex(静态 musl+pthread;mtx 替代 musl 上常缺的 mutex)" +runner = "guest-test" +guest_command = "sh -c 'chmod +x /root/longevity/stress-ng /root/longevity/run-concurrency-soak.sh /root/longevity/soak-common.sh && sh /root/longevity/run-concurrency-soak.sh 120'" +guest_env = "LONGEVITY_SOAK_SEC=120" +timeout_secs = 900 + +[[cases.inject]] +src = "tests/stress-ng/${ARCH}/stress-ng" +dest = "/root/longevity/stress-ng" + +[[cases.inject]] +src = "tests/stress-ng/run-concurrency-soak.sh" +dest = "/root/longevity/run-concurrency-soak.sh" + +[[cases.inject]] +src = "tests/longevity/soak-common.sh" +dest = "/root/longevity/soak-common.sh" + [[cases]] name = "fio-soak-ext4" description = "fio randrw 持续占盘;首参为秒数" diff --git a/tests/stress-ng/BUILD.md b/tests/stress-ng/BUILD.md index 46b49fd54f7cd4c259d69b0f41ea26df17002c48..ce2255bb6481c910c71371db45b74a5c5bedf51a 100644 --- a/tests/stress-ng/BUILD.md +++ b/tests/stress-ng/BUILD.md @@ -10,10 +10,20 @@ stress-ng/ └── loongarch64/stress-ng ``` +## 一键编译(含 pthread,供 concurrency soak) + +```bash +./scripts/build-stress-ng.sh aarch64 # 或 riscv64 / x86_64 / all +make build-stress-ng ARCH=aarch64 +``` + +脚本会执行 `check-stress-ng-concurrency.sh`,确认 **fork/mtx/sem/futex** 未被 skip(不用 `--mutex`,musl 交叉编时常未实现)。 + ## 推荐编译参数 - 必须同时为 **`CC` / `CXX`** 指定**同一 triple** 的 `*-linux-musl-gcc` / `*-linux-musl-g++`,否则生成 C++ 目标(如 `stress-eigen-ops`、`stress-vecmath`、`core-perf`)时会落到宿主机 `g++`,易出现链接或运行环境不一致。 - 设 **`STATIC=1`**,与 guest 无动态链接器的场景一致。 +- **并发 soak** 需 **pthread**,且 musl 须 **` -static -no-pie`**(仅 `-static` 会得到 PIE 的 `dynamically linked`,guest 注入不适用)。`build-stress-ng.sh` 已包含;`--mutex` 常缺,soak 用 **`--mtx`**。 - **riscv64** 与 **loongarch64** 静态链接时若报 `undefined reference to __atomic_*`,在链接阶段加上 **`LDFLAGS=-latomic`**。 - 共用同一源码目录交叉多架构时,每个架构前执行 **`make clean`**,避免残留目标文件。 diff --git a/tests/stress-ng/README.md b/tests/stress-ng/README.md index 4d6b2ff3cdec271f270541c425d4c746929eed02..503de0f220a79d34bf4f5a832950625d360864ac 100644 --- a/tests/stress-ng/README.md +++ b/tests/stress-ng/README.md @@ -1,6 +1,13 @@ # stress-ng(guest 预编译) -Longevity **已验证链路**的 guest 工具:注入 `tests/stress-ng//stress-ng` 与 `run-soak.sh`,在 guest 内跑 `stress-ng-soak`(cpu/vm/io 并行)。 +Longevity guest 工具:注入 `tests/stress-ng//stress-ng` 与 soak 脚本。 + +| Case | 脚本 | +|------|------| +| `stress-ng-soak` | `run-soak.sh`(cpu/vm/io) | +| `stress-ng-concurrency-soak` | `run-concurrency-soak.sh`(fork/**mtx**/sem/futex) | + +**并发 case** 用 `scripts/build-stress-ng.sh`(`-static -pthread`)。musl 交叉编译里 `--mutex` 常因缺少 `setprioceiling` 未编入,故用 **`--mtx`**(C11 线程互斥)。 编译见 [BUILD.md](BUILD.md)。 @@ -9,6 +16,7 @@ Longevity **已验证链路**的 guest 工具:注入 `tests/stress-ng//s ```bash export XKERNEL_REMOTE=/path/to/x-kernel/x-kernel make longevity-prereqs-all +CASES=stress-ng-concurrency-soak ARCH=aarch64 make longevity-test run make longevity-matrix # 默认 CASES=stress-ng-soak × aarch64/riscv64/x86_64 CASES=fs-soak-ext4 make longevity-matrix # 另需 tests/fsstress//fsstress(三架构) ARCH=aarch64 make longevity-test run diff --git a/tests/stress-ng/aarch64/stress-ng b/tests/stress-ng/aarch64/stress-ng index 07756376c08fba2646e3f037a1a2a02e14ad440f..12e4abb82613fd3d93d26a646db2e3cbc10fad3d 100755 Binary files a/tests/stress-ng/aarch64/stress-ng and b/tests/stress-ng/aarch64/stress-ng differ diff --git a/tests/stress-ng/riscv64/stress-ng b/tests/stress-ng/riscv64/stress-ng index 4089f0092fbb769ab76fd1613ab8ad90c5fe1d22..dfcb3609f383e4f2e43fd10db42b9fcde508000d 100755 Binary files a/tests/stress-ng/riscv64/stress-ng and b/tests/stress-ng/riscv64/stress-ng differ diff --git a/tests/stress-ng/run-concurrency-soak.sh b/tests/stress-ng/run-concurrency-soak.sh new file mode 100755 index 0000000000000000000000000000000000000000..25340c7e1494cc66c3e27786c62f8f471df12927 --- /dev/null +++ b/tests/stress-ng/run-concurrency-soak.sh @@ -0,0 +1,80 @@ +#!/bin/sh +# Guest: stress-ng concurrency soak — fork + mtx + sem + futex (+ light cpu). +# Uses --mtx (C11 threads mutex), not --mutex (often unimplemented in musl static builds). +# First argument or LONGEVITY_SOAK_SEC = duration in seconds (default 120 smoke). +set -eu + +BASEDIR="$(cd "$(dirname "$0")" && pwd)" +STRESS="${BASEDIR}/stress-ng" +COMMON="${BASEDIR}/soak-common.sh" +if [ -f "$COMMON" ]; then + # shellcheck source=/dev/null + . "$COMMON" +else + longevity_soak_seconds() { + if [ -n "${1:-}" ]; then printf '%s' "$1"; return; fi + if [ -n "${LONGEVITY_SOAK_SEC:-}" ]; then printf '%s' "$LONGEVITY_SOAK_SEC"; return; fi + printf '%s' 120 + } + longevity_mem_snapshot() { :; } +fi + +SOAK_SEC="$(longevity_soak_seconds "${1:-}")" + +FORK_PROCS="${STRESSNG_FORK_PROCS:-2}" +MTX_PROCS="${STRESSNG_MTX_PROCS:-${STRESSNG_MUTEX_PROCS:-2}}" +SEM_PROCS="${STRESSNG_SEM_PROCS:-2}" +FUTEX_PROCS="${STRESSNG_FUTEX_PROCS:-2}" +CPU_PROCS="${STRESSNG_CPU_PROCS:-1}" + +if [ ! -x "$STRESS" ]; then + printf 'ERROR: stress-ng not executable: %s\n' "$STRESS" >&2 + exit 1 +fi + +stressor_skipped() { + name="$1" + out="$("$STRESS" --dry-run "--$name" 1 2>&1)" || true + printf '%s\n' "$out" | grep -q "skipped:.*${name}\|${name} stressor will be skipped" +} + +check_stressor() { + name="$1" + if stressor_skipped "$name"; then + printf 'FAIL: stress-ng stressor "%s" skipped on this guest\n' "$name" >&2 + printf ' → host: ./scripts/build-stress-ng.sh (STATIC + pthread)\n' >&2 + printf ' → guest: X-Kernel may lack threads/mutex/futex APIs stress-ng needs\n' >&2 + "$STRESS" --dry-run "--$name" 1 2>&1 | grep -E 'skipped:|will be skipped' >&2 || true + return 1 + fi + return 0 +} + +printf '=== longevity stress-ng concurrency soak: %s s ===\n' "$SOAK_SEC" +printf ' procs: fork=%s mtx=%s sem=%s futex=%s cpu=%s\n' \ + "$FORK_PROCS" "$MTX_PROCS" "$SEM_PROCS" "$FUTEX_PROCS" "$CPU_PROCS" + +longevity_mem_snapshot start + +rc=0 +for s in fork mtx sem futex; do + check_stressor "$s" || rc=1 +done +if [ "$rc" -ne 0 ]; then + exit 1 +fi + +"$STRESS" \ + --fork "$FORK_PROCS" \ + --mtx "$MTX_PROCS" \ + --sem "$SEM_PROCS" \ + --futex "$FUTEX_PROCS" \ + --cpu "$CPU_PROCS" \ + --timeout "$SOAK_SEC" \ + --metrics-brief \ + --verbose +stress_rc=$? + +longevity_mem_snapshot end +printf '=== concurrency soak finished (exit=%s) ===\n' "$stress_rc" +exit "$stress_rc" diff --git a/tests/stress-ng/x86_64/stress-ng b/tests/stress-ng/x86_64/stress-ng index afa54e80e8e0aa19fc28c18d030f68f38cc17247..90f4634bd6ee025353c9963e87e58bfcc08b476b 100755 Binary files a/tests/stress-ng/x86_64/stress-ng and b/tests/stress-ng/x86_64/stress-ng differ