【MySQL】时区设置引发的卡顿

作者:田杰
查询执行时间长引发应用感知 “卡顿” 的场景在数据库的日常支持和使用中并不少见,但由于时区设置引发的 SQL 执行“卡顿”仍然是一个有趣的现象,之前没有具体关注过。
这次客户的细致与坚持让我们找到了问题的源头。

1. 名词解释

序列号名词说明
1CPU 使用率非空闲的 CPU 时间占比。
2User CPU 使用率用户空间(user-space)应用代码消耗的 CPU 时间占比。
3Sys CPU 使用率系统空间(sys-space)内核代码消耗 CPU 时间占比。
4FutexLinux 内核提供的快速用户态锁/信号量;在无竞争场景完全在用户空间中运行,但在存在竞争场景会引发系统调用。

2. 问题现象

客户 MySQL 8.0 实例在 2020-03-19 22:03 ~ 22:04 出现大量活跃连接堆积,慢日志中出现大量低成本查询,并且 CPU 使用率不高但系统 SYS CPU 使用率出现异常波动。
image.png
image.png

3. 问题排查

3.1 OS 层面

我们来考虑一下有哪些因素可能会导致卡顿:
• 物理机 OS 层面波动(通过 IO_WAIT 指标排除)。
• MySQL 自身机制。

3.2 MySQL 层面

排除掉 OS 层面异常类因素,我们开始聚焦在 mysqld 进程调用栈的分析。
为了更好的分析 MySQL 的行为,阿里数据库提供了扁鹊系统来跟踪、统计和展示确定时间内的进程内部方法调用情况。
image.png
我们分析上图可以看到 40.5% 的 CPU 时间消耗在 Time_zone_system::gmt_sec_to_TIME() 方法的调用上,就是以下这一段的代码。

void Time_zone_system::gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const {struct tm tmp_tm;time_t tmp_t = (time_t)t;localtime_r(&tmp_t, &tmp_tm);localtime_to_TIME(tmp, &tmp_tm);tmp->time_type = MYSQL_TIMESTAMP_DATETIME;adjust_leap_second(tmp);}

仔细阅读这段代码会发现 localtime_to_TIME() 和 adjust_leap_second() 都是简单的格式转换和计算,并不涉及系统调用。
而 localtime_r() 会涉及到 glibc 中的 __localtime_r() 方法,代码如下

/* Return the `struct tm' representation of *T in local time,using *TP to store the result.  */struct tm *__localtime_r (t, tp)const time_t *t;struct tm *tp;{return __tz_convert (t, 1, tp);}weak_alias (__localtime_r, localtime_r)

我们继续下钻来看一下 __tz_convert() 的实现,代码如下

/* Return the `struct tm' representation of *TIMER in the local timezone.Use local time if USE_LOCALTIME is nonzero, UTC otherwise.  */struct tm *__tz_convert (const time_t *timer, int use_localtime, struct tm *tp){long int leap_correction;int leap_extra_secs;if (timer == NULL){__set_errno (EINVAL);return NULL;}
__libc_lock_lock (tzset_lock);
/* Update internal database according to current TZ setting.POSIX.1 8.3.7.2 says that localtime_r is not required to set tzname.This is a good idea since this allows at least a bit more parallelism.  */
tzset_internal (tp == &_tmbuf && use_localtime, 1);
if (__use_tzfile)__tzfile_compute (*timer, use_localtime, &leap_correction,&leap_extra_secs, tp);
else{if (! __offtime (timer, 0, tp))
tp = NULL;else
__tz_compute (*timer, tp, use_localtime);leap_correction = 0L;leap_extra_secs = 0;}
if (tp){if (! use_localtime)
{tp->tm_isdst = 0;tp->tm_zone = "GMT";tp->tm_gmtoff = 0L;
}if (__offtime (timer, tp->tm_gmtoff - leap_correction, tp))tp->tm_sec += leap_extra_secs;else
tp = NULL;}
__libc_lock_unlock (tzset_lock);
return tp;
}

注意到 代码中有 加锁 和 解锁 的操作出现,那么现在我们来看一下 __libc_lock_lock() 的定义,代码如下

