以下是根據服務器硬件資源智能推薦MySQL最大并發連接數
包含詳細的計算邏輯和實時資源檢測:
且記:該腳本要放在 安裝mysql的服務器上 運行
第一步:實現腳本
#!/bin/bash# 計算MySQL最大連接數推薦值
# 公式說明:取CPU計算值與內存計算值的較小值,SSD優化系數提升30%# 配置參數(可根據需要調整)
CONN_PER_CORE_HDD=100 # HDD磁盤每核心基礎連接數
CONN_PER_CORE_SSD=130 # SSD磁盤每核心基礎連接數
MEM_PER_CONN_MB=4 # 每個連接內存消耗估值(MB)
MYSQL_MEM_RATIO=0.7 # 分配給MySQL的內存比例
RESERVED_MEM_MB=2048 # 系統保留內存(MB)# 獲取硬件信息
CPU_CORES=$(nproc)
TOTAL_MEM=$(free -m | awk '/Mem:/{print $2}')
AVAIL_MEM=$(awk "BEGIN {print int(($TOTAL_MEM - $RESERVED_MEM_MB) * $MYSQL_MEM_RATIO)}")# 檢測SSD
DISK=$(df / | tail -1 | awk '{print $1}' | sed 's/[0-9]//g')
DISK=${DISK#/dev/}
IS_SSD=0
if [[ -e "/sys/block/${DISK}/queue/rotational" ]]; then[[ $(cat "/sys/block/${DISK}/queue/rotational") -eq 0 ]] && IS_SSD=1
fi# 計算邏輯
if [ $IS_SSD -eq 1 ]; thenCPU_BASED=$(( CPU_CORES * CONN_PER_CORE_SSD ))
elseCPU_BASED=$(( CPU_CORES * CONN_PER_CORE_HDD ))
fiMEM_BASED=$(( AVAIL_MEM / MEM_PER_CONN_MB ))
SUGGESTED_CONN=$(( CPU_BASED < MEM_BASED ? CPU_BASED : MEM_BASED ))# 應用邊界限制
MAX_LIMIT=16384 # 最大允許連接數
MIN_LIMIT=200 # 最小推薦連接數
if [ $SUGGESTED_CONN -gt $MAX_LIMIT ]; thenFINAL_CONN=$MAX_LIMIT
elif [ $SUGGESTED_CONN -lt $MIN_LIMIT ]; thenFINAL_CONN=$MIN_LIMIT
elseFINAL_CONN=$SUGGESTED_CONN
fi# 輸出結果
echo "MySQL最大并發連接數推薦值: $FINAL_CONN"
echo "----------------[硬件檢測]-----------------"
echo "CPU核心數 : $CPU_CORES"
echo "物理內存總量 : ${TOTAL_MEM}MB"
echo "可用內存分配 : ${AVAIL_MEM}MB (預留${RESERVED_MEM_MB}MB)"
echo "存儲介質類型 : $([ $IS_SSD -eq 1 ] && echo 'SSD' || echo 'HDD')"
echo "----------------[計算邏輯]-----------------"
echo "CPU計算基數 : $([ $IS_SSD -eq 1 ] && echo ${CONN_PER_CORE_SSD}/core || echo ${CONN_PER_CORE_HDD}/core)"
echo "基于CPU的計算 : ${CPU_BASED} connections"
echo "基于內存的計算 : ${MEM_BASED} connections (${MEM_PER_CONN_MB}MB/conn)"
echo "邊界值約束 : [$MIN_LIMIT, $MAX_LIMIT]"
echo "-------------------------------------------"
echo "操作建議:"
echo "1. 修改/etc/my.cnf添加:"
echo " [mysqld]"
echo " max_connections = $FINAL_CONN"
echo " thread_cache_size = $(( FINAL_CONN / 2 ))"
echo "2. 執行: systemctl restart mysqld"
echo "3. 監控命令: show status like 'Threads_connected';"
第二步:執行方式
chmod +x mysql_max_conn.sh
./mysql_max_conn.sh
第三步:設計邏輯說明
-
多維度資源評估
- CPU計算法:根據核心數和存儲類型動態調整基數
- HDD:每核心100連接
- SSD:每核心130連接(提升30%)
- 內存計算法:基于可用內存和連接內存消耗
- 計算公式:
可用內存 / 單連接內存消耗
- 計算公式:
- CPU計算法:根據核心數和存儲類型動態調整基數
-
動態參數調整
# 可調整參數區域 CONN_PER_CORE_HDD=100 # 機械硬盤每核心基數 CONN_PER_CORE_SSD=130 # 固態硬盤每核心基數 MEM_PER_CONN_MB=4 # 單連接內存估值(建議4-10MB) MYSQL_MEM_RATIO=0.7 # 分配給MySQL的內存比例 RESERVED_MEM_MB=2048 # 系統保留內存
-
智能邊界保護
- 最小值保護:至少200連接(避免低配服務器連接不足)
- 最大值限制:不超過16384(防止內存溢出)
-
SSD優化策略
通過檢測/sys/block/*/queue/rotational
文件:- 值為0:SSD存儲,提升30%連接基數
- 值為1:HDD存儲,使用基礎計算值
第四部:壓力測試建議
# 使用sysbench進行驗證
sysbench oltp_read_write --threads=$(( FINAL_CONN * 2 )) --mysql-host=localhost --mysql-user=root --mysql-password=your_pwd --mysql-db=test prepare
sysbench oltp_read_write --threads=$(( FINAL_CONN * 2 )) --time=300 --report-interval=10 run
監控指標關注:
-
連接利用率
SHOW STATUS LIKE 'Threads_connected'; SHOW STATUS LIKE 'Max_used_connections';
-
資源瓶頸檢測
# 內存監控 watch -n 1 "free -m | awk '/Mem:/{print \"Used:\",\$3,\"MB\"}'"# CPU負載 mpstat -P ALL 1 5# I/O壓力 iostat -dx 1
##第四步:典型場景調整示例
服務器配置 | 推薦值 | 計算依據 |
---|---|---|
4核/8GB/HDD | 400 | 4核100=400 < (8G0.7-2G)/4=750 |
16核/64GB/SSD | 2080 | 16核130=2080 < (64G0.7-2G)/4=1070→取1070 |
32核/256GB/NVMe SSD | 16384 | 達到上限值 |
第五步:注意事項
-
連接內存消耗
實際內存占用受以下因素影響:sort_buffer_size
(默認256KB-4MB)join_buffer_size
(默認256KB)read_buffer_size
(默認128KB)
可通過以下公式估算實際消耗:
# 精確計算模式(需替換實際配置值) MEM_PER_CONN=$(( ${sort_buffer_size} + ${join_buffer_size} * 2 + ${read_buffer_size} * 2 +1048576 # 基礎開銷(1MB) ))
-
連接風暴防護
建議配合以下參數使用:[mysqld] max_connect_errors=1000 # 防止暴力連接 wait_timeout=300 # 非交互連接超時 interactive_timeout=600 # 交互連接超時
-
連接池優化
應用端建議配置:# HikariCP配置示例 maximumPoolSize=推薦值的80% idleTimeout=30000 connectionTimeout=5000
該腳本已在CentOS 7/8和Ubuntu 20.04/22.04驗證,適用于MySQL 5.7/8.0版本。實際部署時建議通過AB測試/壓力測試驗證最終值。