云计算百科
云计算领域专业知识百科平台

从实列中学习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

第三步:设计逻辑说明

  • 多维度资源评估

    • 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测试/压力测试验证最终值。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 从实列中学习linux shell10 : 如何根据服务器的内存,cpu 以及 ssd硬盘 来确定mysql 的最大并发数
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!