#if IS_IN (libc) || IS_IN (libpthread)# ifndef __libc_lock_lock#  define __libc_lock_lock(NAME) \({ lll_lock (NAME, LLL_PRIVATE); 0; })# endif#else# undef __libc_lock_lock# define __libc_lock_lock(NAME) \__libc_maybe_call (__pthread_mutex_lock, (&(NAME)), 0)#endif

继续追溯 lll_lock() 的实现,代码如下

static inline void
__attribute__ ((always_inline))
__lll_lock (int *futex, int private)
{int val = atomic_compare_and_exchange_val_24_acq (futex, 1, 0);if (__glibc_unlikely (val != 0)){if (__builtin_constant_p (private) && private == LLL_PRIVATE)__lll_lock_wait_private (futex);else__lll_lock_wait (futex, private);}
}
#define lll_lock(futex, private) __lll_lock (&(futex), private)

可以看到代码中使用 atomic_compare_and_exchange_val_24_acq() 尝试对 futex 加锁。
而 futex 作为多个 thread 间共享的一块内存区域在多个 client thread(多个会话/查询)竞争的场景下会引发系统调用而进入系统态,导致 SYS 系统态 CPU 使用率上升。
并且该临界区保护的锁机制限制了时区转换方法 __tz_convert() 的并发度,进而出现多个会话/查询 等待获取锁进入临界区的情况,当冲突争抢激烈的场景下引发卡顿
那么是什么引发的
Time_zone_system::gmt_sec_to_TIME() 调用呢,追溯下 Field_timestampf::get_date_internal() 方法,代码如下

bool Field_timestampf::get_date_internal(MYSQL_TIME *ltime) {THD *thd = table ? table->in_use : current_thd;struct timeval tm;my_timestamp_from_binary(&tm, ptr, dec);if (tm.tv_sec == 0) return true;thd->time_zone()->gmt_sec_to_TIME(ltime, tm);return false;
}

该方法中调用了基类 Time_zone 虚函数 gmt_sec_to_TIME() 来进行带时区的秒到时间格式的转换,结合 Field_timestampf::get_date_internal() 的名称能够推断出查询中应该涉及了 timestamp 数据类型的访问。
基于上面的推测我们验证下卡顿的查询和其数据类型

