从实列中学习linux shell10 : 如何根据服务器的内存,cpu 以及 ssd硬盘 来确定mysql 的最大并发数

以下是根据服务器硬件资源智能推荐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

第三步:设计逻辑说明

  1. 多维度资源评估

    • CPU计算法:根据核心数和存储类型动态调整基数
      • HDD:每核心100连接
      • SSD:每核心130连接(提升30%)
    • 内存计算法:基于可用内存和连接内存消耗
      • 计算公式:可用内存 / 单连接内存消耗
  2. 动态参数调整

    # 可调整参数区域
    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      # 系统保留内存
    
  3. 智能边界保护

    • 最小值保护:至少200连接(避免低配服务器连接不足)
    • 最大值限制:不超过16384(防止内存溢出)
  4. 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

监控指标关注:

  1. 连接利用率

    SHOW STATUS LIKE 'Threads_connected';
    SHOW STATUS LIKE 'Max_used_connections';
    
  2. 资源瓶颈检测

    # 内存监控
    watch -n 1 "free -m | awk '/Mem:/{print \"Used:\",\$3,\"MB\"}'"
    
    # CPU负载
    mpstat -P ALL 1 5
    
    # I/O压力
    iostat -dx 1
    

##第四步:典型场景调整示例

服务器配置推荐值计算依据
4核/8GB/HDD4004核100=400 < (8G0.7-2G)/4=750
16核/64GB/SSD208016核130=2080 < (64G0.7-2G)/4=1070→取1070
32核/256GB/NVMe SSD16384达到上限值

第五步:注意事项

  1. 连接内存消耗
    实际内存占用受以下因素影响:

    • 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)
    ))
    
  2. 连接风暴防护
    建议配合以下参数使用:

    [mysqld]
    max_connect_errors=1000      # 防止暴力连接
    wait_timeout=300            # 非交互连接超时
    interactive_timeout=600      # 交互连接超时
    
  3. 连接池优化
    应用端建议配置:

    # HikariCP配置示例
    maximumPoolSize=推荐值的80%
    idleTimeout=30000
    connectionTimeout=5000
    

该脚本已在CentOS 7/8和Ubuntu 20.04/22.04验证,适用于MySQL 5.7/8.0版本。实际部署时建议通过AB测试/压力测试验证最终值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一刀到底211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值