TPS(Transactions Per Second)是衡量數據庫吞吐能力的核心指標。本文提供一個生產可用的 Bash 腳本,通過採樣 Com_insert、Com_update、Com_delete 計數器差值,計算任意時間窗口(如 10 秒)內的平均 TPS。
TPS = (ΔCom_insert + ΔCom_update + ΔCom_delete) / 采樣間隔秒數
註:Com_commit + Com_rollback 亦可作為事務維度 TPS,視業務定義而定。
calc_tps.sh)#!/bin/bash
# MySQL TPS 計算腳本 - 支援自定義採樣間隔
# 依賴:mysql client、awk、date
# ===== 配置區 =====
MYSQL_USER="root"
MYSQL_PASS="123"
MYSQL_HOST="localhost"
SLEEP_TIME=10 # 採樣間隔(秒),可通過 $1 傳參覆蓋
# ===================
# 顏色輸出函數
cecho() { local msg="${1:-No message}"; local color="${2:-black}"; printf "\033[${color}m%s\033[0m\n" "$msg"; }
cechon() { local msg="${1:-No message}"; local color="${2:-black}"; printf "\033[${color}m%s\033[0m" "$msg"; }
# 顏色碼映射
declare -A COL=( [red]=31 [green]=32 [yellow]=33 [blue]=34 [magenta]=35 [cyan]=36 [white]=37 )
color_code() { echo "${COL[$1]:-0}"; }
# 獲取計數器快照
get_counters() {
local prefix="$1"
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 -v p="$prefix" '{val[$1]=$2} END {print val["Com_insert"]+val["Com_update"]+val["Com_delete"]}'
}
# 主流程
cecho "正在獲取 TPS 基線值..." "cyan"
tps_start=$(get_counters "start")
cecho "等待 ${SLEEP_TIME}s 進行採樣..." "yellow"
sleep "$SLEEP_TIME"
cecho "獲取 TPS 結束值..." "cyan"
tps_end=$(get_counters "end")
# 計算
diff=$((tps_end - tps_start))
tps_avg=$(awk "BEGIN {printf \"%.2f\", $diff / $SLEEP_TIME}")
cechon "最近 ${SLEEP_TIME} 秒平均 TPS: " "cyan"
cecho "$tps_avg" "red"
# 賦予執行權限 chmod +x calc_tps.sh # 預設 10 秒採樣 ./calc_tps.sh # 輸出:最近 10 秒平均 TPS: 123.45 # 自定義 30 秒採樣 ./calc_tps.sh 30
QPS(Questions/Com_select)、Threads_running、Innodb_row_lock_waits 等。cron 僅在業務高峰期(如 09:00-18:00)高頻採樣,其餘低頻或暫停。PROCESS、REPLICATION CLIENT 權限。通過 SHOW GLOBAL STATUS 計數器差值法計算 TPS,實現簡單、開銷極低、無需額外插件。將腳本納入監控體系,配合可視化與告警,構建「可觀測」的 MySQL 性能基線。