echo "===TEST:memory===" # 读取温度(sensors 不可用时输出空) read_temp() { sensors 2>/dev/null | grep -oP '\+?\d+(\.\d+)?(?=°C)' | head -1 } # 后台采样内存使用率 + 温度 SAMPLE_LOG=/tmp/auto-check-memory-sample.log : > "$SAMPLE_LOG" ( while true; do TS=$(date +%H:%M:%S) MEM_TOTAL=$(awk '/^MemTotal:/{print $2}' /proc/meminfo) MEM_AVAIL=$(awk '/^MemAvailable:/{print $2}' /proc/meminfo) if [ -z "$MEM_AVAIL" ] || [ "$MEM_AVAIL" = "0" ]; then MEM_AVAIL=$(awk '/^MemFree:/{print $2}' /proc/meminfo) fi MEM_PCT=$(awk -v t="$MEM_TOTAL" -v a="$MEM_AVAIL" 'BEGIN{if(t>0) printf "%.1f", (t-a)/t*100}') TEMP=$(read_temp) echo "${TS},${MEM_PCT},${TEMP}" >> "$SAMPLE_LOG" sleep "${AUTOCHECK_SAMPLE_INTERVAL:-2}" done ) & SAMPLE_PID=$! START_TIME=$(date +%s%N) set +e OUTPUT=$(stress-ng --vm "${AUTOCHECK_THREADS:-4}" --vm-bytes "${AUTOCHECK_MEM_MB:-256}M" --vm-method all --timeout "${AUTOCHECK_DURATION:-30}s" --temp-path /tmp --metrics-brief 2>&1) EXIT_CODE=$? set -e END_TIME=$(date +%s%N) kill $SAMPLE_PID 2>/dev/null || true wait $SAMPLE_PID 2>/dev/null || true DURATION_MS=$(( (END_TIME - START_TIME) / 1000000 )) if [ "$EXIT_CODE" -eq 0 ]; then echo 'status:pass'; else echo 'status:fail'; fi echo "duration:${DURATION_MS}ms" # 跑分:各 stressor 的 bogo ops/s 之和 SCORE=$(echo "$OUTPUT" | awk ' /^stress-ng:/ && ($4=="cpu" || $4=="vm" || $4=="iomix" || $4=="memrate") { v=$(NF-1)+0; if (v>0) s+=v } END { printf "%.1f", s+0 }') echo "score:${SCORE}" # 关键指标 MAX_MEM=$(awk -F',' '$2!="" && $2+0>m {m=$2} END{printf "%.1f", m+0}' "$SAMPLE_LOG") echo "metric:mem_used_pct=${MAX_MEM}" MAX_TEMP=$(awk -F',' '$3!="" && $3+0>m {m=$3} END{printf "%.1f", m+0}' "$SAMPLE_LOG") HAS_TEMP=$(awk -F',' '$3!="" && $3+0>0{f=1} END{print f+0}' "$SAMPLE_LOG") if [ "$HAS_TEMP" = "1" ]; then echo "metric:max_temp=${MAX_TEMP}"; fi echo "output:${OUTPUT}" # 采样数据(首行表头) echo "===SAMPLES===" echo "time,mem_used_pct,temp" cat "$SAMPLE_LOG" echo "===END_SAMPLES===" echo ''