# 慢查询
SELECT id, ......create_time, update_time, ...... 
FROM mytab 
WHERE duid IN (?,?,?,?,? ) 
and (state in (2, 3) or ptype !=0)
# 查询涉及的表
CREATE TABLE `mytab` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`duid` char(32) NOT NULL,......`state` tinyint(2) unsigned NOT NULL DEFAULT '0',`ptype` tinyint(4) NOT NULL DEFAULT '0',`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,......,PRIMARY KEY (`id`),
) ENGINE=InnoDB

从上面的信息能够看到 create_time 和 update_time 字段都是 timestamp 数据类型,验证了之前的猜测。

4. 问题解决

在上面分析的基础上可以看到调用 Time_zone_system::gmt_sec_to_TIME() 引入的 OS 层面 futex 锁竞争导致了低成本查询执行卡顿。
为了规避调用该方法,可以在实例控制台将 time_zone 参数值由 system 调整为当地时区,比如中国东 8 区时区 '+8:00'
修改后,会调用 Time_zone_offset::gmt_sec_to_TIME() 来直接在 MySQL 层面进行计算,避免访问 glibc 的函数引发 OS 层面的加解锁。
修改效果对比(对比执行同样次数的 timestamp 数据类型查询完成时间)
time_zone='system',需要约 15 分钟 完成
image.png
time_zone='+8:00',需要约 5 分钟 完成
image.png

5. 最佳实践

高并发应用如果涉及到高频次的 timestamp 类型数据访问:
• 如果确实要使用 timestamp 类型,建议控制台设置 time_zone 参数为 UTC/GMT 偏移量格式,比如 东8区 '+8:00',可以有效降低高并发查询执行开销,降低响应时间 RT。
• 由于 MySQL 5.7 版本后 Datatime 类型支持 Timestamp 类型的默认值并且支持 on update current_timestamp 属性,建议使用 Datetime 类型替换 Timestamp 类型。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

老码农90%的程序猿都是瞎努力,这份路线教你成为高手!

数据正在变得越来越常见,小到我们每个人的社交网络、消费信息、运动轨迹……,大到企业的销售、运营数据,产品的生产数据,交通网络数据……如何从海量数据中获得别人看不见的知识,如何利用数据来武装营销工作、优化产品…

企业微信_H5应用如何本地及真机调试_host配置及代理相关

文章目录一、准备工作1. 下载SwitchHosts2. 创建vue项目3. 启动项目3. 请求验证4. 域名访问5. Invalid Host header二、电脑调试2.1. 设置应用主页2.2. PC企微登录2.3. PC企微应用2.4. 更新验证2.5. 跳转页面三、手机调试3.1. 代理软件3.2. 安装,启动3.3. 连接无线网…

揭秘MySQL生态重要功能,X-Engine引擎核心能力——OnlineDDL

概述 X-Engine是阿里自研的数据库存储引擎,以插件的方式接入到MySQL生态,支持行锁,事务,MVCC等OLTP场景的核心功能。 X-Engine的核心优势是低成本,高性价比,尤其适用于历史库场景,目前阿里巴巴…

企业微信_获取access_token

文章目录一、快速入门1. 开发文档2. 管控台3. 接口文档4. 参数获取5. api调试二、java实战2.1. 入口2.2. 核心方法2.3. 核心配置2.3. RestUtils 工具类2.5. token缓存策略三、源码分享3.1. 后端源码3.2. 前端源码一、快速入门 1. 开发文档 企业内部开发文档: http…

荷兰政府用大数据预测天气预防自然灾害,他们是怎么做的?

作者 | 乔治娜乌斯蒂克翻译 | Katie责编 | 晋兆雨头图 | CSDN付费下载于视觉中国你是否对天气预报电视报道的背后的运作感到好奇?是谁在管理政府卫星?也许你会思考关于传感器的一个问题——数据会流向何处? 在荷兰,这些数据是由KN…

Excel VBA Sql 操作Access数据库

目录 1. 文件创建2. 数据库连接2.1 前期和后期绑定2.2 通过判断 Excel 的不同版本,给出不同的连接字符串2.3 Excel 自连接3. 应用:增、删、改3.1 增加数据的语法3.2 删除数据的语法3.3 修改数据的语法4. 结语1. 文件创建 首先,我们需要在预先设置的路径下新建Excel工作簿。…

企业微信小程序_小程序开发工具及真机调试_host配置及代理

文章目录一、开发前准备1. 开发文档2. 工具安装3. 安装插件4. 调整编译模式5. 选择企业6. PC 调试前端7. PC 调试后端二、甄姬调试前端2.1. 预览小程序2.2. 手机企微扫码2.3. 手机企微调试2.4. 多场景调试2.5. 手机企微调试前后端一、开发前准备 1. 开发文档 小程序开发文档&…

别再盲目学Python了!

如果你想问最近这些年什么编程语言最值得学习,我会毫不犹豫的告诉你是Python。无论是刚入门的程序员,还是年薪BATJ的技术大牛,都无可否认现在Python对于一个程序员职业发展的重要性。所以不仅是开发小白,甚至很多开发老手&#xf…

VBA 网页提取特定内容 - 网抓实践总结

目录 前言1. 常用代码和自定义函数1.1 文本 to 剪贴板1.2 获取网页主体源代码1.2.1 方法一:`InternetExplorer.Application`1.2.2 方法二:`MSXML2.XMLHTTP`1.2.3 方法三:`Msxml2.ServerXMLHTTP`1.2.4 方法四:WinHttp.WinHttpRequest.5.11.2.5 方法五:Microsoft.XMLHTTP1.3…

企业微信_Windows版本调试

文章目录1. 调试文档2. 下载插件3. 插件放置4. 开启调试模式5. 效果图6. 关闭调试模式1. 调试文档 客户端调试文档: https://developer.work.weixin.qq.com/document/path/95384 2. 下载插件 3. 插件放置 把 devtools_resources.pak 放到企业微信的安装目录下&am…

如果千百年前有视觉AI算法,世界将会是什么样的光景呢?

视觉AI算法在近些年取得了一定的突破,被应用在了越来越多的地方,我相信距离真正的AI普及这个大目标也越来越近了。我时常在想假如古代也有视觉AI算法,那是不是很多故事的结局都将被改写?《伯乐相马》、《皇帝批红》、《木兰从军》…

困境实现飞跃,梦想照进现实《安防视频监控数据存储蓝皮书》发布

前言 近年来,随着云计算、5G、AI 技术的不断兴起与发展,安防行业正在发生数字化转型,作为安防行业重要的数据采集与管理中枢,视频监控设备在数量上不断增加,在科技强有力的支撑之下,庞大的图片、视频数据组…

企业微信小程序_获取准确定位的方法及解决定位不准确的问题

文章目录一、经验分享1. 微信api现状2. 解决方案3. 适用场景二、小程序集成腾讯定位服务2.1. 注册腾讯开发者2.2. 创建应用2.3. 添加key2.4. 下载sdk2.5. 合法域名三、开发实战3.1. sdk拷贝3.2. 页面引用3.3. 页面部分3.4. 数据部分3.5. 方法部分四、真机调试4.1. 项目运行4.2.…

深度揭秘:腾讯存储技术发展史

采访嘉宾 | 腾讯云副总裁谢明等图源 | 视觉中国来源 | CSDN(ID:CSDNnews)在腾讯内部,负责腾讯存储技术研发的部门,一直被认为是生产技术专家的“黄埔军校”。腾讯不少技术方向的负责人,最早也都出自这个团队。这或许可…

常见字典用法集锦及代码详解

目录前言字典的简介1. 字典对象1.1 Add 方法1.2 Exists 方法1.3 Keys 方法1.4 Items 方法1.5 Remove 方法1.6 RemoveAll 方法2. 实例2.1 实例1. 普通常见的求不重复值问题2.1.1 问题2.1.2 实例代码2.1.3 代码详解2.2 实例2 求多表的不重复值问题2.2.1 问题2.2.2 代码2.2.3 代码…

企业微信小程序_集成腾讯地图实现精准定位考勤打卡

开源项目地址:https://gitee.com/gblfy/tx-position-check-in 关于微信小程序集成腾讯地图详情,可以参考:https://blog.csdn.net/weixin_40816738/article/details/122519497

18个PPT,29个提问解答,都在这儿啦!

4月25-26日,全球首个 Apache 顶级项目在线盛会 Flink Forward 中文精华版重磅开播,聚焦 Alibaba、 Google、AWS、Uber、Netflix、DellEMC、微博、滴滴等各大互联网公司实时计算的经典场景和业务故事,由 Flink 核心贡献者们对 19 个优质 talk …

CSDN公众号新功能上线,居然还能搜出小姐姐???(文末有福利)

为了给各位打工人更好的搜索体验CSDN总是在学习新技能这次CSDN公众号又给大家带来了一项全新的搜索技能在CSDN旗下的公众号内回复消息就能自动回复想搜索的内容啦小编来给大家演示一下,在公众号内输入“mysql安装教程”,就能得到CSDN全站内关于mysql安装…

如何在SQL Server 2019中添加数据敏感度分类的命令

作者 | Jordan Sanders翻译 | 火火酱。责编 | 晋兆雨头图 | CSDN付费下载于视觉中国为了确保数据库安全性和完整性,数据库管理员日常需要运行多种操作。因此,无论在何种情况下,我们都不能忽视数据库中敏感数据的重要性。在本文中,…

支撑数千家天猫商家CRM业务,数云高弹性数据库如何做

“数据,已经渗透到当今每一个行业和业务职能领域,成为重要的生产因素。人们对于海量数据的挖掘和运用,预示着新一波生产率增长和消费者盈余浪潮的到来”。-----麦肯锡 基于互联网和大数据和时代背景,用户在互联网上留下更多的印记…