以下是根据服务器硬件资源智能推荐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 ]; then
CPU_BASED=$(( CPU_CORES * CONN_PER_CORE_SSD ))
else
CPU_BASED=$(( CPU_CORES * CONN_PER_CORE_HDD ))
fi
MEM_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 ]; then
FINAL_CONN=$MAX_LIMIT
elif [ $SUGGESTED_CONN -lt $MIN_LIMIT ]; then
FINAL_CONN=$MIN_LIMIT
else
FINAL_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%)
- 内存计算法:基于可用内存和连接内存消耗
- 计算公式:可用内存 / 单连接内存消耗
动态参数调整
# 可调整参数区域
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测试/压力测试验证最终值。
评论前必须登录!
注册