MySQL 5.6低连接高查询量致性能缓慢,请求技术排查
MySQL 5.6性能异常排查优化方案
一、定位高QPS的真实来源
- 执行
SHOW GLOBAL STATUS LIKE 'Com_%';统计各类SQL执行量,区分是业务查询(Com_select)、写入操作(Com_insert/update/delete)还是内部指令(如Com_ping、Com_stmt_close)——高QPS未必来自业务请求,也可能是短连接风暴或后台线程循环操作。 - 开启慢查询日志:设置
slow_query_log=1、long_query_time=0.1,记录所有执行的SQL,用pt-query-digest分析TOP SQL,重点排查重复执行的低效查询(高QPS叠加小延迟也会拖垮性能)。 - 实时抓活跃连接:执行
SHOW PROCESSLIST;或查询INFORMATION_SCHEMA.PROCESSLIST,过滤Command != 'Sleep'的连接,确认高QPS是否来自隐藏的后台任务(如主从复制线程、事件调度器)。
二、内存配置优化
- 调整InnoDB缓冲池:15GB物理内存仅分配5GB给
innodb_buffer_pool_size过于保守,专用数据库服务器建议设置为10GB(占物理内存的60%-70%),剩余内存留给OS缓存、MySQL线程缓存等组件。 - 优化日志文件:检查
innodb_log_file_size,若小于1GB需调整为1-2GB(修改后需先停库、删除旧日志再重启),避免频繁刷盘导致IO瓶颈。 - 缩减无用内存占用:若无MyISAM表,将
key_buffer_size设为64MB,避免内存浪费。
三、CPU与线程配置调整
- 提升IO并发:8核CPU下,将
innodb_read_io_threads和innodb_write_io_threads调整为8(默认4),增强磁盘IO处理能力。 - 优化线程缓存:设置
thread_cache_size=64-128,减少短连接场景下线程创建销毁的开销——Sleep连接占比高可能是线程缓存未生效,导致MySQL持续创建新线程。 - 排查CPU瓶颈:用
top或vmstat查看CPU使用率,若user%高说明SQL计算量大需优化;若sys%高则可能是系统调用频繁(如IO、线程切换),需调整连接或IO参数。
四、Sleep连接处理
- 自动清理闲置连接:设置
wait_timeout=60、interactive_timeout=60,让超过1分钟的闲置连接自动断开,避免大量Sleep连接占用内存(每个连接约占用1MB内存)。 - 检查客户端连接池:确认应用程序连接池配置是否合理,是否存在连接泄漏(如开启连接后未主动释放)。
五、其他关键排查点
- 磁盘IO检测:执行
iostat -x 1查看磁盘利用率、读写等待时间,若%util接近100%说明存在IO瓶颈,需优化SQL减少IO或升级存储(如更换SSD)。 - 主从复制状态:若为从库,检查
SHOW SLAVE STATUS\G确认复制是否延迟,复制线程是否占用大量资源。 - InnoDB状态分析:执行
SHOW ENGINE INNODB STATUS;,重点查看BUFFER POOL AND MEMORY(缓冲池命中率需达99%以上)、TRANSACTIONS(是否存在锁等待)模块。
内容的提问来源于stack exchange,提问作者martin_alexandre_fr
相关产品推荐
相关产品推荐

