技术分享 | tcmalloc解决mysqld实例引发的cpu过高问题 - 爱
可生开源社区 - OSCHINA
作者简介
任坤,现居珠海,先后担任专职 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系统调用上
评论