feat(ttl): Run the CPU stress as a systemd unit, and add two config knobs

mlucas-avx2 was backgrounded with '&' in the login shell, so it belonged
to that one terminal. Close Tera Term, drop the console, or reconnect on
a different session and the load was gone - and 'jobs' from the new
session showed nothing to say so. A multi-day soak could spend most of
its length with an idle CPU while the thermal numbers looked fine.

Script B now starts it as a transient unit:

  systemd-run --unit=mlucas-amm --property=Type=exec \
    --property=Restart=always --property=RestartSec=2 ...

The log is truncated once with '>' before the unit starts and appended
with '>>' inside it, so a restart adds to the run instead of erasing it.
'systemctl is-active mlucas-amm' now sits beside 'jobs', both in the
one-shot check and in every pass of the monitor loop. The old '&' line is
kept commented out above the new one to fall back to.

Script C has the matching stop. utils/kill_all_process.ttl is only
"kill $(jobs -p)" and a systemd unit is not a shell job, so without this
the load would have run through the post-test snapshot and into the next
test - every temperature and power reading taken at full load, with
nothing in 'show interfaces status' to reveal it. mlucas_amm_log is
copied to /host/hw-eval/jobs/ with the other stress logs.

Two values move into config.ttl:

  EN_timestamp      feeds logopen's 5th argument in Script A, so the
                    per-line timestamp is a knob rather than a literal 1
  BMC_USB_RUNTIME   feeds Script B's ping unit; it was hard-coded to
                    -w 14400 (4 h), which no longer matched the soak
                    lengths the SSD and USB knobs were being set to

SSD_RUNTIME and USB_RUNTIME also go 600 -> 3600, so the shipped default
is a one hour stress rather than the ten minutes V1.1.7 went out with.
--runtime is still the job's overall limit; COUNT does not multiply it.

