針對「每天 09:00-18:00 核心業務時段 TPS」的監控需求,單次採樣無法反映全時段趨勢。本文設計雙腳本協作方案:Job 腳本每天 09:00 定時採集基線值;查詢腳本隨時計算「從 09:00 到當前」的累積平均 TPS。
┌──────────────────┐ 基線文件 ┌──────────────────┐ │ 09:00 定時 Job │ ───────────────▶ │ 實時查詢腳本 │ │ 采集 Com_* 計數 │ tps_everydat_9 │ 讀取基線 + 當前 │ │ 記錄啟動時間戳 │ tps_lastime │ 計算累積 TPS │ └──────────────────┘ └──────────────────┘
tps_daily_baseline.sh)#!/bin/bash
# 每天 09:00 通過 crontab 執行:0 9 * * * /path/tps_daily_baseline.sh
MYSQL_USER="root"
MYSQL_PASS="123"
MYSQL_HOST="localhost"
DATE_TAG=$(date +%Y%m%d)
BASE_DIR="/root/monitor"
# 輸出文件
BASELINE_FILE="${BASE_DIR}/tps_everydat_9.${DATE_TAG}.txt"
TIME_FILE="${BASE_DIR}/tps_lastime.${DATE_TAG}.txt"
# 記錄基線時間
date "+%Y-%m-%d %H:%M:%S" > "${TIME_FILE}"
# 采集三大寫入計數器
get_counter() {
mysql -h"$MYSQL_HOST" -u"$MYSQL_USER" -p"$MYSQL_PASS" -N -e \
"SHOW GLOBAL STATUS WHERE Variable_name IN ('Com_insert','Com_update','Com_delete');" |
awk '{sum+=$2} END {print sum}'
}
tps_sum=$(get_counter)
echo "$tps_sum" > "${BASELINE_FILE}"
echo "[$(date)] Baseline recorded: TPS_SUM=$tps_sum, TIME=$(cat ${TIME_FILE})"
tps_realtime_query.sh)#!/bin/bash
# 隨時執行,計算 09:00 至今的平均 TPS
MYSQL_USER="root"
MYSQL_PASS="123"
MYSQL_HOST="localhost"
DATE_TAG=$(date +%Y%m%d)
BASE_DIR="/root/monitor"
BASELINE_FILE="${BASE_DIR}/tps_everydat_9.${DATE_TAG}.txt"
TIME_FILE="${BASE_DIR}/tps_lastime.${DATE_TAG}.txt"
# 檢查基線文件是否存在
[[ ! -f "$BASELINE_FILE" ]] && { echo "❌ 基線文件不存在,請確認 09:00 Job 是否執行"; exit 1; }
# 讀取基線
tps_old=$(cat "$BASELINE_FILE")
start_time_str=$(cat "$TIME_FILE")
# 獲取當前計數器
get_counter() {
mysql -h"$MYSQL_HOST" -u"$MYSQL_USER" -p"$MYSQL_PASS" -N -e \
"SHOW GLOBAL STATUS WHERE Variable_name IN ('Com_insert','Com_update','Com_delete');" |
awk '{sum+=$2} END {print sum}'
}
tps_new=$(get_counter)
# 計算時間差(秒)
start_sec=$(date -d "$start_time_str" +%s)
end_sec=$(date +%s)
elapsed=$((end_sec - start_sec))
# 防除零
[[ $elapsed -le 0 ]] && { echo "⏱ 時間異常"; exit 1; }
# 計算累積 TPS
tps_diff=$((tps_new - tps_old))
tps_avg=$(awk "BEGIN {printf \"%.2f\", $tps_diff / $elapsed}")
echo "=========================================="
echo " 統計區間: ${start_time_str} ~ $(date '+%Y-%m-%d %H:%M:%S')"
echo " 歷時: ${elapsed} 秒"
echo " 寫入增量: ${tps_diff}"
echo " 平均 TPS: ${tps_avg}"
echo "=========================================="
# 1. 創建目錄並賦權 mkdir -p /root/monitor chmod +x tps_daily_baseline.sh tps_realtime_query.sh # 2. 配置 crontab (root) crontab -e # 每天 09:00 採集基線 0 9 * * * /root/monitor/tps_daily_baseline.sh >> /root/monitor/tps_job.log 2>&1 # 3. 可選:每 5 分鐘自動推送到監控系統 */5 * * * * /root/monitor/tps_realtime_query.sh --prom >> /var/lib/node_exporter/textfile_collector/tps_business.prom
| 指標 | 單次採樣 TPS | 業務時段累積 TPS |
|---|---|---|
| 反映範圍 | 當前瞬間吞吐 | 全時段平均水平 |
| 適用場景 | 性能抖動排查、容量壓測 | 業務健康度、SLA 考核、趨势分析 |
| 抗干擾性 | 受瞬時大事務影響大 | 平滑短時尖峰,更穩健 |
Insert TPS、Update TPS、Delete TPS,識別寫入熱點類型。「定時基線 + 實時差值」雙腳本模式,以極低開銷實現業務級 TPS 連續觀測。核心優勢:**無侵入、無中間件、標準 SQL 計數器、易於集成現有監控體系**。配合 crontab 與文本文件收集器,即可構建生產級「業務時段吞吐儀表盤」。