原创:任坤作者简介

任坤,现居珠海,先后担任专职 Oracle 和 MySQL DBA,现在主要负责 MySQL、mongoDB 和 Redis 维护工作。

背景

MySQL 版本:5.6.29,普通主从

OS:CentOS 6.8

最近一段时间线上某实例频繁报警CPU飙高,每次都捕获到同一种 SQL,结构如下:

select uid from test_history where cat_id = '99999' and create_time >= '2019-07-12 19:00:00.000' and uid in (......)

其中uid一次性会传入上百个。

表结构为

Create Table: CREATE TABLE `test_history` (

`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',

`cat_id` varchar(64) NOT NULL,

`uid` varchar(128) NOT NULL,

`msg` varchar(64) NOT NULL',

`create_time` datetime NOT NULL COMMENT '创建时间',

PRIMARY KEY (`id`),

UNIQUE KEY `idx_cat_uid` (`cat_id`,`uid`,`create_time`),

KEY `idx__time` (`create_time`)

) ENGINE=InnoDB AUTO_INCREMENT=***** DEFAULT CHARSET=utf8

SQL 使用到了索引idx_msg_uid_time,单条执行可以秒级完成,但是并发执行会遭遇执行时间过长(超过1个小时)且CPU过高的问题。

诊断思路

mpstat -P ALL 1,查看cpu使用情况,主要消耗在sys即os系统调用上

perf top,cpu主要消耗在_spin_lock

生成perf report查看详细情况

CPU主要消耗在mutex争用上,说明有锁热点。

采用pt-pmp跟踪mysqld执行情况,热点主要集中在mem_heap_alloc和mem_heap_free上。

Pstack提供更详细的API调用栈

#0 0x0000003e0caf80cf in __lll_unlock_wake_private () from /lib64/libc.so.6

#1 0x0000003e0ca7cf6a in _L_unlock_5936 () from /lib64/libc.so.6

#2 0x0000003e0ca78bbc in _int_free () from /lib64/libc.so.6

#3 0x000000000097dcb3 in mem_area_free(void*, mem_pool_t*) ()

#4 0x000000000097d2d2 in mem_heap_block_free(mem_block_info_t*, mem_block_info_t*) ()

#5 0x00000000009e6474 in row_vers_build_for_consistent_read(unsigned char const*, mtr_t*, dict_index_t*, unsigned long**, read_view_t*, mem_block_info_t**, mem_block_info_t*, unsigned char**) ()

#6 0x00000000009dce75 in row_search_for_mysql(unsigned char*, unsigned long, row_prebuilt_t*, unsigned long, unsigned long) ()

#7 0x0000000000939c95 in ha_innobase::index_read(unsigned char*, unsigned char const*, unsigned int, ha_rkey_function) ()

Innodb在读取数据记录时的API路径为

row_search_for_mysql --》

row_vers_build_for_consistent_read --》

mem_heap_create_block_func --》

mem_area_alloc --》

malloc --》

_L_unlock_10151 --》

__lll_unlock_wait_private

row_vers_build_for_consistent_read会陷入一个死循环,跳出条件是该条记录不需要快照读或者已经从undo中找出对应的快照版本,每次循环都会调用mem_heap_alloc/free。

而该表的记录更改很频繁,导致其undo history list比较长,搜索快照版本的代价更大,就会频繁的申请和释放堆内存。

Linux原生的内存库函数为ptmalloc,malloc/free调用过多时很容易产生锁热点。

当多条 SQL 并发执行时,会最终触发os层面的spinlock,导致上述情形。

解决方案

将mysqld的内存库函数替换成tcmalloc,相比ptmalloc,tcmalloc可以更好的支持高并发调用。

修改my.cnf,添加如下参数并重启

[mysqld_safe]

malloc-lib=tcmalloc

上周五早上7点执行的操作,到现在超过72小时,期间该实例没有再出现cpu长期飙高的情形。

以下是修改前后cpu使用率对比

mysql tcmalloc_技术分享 | tcmalloc解决mysqld实例引发的cpu过高问题相关推荐

  1. mysql数据库j电子课件,MYSQL数据库技术分享PPT演示课件

    <MYSQL数据库技术分享PPT演示课件>由会员分享,可在线阅读,更多相关<MYSQL数据库技术分享PPT演示课件(29页珍藏版)>请在人人文库网上搜索. 1.数据库技术分享, ...

  2. C#正则表达式引发的CPU跑高问题以及解决方法

    C#正则表达式引发的CPU跑高问题以及解决方法 参考文章: (1)C#正则表达式引发的CPU跑高问题以及解决方法 (2)https://www.cnblogs.com/cmt/p/csharp_reg ...

  3. mysql mts_技术分享 | 回顾 MySQL 的 MTS

    作者:洪斌 爱可生南区负责人兼技术服务总监,MySQL ACE,擅长数据库架构规划.故障诊断.性能优化分析,实践经验丰富,帮助各行业客户解决 MySQL 技术问题,为金融.运营商.互联网等行业客户提供 ...

  4. mysql relay_技术分享 | MySQL:产生大量小 relay log 的故障一例

    作者:高鹏 文章末尾有他著作的<深入理解 MySQL 主从原理 32 讲>,深入透彻理解 MySQL 主从,GTID 相关技术知识. 源码版本:5.7.22 水平有限,如有误请谅解 本文建 ...

  5. mysql 1280_技术分享 | MySQL 一次奇怪的故障分析

    一.问题来源 这是一个朋友问我的典型案例.整个故障现象表现为,MySQL 数据库频繁的出现大量的请求不能响应.下面是一些他提供的证据: 1. show processlist从状态信息来看出现如下情况 ...

  6. 易语言mysql乱码_分享一个解决MySQL写入中文乱码的方法

    [编程语言:易语言] 之前有发帖请教过如何解决MySQL写入中文乱码的问题.但没人会,或者是会的人不想回答.搜索网上的答案并尝试很多次无效,所以当时就因为这个乱码问题搁浅了一个软件很多日子. 直到昨天 ...

  7. mysql+odbc+ado_MFC ado+mysql+odbc技术分享

    第一步:建立数据库 假设有一个sql文件 mysql>use dbname;                   //创建一个数据库名为dbname的数据库(空数据库) mysql>set ...

  8. 【华为云技术分享】竞享实例:让你尽享云服务的“鱼”和“熊掌”

    摘要:竞享实例作为创新商业模式,为用户提供除按需.包周期之外的新模式 ,即用户可以先到先享,并将颗粒化算力瞬间批量组织起来用于各类可容错场景,其以远低于同类产品的价格以及出色性能为离线转码.离线渲染. ...

  9. mysql mrr_cost_based_技术分享 | 用好 MySQL 的 MRR 优化器

    作者:蒋乐兴 MySQL DBA,擅长 python 和 SQL,目前维护着 github 的两个开源项目:mysqltools .dbmc 以及独立博客:https://www.sqlpy.com. ...

最新文章

  1. vscode css智能补全_强大的 VS Code入门
  2. 操作系统就是一个“死循环”?
  3. 爱立信和威瑞森电信使用VR流式车来测试5G
  4. HDU 3549 Flow Problem
  5. 深度学习(1)深度学习初见
  6. 基于SSD的自动路径规划算法
  7. Unity 2017 Game Optimization 读书笔记(4)Scripting Strategies Part 4
  8. 章乐焱 | 用“科技”监管“科技”,知识图谱能做什么?
  9. 3_一幅图像,经过傅里叶变换后,将高频部分删除,再进行反变换,设想一下将会得到什么结果?...
  10. re 模块, 正则表达式 \w+\d+ 的重复问题引发的题目解析
  11. 项目构建之maven篇:3.m2eclipse使用
  12. Spark RDD 宽依赖窄依赖
  13. 移动测试基础 android 中 dumpsys 命令使用
  14. Django路由控制
  15. c# 中的除法运算需要注意
  16. html excel插件,Web端如此强大的电子表格Excel插件,轻松进行数据处理——jExcel
  17. 操作系统概念第九版编程项目:Linux内核模块
  18. Kali Linux简介
  19. 【阅读论文】第八章--多图像的质量增强--博-自动化眼底图像分析技术可筛查糖尿病患者的视网膜疾病
  20. Linux_centos版初学(基础命令)

热门文章

  1. linux建立空文件的命令,linux创建文件命令
  2. 笔记-基本环境、操作系统的类型与虚拟机的搭建
  3. 如何只为 UIView 的左上角和右上角设置 cornerRadius?
  4. uniapp 社区app点赞功能
  5. 你还在用QQ吗,谁是QQ 等级全球第一呢?
  6. 十九岁中专学历如何自学找到前端工作?
  7. Runnable和Thread比较
  8. PHP支付宝支付事务,php实现支付宝app支付和异步通知的代码实例
  9. 【数据挖掘】心跳信号分类预测 之 赛题理解 —— 学习笔记(一)
  10. canvas截图功能