Script A's Version History carries the V1.1.8 entries for all of this.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014RetWKFZFG1ZHcitQAyhwM
This commit is contained in:
2026-09-06 17:21:52 +08:00
co-authored by Claude Opus 5
parent 4f2f9ed090
commit 9cdd651d79
4 changed files with 98 additions and 10 deletions
+74 -3
View File
@@ -1,7 +1,7 @@
; ============================================================================= ; =============================================================================
; Script A for Blanton ; Script A for Blanton
; Version : V1.1.7 ; Version : V1.1.8
; Date : 2026-09-04 ; Date : 2026-09-06
; Author : ETWen ; Author : ETWen
; ============================================================================= ; =============================================================================
; Version History: ; Version History:
@@ -341,6 +341,73 @@
; sprintf2 cmd_ssd ... SSD_RUNTIME SSD_COUNT, and the same ; sprintf2 cmd_ssd ... SSD_RUNTIME SSD_COUNT, and the same
; for USB; the old hard-coded lines are left commented out ; for USB; the old hard-coded lines are left commented out
; next to them ; next to them
; V1.1.8 2026-09-06
; ScriptA Drive logopen's timestamp flag from EN_timestamp
; logopen filename 0 1 1 EN_timestamp, with the argument
; order spelled out above the call: <file> <binary>
; <append> <PlainText> <timestamp>
; binary must stay 0. In binary mode Tera Term writes the
; raw stream and both PlainText and the timestamp are
; ignored
; !! EN_timestamp has to exist in config.ttl. An undefined
; variable aborts the macro at logopen, it is not read
; as 0
; !! the timestamp FORMAT lives in TERATERM.INI (Setup >
; Additional settings > Log), so it follows the PC and
; not this script. Two testers can produce differently
; stamped logs from one macro
; ScriptB Run mlucas as a systemd unit, not a shell background job
; systemd-run --unit=mlucas-amm --property=Type=exec
; --property=Restart=always --property=RestartSec=2
; The '&' job belonged to the interactive shell: it died
; with the session, and 'jobs' could not see it from a
; reconnected one, so a soak that lost its terminal quietly
; stopped loading the CPU
; The log is truncated with '>' before the unit starts and
; appended with '>>' inside it, so a restart adds to the
; run instead of erasing it
; 'systemctl is-active mlucas-amm' now sits beside 'jobs',
; both in the one-shot check and in the monitor loop at the
; end
; !! the old '&' line is kept commented out directly above
; it, to fall back to if systemd-run is unavailable
; ScriptB Take the BMC USB ping duration from BMC_USB_RUNTIME
; sprintf2 cmd '... -w %d ...' ncm_if BMC_USB_RUNTIME. It
; was hard-coded to 14400 (4 h), which no longer matched
; the soak the SSD and USB knobs were set for
; ScriptC Stop mlucas-amm and copy its log to the USB stick
; utils/kill_all_process.ttl is only "kill $(jobs -p)", and
; a systemd unit is not a shell job
; ScriptB's change on its own would have left mlucas
; loading all 16 cores through ScriptC and into the next
; run, so every temperature and power reading after it
; would have been taken under load
; cp ~/hammer/tools/amd/mlucas_amm_log /host/hw-eval/jobs/
; joins the other stress logs
; !! ScriptB and ScriptC change together. Whoever moves a
; stress job to systemd owns the matching stop in
; ScriptC
; config.ttl Add EN_timestamp and BMC_USB_RUNTIME, raise stress runtimes
; EN_timestamp = 1 feeds ScriptA's logopen; BMC_USB_RUNTIME
; = 172800 feeds ScriptB's ping unit
; SSD_RUNTIME and USB_RUNTIME 600 -> 3600, so the shipped
; default is a one hour stress rather than the ten minutes
; V1.1.7 went out with
; !! --runtime is still the job's OVERALL limit. RUNTIME
; 3600 = one hour of stress; COUNT does not multiply it.
; For a 2 day soak set RUNTIME 172800
; .gitignore Ignore src/Script_ABC_Blanton/hammer/
; ~99 MB of unstripped mlucas ELF binaries (avx512 / avx2 /
; avx / sse2 / generic-c) that ScriptB and the thermal
; macro chmod and run on the DUT
; !! they are deliberately NOT in git. A binary tree that
; large is permanent once committed and every clone pays
; for it forever; the DUT image already carries hammer/
; publish/publish.sh Exclude hammer/ from the delivery bundle
; rsync copies whatever sits in src/, so a developer who
; happened to have the binaries locally would have shipped
; a 100 MB zip while a clone shipped 200 KB. The bundle is
; now the same either way
; ============================================================================= ; =============================================================================
include "config.ttl" include "config.ttl"
@@ -353,7 +420,11 @@ getdir mdir
if EN_log = 1 then if EN_log = 1 then
sprintf2 filename '%s\Logs\%s_%s_%s.log' mdir project_name strTestcase str_starttime sprintf2 filename '%s\Logs\%s_%s_%s.log' mdir project_name strTestcase str_starttime
logopen filename 0 1 1 1 ; logopen <file> <binary> <append> <PlainText> <timestamp>
; binary=0 text mode, so PlainText / timestamp are honoured
; append=1 keep earlier cycles, do not overwrite
; PlainText=1 strip the ANSI colour codes SONiC emits
logopen filename 0 1 1 EN_timestamp
endif endif
; ========== Root Login ========== ; ========== Root Login ==========
+11 -2
View File
@@ -15,10 +15,15 @@ pause 1
;sendln "command" ;sendln "command"
; ========== AMD CPU STRESS TEST ========== ; ========== AMD CPU STRESS TEST ==========
; Clear the log file first
wait prompt_sonic_root
sendln "> ~/hammer/tools/amd/mlucas_amm_log"
wait prompt_sonic_root wait prompt_sonic_root
sendln 'chmod +x ~/hammer/tools/amd/mlucas-avx2' sendln 'chmod +x ~/hammer/tools/amd/mlucas-avx2'
wait prompt_sonic_root wait prompt_sonic_root
sendln "~/hammer/tools/amd/mlucas-avx2 -s l -cpu 0:15 > ~/hammer/tools/amd/mlucas_amm_log 2>&1 &" ;sendln "~/hammer/tools/amd/mlucas-avx2 -s l -cpu 0:15 > ~/hammer/tools/amd/mlucas_amm_log 2>&1 &"
sendln "systemd-run --unit=mlucas-amm --property=Type=exec --property=Restart=always --property=RestartSec=2 /bin/bash -c '~/hammer/tools/amd/mlucas-avx2 -s l -cpu 0:15 >> ~/hammer/tools/amd/mlucas_amm_log 2>&1'"
; ========== BMC DDR Stress Test ========== ; ========== BMC DDR Stress Test ==========
;wait prompt_sonic_root ;wait prompt_sonic_root
@@ -65,6 +70,8 @@ sendln cmd
wait prompt_sonic_root wait prompt_sonic_root
sendln "jobs" sendln "jobs"
wait prompt_sonic_root wait prompt_sonic_root
sendln "systemctl is-active mlucas-amm"
wait prompt_sonic_root
sendln "bgctl list" sendln "bgctl list"
; ========== BMC USB Test ========== ; ========== BMC USB Test ==========
@@ -89,7 +96,7 @@ wait prompt_sonic_root
sendln 'systemctl stop qfx5252-bmc-usb-net-test.service 2>/dev/null || true' sendln 'systemctl stop qfx5252-bmc-usb-net-test.service 2>/dev/null || true'
wait prompt_sonic_root wait prompt_sonic_root
sendln 'systemctl reset-failed qfx5252-bmc-usb-net-test.service 2>/dev/null || true' sendln 'systemctl reset-failed qfx5252-bmc-usb-net-test.service 2>/dev/null || true'
sprintf2 cmd 'systemd-run --unit=qfx5252-bmc-usb-net-test --property=Type=exec /usr/bin/ping -I %s -i 1 -W 2 -w 14400 192.168.200.200' ncm_if sprintf2 cmd 'systemd-run --unit=qfx5252-bmc-usb-net-test --property=Type=exec /usr/bin/ping -I %s -i 1 -W 2 -w %d 192.168.200.200' ncm_if BMC_USB_RUNTIME
wait prompt_sonic_root wait prompt_sonic_root
sendln cmd sendln cmd
@@ -179,5 +186,7 @@ while 1
sendln "bgctl list" sendln "bgctl list"
wait prompt_sonic_root wait prompt_sonic_root
sendln "jobs" sendln "jobs"
wait prompt_sonic_root
sendln "systemctl is-active mlucas-amm"
pause 60 pause 60
endwhile endwhile
@@ -12,6 +12,11 @@ pause 1
; ========== Kill Process ========== ; ========== Kill Process ==========
include "utils/kill_all_process.ttl" include "utils/kill_all_process.ttl"
wait prompt_sonic_root
sendln "systemctl is-active mlucas-amm"
wait prompt_sonic_root
sendln "systemctl stop mlucas-amm"
; bgctrl all stop ; bgctrl all stop
wait prompt_sonic_root wait prompt_sonic_root
sendln "bgctl stop --all" sendln "bgctl stop --all"
@@ -211,6 +216,8 @@ sendln cmd
; ========== Copy Stress Log to USB ========== ; ========== Copy Stress Log to USB ==========
wait prompt_sonic_root wait prompt_sonic_root
sendln "cp ~/hammer/tools/amd/mlucas_amm_log /host/hw-eval/jobs/"
wait prompt_sonic_root
sendln "cp ./Blanton_Script/log/bmc_usb_net.log /host/hw-eval/jobs/" sendln "cp ./Blanton_Script/log/bmc_usb_net.log /host/hw-eval/jobs/"
wait prompt_sonic_root wait prompt_sonic_root
sendln "cp ./Blanton_Script/log/bmc_poll.log /host/hw-eval/jobs/" sendln "cp ./Blanton_Script/log/bmc_poll.log /host/hw-eval/jobs/"
@@ -220,7 +227,6 @@ wait prompt_sonic_root
sendln "cp ./Blanton_Script/log/nfc_poll.log /host/hw-eval/jobs/" sendln "cp ./Blanton_Script/log/nfc_poll.log /host/hw-eval/jobs/"
wait prompt_sonic_root wait prompt_sonic_root
getdate ts_date "%Y%m%d" getdate ts_date "%Y%m%d"
gettime ts_time "%H%M" gettime ts_time "%H%M"
+6 -4
View File
@@ -6,6 +6,7 @@ strTestcase="ENV" ;ENV,EMC,Margin...etc
EN_Margin = 0 ; 1: Enable Margin Test, 0: Disable Margin Test EN_Margin = 0 ; 1: Enable Margin Test, 0: Disable Margin Test
EN_log = 1 ; 1: Enable log, 0: Disable log EN_log = 1 ; 1: Enable log, 0: Disable log
EN_timestamp = 1 ; 1: Enable timestamp in log, 0: Disable timestamp in log
;================================================================ ;================================================================
; FAN_SPEED ; FAN_SPEED
@@ -20,10 +21,11 @@ SWB_UNIT1 = 1 ; 1 = this DUT has switch unit 1, wait for it ; 0 = skip
;================================================================ ;================================================================
; Stress_Test ; Stress_Test
;================================================================ ;================================================================
SSD_RUNTIME = 600 ; Unit seconds, 600 = 10 minutes SSD_RUNTIME = 3600 ; Unit seconds, 3600 = 1 hour
SSD_COUNT = 720 ; Total time = SSD_RUNTIME * SSD_COUNT SSD_COUNT = 240 ; Total time = SSD_RUNTIME * SSD_COUNT
USB_RUNTIME = 600 ; Unit seconds, 600 = 10 minutes USB_RUNTIME = 3600 ; Unit seconds, 3600 = 1 hour
USB_COUNT = 720 ; Total time = USB_RUNTIME * USB_COUNT USB_COUNT = 240 ; Total time = USB_RUNTIME * USB_COUNT
BMC_USB_RUNTIME = 172800 ; Unit seconds, 172800 = 2 days
;================================================================ ;================================================================
; Prompt Definitions ; Prompt Definitions